diff options
author | fragosti <francesco.agosti93@gmail.com> | 2018-06-20 01:19:38 +0800 |
---|---|---|
committer | fragosti <francesco.agosti93@gmail.com> | 2018-06-20 01:19:38 +0800 |
commit | 7454e16aae476b3908123dadab0cf9fdf6ab5990 (patch) | |
tree | 3477ace66bc71c2aa4e09b85dd1923087effac1b /packages | |
parent | 2cc7289b7b3c3177230957ff2384c58bed4266f3 (diff) | |
parent | e4acad60e91943c2dcbdd55b7766b543e78df6f6 (diff) | |
download | dexon-sol-tools-7454e16aae476b3908123dadab0cf9fdf6ab5990.tar dexon-sol-tools-7454e16aae476b3908123dadab0cf9fdf6ab5990.tar.gz dexon-sol-tools-7454e16aae476b3908123dadab0cf9fdf6ab5990.tar.bz2 dexon-sol-tools-7454e16aae476b3908123dadab0cf9fdf6ab5990.tar.lz dexon-sol-tools-7454e16aae476b3908123dadab0cf9fdf6ab5990.tar.xz dexon-sol-tools-7454e16aae476b3908123dadab0cf9fdf6ab5990.tar.zst dexon-sol-tools-7454e16aae476b3908123dadab0cf9fdf6ab5990.zip |
Merge branch 'v2-prototype' of https://github.com/0xProject/0x-monorepo into feature/website/portal-v2-analytics
Diffstat (limited to 'packages')
165 files changed, 3083 insertions, 936 deletions
diff --git a/packages/0x.js/CHANGELOG.json b/packages/0x.js/CHANGELOG.json index 2a219180d..04439921e 100644 --- a/packages/0x.js/CHANGELOG.json +++ b/packages/0x.js/CHANGELOG.json @@ -1,5 +1,41 @@ [ { + "timestamp": 1529397769, + "version": "0.38.4", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1527617805, + "version": "0.38.3", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1527617227, + "version": "0.38.2", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1527616612, + "version": "0.38.1", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { "version": "0.38.0", "changes": [ { diff --git a/packages/0x.js/CHANGELOG.md b/packages/0x.js/CHANGELOG.md index f7ceaa552..3c7c76662 100644 --- a/packages/0x.js/CHANGELOG.md +++ b/packages/0x.js/CHANGELOG.md @@ -5,12 +5,28 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.38.4 - _June 19, 2018_ + + * Dependencies updated + +## v0.38.3 - _May 29, 2018_ + + * Dependencies updated + +## v0.38.2 - _May 29, 2018_ + + * Dependencies updated + +## v0.38.1 - _May 29, 2018_ + + * Dependencies updated + ## v0.38.0 - _May 22, 2018_ * Renamed createOrderStateWatcher to createOrderWatcherAsync since it is now async (#579) * Renamed ZeroExError to ContractWrappersErrors since they now lives in the @0xproject/contract-wrappers subpackage (#579) -## v0.37.2 - _May 4, 2018_ +## v0.37.2 - _May 5, 2018_ * Dependencies updated diff --git a/packages/0x.js/package.json b/packages/0x.js/package.json index 3df2a0e06..2aeb1ddf2 100644 --- a/packages/0x.js/package.json +++ b/packages/0x.js/package.json @@ -1,6 +1,6 @@ { "name": "0x.js", - "version": "0.38.0", + "version": "0.38.4", "engines": { "node": ">=6.12" }, @@ -69,12 +69,12 @@ }, "license": "Apache-2.0", "devDependencies": { - "@0xproject/abi-gen": "^0.3.0", - "@0xproject/dev-utils": "^0.4.2", - "@0xproject/migrations": "^0.0.6", - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/sol-compiler": "^0.5.0", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/abi-gen": "^0.3.2", + "@0xproject/dev-utils": "^0.4.4", + "@0xproject/migrations": "^0.0.8", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/sol-compiler": "^0.5.2", + "@0xproject/tslint-config": "^0.4.20", "@types/lodash": "4.14.104", "@types/mocha": "^2.2.42", "@types/node": "^8.0.53", @@ -100,18 +100,18 @@ "webpack": "^3.1.0" }, "dependencies": { - "@0xproject/assert": "^0.2.10", - "@0xproject/base-contract": "^0.3.2", - "@0xproject/contract-wrappers": "^0.0.2", - "@0xproject/order-utils": "0.0.5", - "@0xproject/order-watcher": "^0.0.2", - "@0xproject/sol-compiler": "^0.5.0", - "@0xproject/types": "0.7.0", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", - "@0xproject/web3-wrapper": "^0.6.4", + "@0xproject/assert": "^0.2.12", + "@0xproject/base-contract": "^0.3.4", + "@0xproject/contract-wrappers": "^0.0.5", + "@0xproject/order-utils": "^0.0.7", + "@0xproject/order-watcher": "^0.0.6", + "@0xproject/sol-compiler": "^0.5.2", + "@0xproject/types": "^0.8.1", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", + "@0xproject/web3-wrapper": "^0.7.1", "ethereum-types": "^0.0.1", - "ethers": "^3.0.15", + "ethers": "3.0.22", "lodash": "^4.17.4" }, "publishConfig": { diff --git a/packages/0x.js/src/index.ts b/packages/0x.js/src/index.ts index c79dbdb77..5c7ad6e1c 100644 --- a/packages/0x.js/src/index.ts +++ b/packages/0x.js/src/index.ts @@ -19,6 +19,8 @@ export { TransactionReceiptWithDecodedLogs, } from '@0xproject/types'; +export { OrderWatcherConfig } from '@0xproject/order-watcher'; + export { EventCallback, ContractEvent, diff --git a/packages/abi-gen/CHANGELOG.json b/packages/abi-gen/CHANGELOG.json index 71cbaac1e..438b25649 100644 --- a/packages/abi-gen/CHANGELOG.json +++ b/packages/abi-gen/CHANGELOG.json @@ -1,5 +1,23 @@ [ { + "timestamp": 1529397769, + "version": "0.3.2", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "version": "0.3.1", + "changes": [ + { + "note": "Incorrect publish that was unpublished" + } + ], + "timestamp": 1527810075 + }, + { "version": "0.3.0", "changes": [ { diff --git a/packages/abi-gen/CHANGELOG.md b/packages/abi-gen/CHANGELOG.md index bcd807a3c..5167af522 100644 --- a/packages/abi-gen/CHANGELOG.md +++ b/packages/abi-gen/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.3.2 - _June 19, 2018_ + + * Dependencies updated + +## v0.3.1 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.3.0 - _May 22, 2018_ * Properly export the executable binary (#588) -## v0.2.13 - _May 4, 2018_ +## v0.2.13 - _May 5, 2018_ * Dependencies updated diff --git a/packages/abi-gen/package.json b/packages/abi-gen/package.json index 19977fc86..9d3c6d00d 100644 --- a/packages/abi-gen/package.json +++ b/packages/abi-gen/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/abi-gen", - "version": "0.3.0", + "version": "0.3.2", "engines": { "node": ">=6.12" }, @@ -27,8 +27,8 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/abi-gen/README.md", "dependencies": { - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", "ethereum-types": "^0.0.1", "chalk": "^2.3.0", "glob": "^7.1.2", @@ -39,8 +39,8 @@ "yargs": "^10.0.3" }, "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "@types/glob": "^5.0.33", "@types/handlebars": "^4.0.36", "@types/mkdirp": "^0.5.1", diff --git a/packages/assert/CHANGELOG.json b/packages/assert/CHANGELOG.json index 048763732..883d55f5b 100644 --- a/packages/assert/CHANGELOG.json +++ b/packages/assert/CHANGELOG.json @@ -1,5 +1,23 @@ [ { + "timestamp": 1529397769, + "version": "0.2.12", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "version": "0.2.11", + "changes": [ + { + "note": "Incorrect publish that was unpublished" + } + ], + "timestamp": 1527810075 + }, + { "timestamp": 1527008270, "version": "0.2.10", "changes": [ diff --git a/packages/assert/CHANGELOG.md b/packages/assert/CHANGELOG.md index 974ac5c42..98a83e81b 100644 --- a/packages/assert/CHANGELOG.md +++ b/packages/assert/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.2.12 - _June 19, 2018_ + + * Dependencies updated + +## v0.2.11 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.2.10 - _May 22, 2018_ * Dependencies updated -## v0.2.9 - _May 4, 2018_ +## v0.2.9 - _May 5, 2018_ * Dependencies updated diff --git a/packages/assert/package.json b/packages/assert/package.json index e9e3bec32..16e8849a7 100644 --- a/packages/assert/package.json +++ b/packages/assert/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/assert", - "version": "0.2.10", + "version": "0.2.12", "engines": { "node": ">=6.12" }, @@ -31,8 +31,8 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/assert/README.md", "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "@types/lodash": "4.14.104", "@types/mocha": "^2.2.42", "@types/valid-url": "^1.0.2", @@ -48,9 +48,9 @@ "typescript": "2.7.1" }, "dependencies": { - "@0xproject/json-schemas": "0.7.22", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", + "@0xproject/json-schemas": "0.8.1", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", "lodash": "^4.17.4", "valid-url": "^1.0.9" }, diff --git a/packages/base-contract/CHANGELOG.json b/packages/base-contract/CHANGELOG.json index 04029576c..e5788b867 100644 --- a/packages/base-contract/CHANGELOG.json +++ b/packages/base-contract/CHANGELOG.json @@ -1,5 +1,24 @@ [ { + "version": "0.3.4", + "changes": [ + { + "note": + "Update EthersJs to fix the `value.toLowerCase()` is not a function bug caused by `ethers.js` breaking patch version https://github.com/ethers-io/ethers.js/issues/201" + } + ], + "timestamp": 1529397769 + }, + { + "timestamp": 1527810075, + "version": "0.3.3", + "changes": [ + { + "note": "Incorrect publish that was unpublished" + } + ] + }, + { "timestamp": 1527008270, "version": "0.3.2", "changes": [ diff --git a/packages/base-contract/CHANGELOG.md b/packages/base-contract/CHANGELOG.md index 90ad066b5..a37a08584 100644 --- a/packages/base-contract/CHANGELOG.md +++ b/packages/base-contract/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.3.4 - _June 19, 2018_ + + * Update EthersJs to fix the `value.toLowerCase()` is not a function bug caused by `ethers.js` breaking patch version https://github.com/ethers-io/ethers.js/issues/201 + +## v0.3.3 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.3.2 - _May 22, 2018_ * Dependencies updated -## v0.3.1 - _May 4, 2018_ +## v0.3.1 - _May 5, 2018_ * Dependencies updated diff --git a/packages/base-contract/package.json b/packages/base-contract/package.json index 595bca3a9..02825bb79 100644 --- a/packages/base-contract/package.json +++ b/packages/base-contract/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/base-contract", - "version": "0.3.2", + "version": "0.3.4", "engines": { "node": ">=6.12" }, @@ -30,8 +30,8 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/base-contract/README.md", "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "@types/lodash": "4.14.104", "chai": "^4.0.1", "copyfiles": "^1.2.0", @@ -44,10 +44,10 @@ }, "dependencies": { "ethereum-types": "^0.0.1", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", - "@0xproject/web3-wrapper": "^0.6.4", - "ethers": "^3.0.15", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", + "@0xproject/web3-wrapper": "^0.7.1", + "ethers": "3.0.22", "lodash": "^4.17.4" }, "publishConfig": { diff --git a/packages/connect/CHANGELOG.json b/packages/connect/CHANGELOG.json index 58fcc635b..9bbb107cb 100644 --- a/packages/connect/CHANGELOG.json +++ b/packages/connect/CHANGELOG.json @@ -1,5 +1,23 @@ [ { + "timestamp": 1529397769, + "version": "0.6.15", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1527616612, + "version": "0.6.14", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { "timestamp": 1527008270, "version": "0.6.13", "changes": [ diff --git a/packages/connect/CHANGELOG.md b/packages/connect/CHANGELOG.md index acc6f33bd..1c44c2a60 100644 --- a/packages/connect/CHANGELOG.md +++ b/packages/connect/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.6.15 - _June 19, 2018_ + + * Dependencies updated + +## v0.6.14 - _May 29, 2018_ + + * Dependencies updated + ## v0.6.13 - _May 22, 2018_ * Dependencies updated -## v0.6.12 - _May 4, 2018_ +## v0.6.12 - _May 5, 2018_ * Dependencies updated diff --git a/packages/connect/package.json b/packages/connect/package.json index 6b5a5a7b0..86f7aeca2 100644 --- a/packages/connect/package.json +++ b/packages/connect/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/connect", - "version": "0.6.13", + "version": "0.6.15", "engines": { "node": ">=6.12" }, @@ -51,19 +51,19 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/connect/README.md", "dependencies": { - "@0xproject/assert": "^0.2.10", - "@0xproject/json-schemas": "0.7.22", - "@0xproject/types": "^0.7.0", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", + "@0xproject/assert": "^0.2.12", + "@0xproject/json-schemas": "0.8.1", + "@0xproject/types": "^0.8.1", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", "isomorphic-fetch": "^2.2.1", "lodash": "^4.17.4", "query-string": "^5.0.1", "websocket": "^1.0.25" }, "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "@types/fetch-mock": "^5.12.1", "@types/lodash": "4.14.104", "@types/mocha": "^2.2.42", diff --git a/packages/contract-wrappers/CHANGELOG.json b/packages/contract-wrappers/CHANGELOG.json index 84e773933..33d9bc4c0 100644 --- a/packages/contract-wrappers/CHANGELOG.json +++ b/packages/contract-wrappers/CHANGELOG.json @@ -1,5 +1,23 @@ [ { + "timestamp": 1529397769, + "version": "0.0.5", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1527617227, + "version": "0.0.4", + "changes": [ + { + "note": "Expose 'abi' ContractAbi property on all contract wrappers" + } + ] + }, + { "version": "0.0.2", "changes": [ { diff --git a/packages/contract-wrappers/CHANGELOG.md b/packages/contract-wrappers/CHANGELOG.md index c8a0145d5..3f8eb921c 100644 --- a/packages/contract-wrappers/CHANGELOG.md +++ b/packages/contract-wrappers/CHANGELOG.md @@ -5,6 +5,18 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.0.5 - _June 19, 2018_ + + * Dependencies updated + +## v0.0.4 - _May 29, 2018_ + + * Dependencies updated + +## v0.0.3 - _May 29, 2018_ + + * Dependencies updated + ## v0.0.2 - _May 22, 2018_ * Dependencies updated diff --git a/packages/contract-wrappers/package.json b/packages/contract-wrappers/package.json index d5d4bfbc8..cd4b25957 100644 --- a/packages/contract-wrappers/package.json +++ b/packages/contract-wrappers/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/contract-wrappers", - "version": "0.0.2", + "version": "0.0.5", "description": "Smart TS wrappers for 0x smart contracts", "keywords": [ "0xproject", @@ -46,13 +46,13 @@ "node": ">=6.0.0" }, "devDependencies": { - "@0xproject/abi-gen": "^0.3.0", - "@0xproject/dev-utils": "^0.4.2", - "@0xproject/migrations": "^0.0.6", - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/sol-compiler": "^0.5.0", - "@0xproject/subproviders": "^0.10.2", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/abi-gen": "^0.3.2", + "@0xproject/dev-utils": "^0.4.4", + "@0xproject/migrations": "^0.0.8", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/sol-compiler": "^0.5.2", + "@0xproject/subproviders": "^0.10.4", + "@0xproject/tslint-config": "^0.4.20", "@types/lodash": "4.14.104", "@types/mocha": "^2.2.42", "@types/node": "^8.0.53", @@ -77,19 +77,19 @@ "web3-provider-engine": "^14.0.4" }, "dependencies": { - "@0xproject/assert": "^0.2.10", - "@0xproject/base-contract": "^0.3.2", - "@0xproject/fill-scenarios": "^0.0.2", - "@0xproject/json-schemas": "0.7.22", - "@0xproject/order-utils": "0.0.5", - "@0xproject/types": "0.7.0", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", - "@0xproject/web3-wrapper": "^0.6.4", + "@0xproject/assert": "^0.2.12", + "@0xproject/base-contract": "^0.3.4", + "@0xproject/fill-scenarios": "^0.0.4", + "@0xproject/json-schemas": "0.8.1", + "@0xproject/order-utils": "^0.0.7", + "@0xproject/types": "^0.8.1", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", + "@0xproject/web3-wrapper": "^0.7.1", "ethereum-types": "^0.0.1", "ethereumjs-blockstream": "^2.0.6", "ethereumjs-util": "^5.1.1", - "ethers": "^3.0.15", + "ethers": "3.0.22", "js-sha3": "^0.7.0", "lodash": "^4.17.4", "uuid": "^3.1.0" diff --git a/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts index e646bae78..04f69bc3d 100644 --- a/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts @@ -35,7 +35,8 @@ const CONTRACT_NAME_TO_NOT_FOUND_ERROR: { Exchange: ContractWrappersError.ExchangeContractDoesNotExist, }; -export class ContractWrapper { +export abstract class ContractWrapper { + public abstract abi: ContractAbi; protected _web3Wrapper: Web3Wrapper; protected _networkId: number; private _blockAndLogStreamerIfExists?: BlockAndLogStreamer; diff --git a/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts index 713d4d3f6..36b7a234a 100644 --- a/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts @@ -1,5 +1,5 @@ import { schemas } from '@0xproject/json-schemas'; -import { LogWithDecodedArgs } from '@0xproject/types'; +import { ContractAbi, LogWithDecodedArgs } from '@0xproject/types'; import { BigNumber } from '@0xproject/utils'; import { Web3Wrapper } from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; @@ -17,6 +17,7 @@ import { TokenWrapper } from './token_wrapper'; * The caller can convert ETH into the equivalent number of wrapped ETH ERC20 tokens and back. */ export class EtherTokenWrapper extends ContractWrapper { + public abi: ContractAbi = artifacts.EtherToken.abi; private _etherTokenContractsByAddress: { [address: string]: EtherTokenContract; } = {}; diff --git a/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts index 430ce9c5e..8548a06b6 100644 --- a/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts @@ -2,6 +2,7 @@ import { schemas } from '@0xproject/json-schemas'; import { formatters, getOrderHashHex, OrderStateUtils } from '@0xproject/order-utils'; import { BlockParamLiteral, + ContractAbi, DecodedLogArgs, ECSignature, ExchangeContractErrs, @@ -54,6 +55,7 @@ interface ExchangeContractErrCodesToMsgs { * events of the 0x Exchange smart contract. */ export class ExchangeWrapper extends ContractWrapper { + public abi: ContractAbi = artifacts.Exchange.abi; private _exchangeContractIfExists?: ExchangeContract; private _orderValidationUtilsIfExists?: OrderValidationUtils; private _tokenWrapper: TokenWrapper; diff --git a/packages/contract-wrappers/src/contract_wrappers/token_registry_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/token_registry_wrapper.ts index fb9396281..7b558ed69 100644 --- a/packages/contract-wrappers/src/contract_wrappers/token_registry_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/token_registry_wrapper.ts @@ -1,4 +1,4 @@ -import { Token } from '@0xproject/types'; +import { ContractAbi, Token } from '@0xproject/types'; import { Web3Wrapper } from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; @@ -14,6 +14,7 @@ import { TokenRegistryContract } from './generated/token_registry'; * This class includes all the functionality related to interacting with the 0x Token Registry smart contract. */ export class TokenRegistryWrapper extends ContractWrapper { + public abi: ContractAbi = artifacts.TokenRegistry.abi; private _tokenRegistryContractIfExists?: TokenRegistryContract; private _contractAddressIfExists?: string; private static _createTokenFromMetadata(metadata: TokenMetadata): Token | undefined { diff --git a/packages/contract-wrappers/src/contract_wrappers/token_transfer_proxy_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/token_transfer_proxy_wrapper.ts index 2fe3e6620..5194931d7 100644 --- a/packages/contract-wrappers/src/contract_wrappers/token_transfer_proxy_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/token_transfer_proxy_wrapper.ts @@ -1,4 +1,5 @@ import { Web3Wrapper } from '@0xproject/web3-wrapper'; +import { ContractAbi } from '@0xproject/types'; import * as _ from 'lodash'; import { artifacts } from '../artifacts'; @@ -11,6 +12,7 @@ import { TokenTransferProxyContract } from './generated/token_transfer_proxy'; * This class includes the functionality related to interacting with the TokenTransferProxy contract. */ export class TokenTransferProxyWrapper extends ContractWrapper { + public abi: ContractAbi = artifacts.TokenTransferProxy.abi; private _tokenTransferProxyContractIfExists?: TokenTransferProxyContract; private _contractAddressIfExists?: string; constructor(web3Wrapper: Web3Wrapper, networkId: number, contractAddressIfExists?: string) { diff --git a/packages/contract-wrappers/src/contract_wrappers/token_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/token_wrapper.ts index 7c7907fd2..d9364715f 100644 --- a/packages/contract-wrappers/src/contract_wrappers/token_wrapper.ts +++ b/packages/contract-wrappers/src/contract_wrappers/token_wrapper.ts @@ -1,5 +1,5 @@ import { schemas } from '@0xproject/json-schemas'; -import { LogWithDecodedArgs } from '@0xproject/types'; +import { ContractAbi, LogWithDecodedArgs } from '@0xproject/types'; import { BigNumber } from '@0xproject/utils'; import { Web3Wrapper } from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; @@ -26,6 +26,7 @@ import { TokenTransferProxyWrapper } from './token_transfer_proxy_wrapper'; * to the 0x Proxy smart contract. */ export class TokenWrapper extends ContractWrapper { + public abi: ContractAbi = artifacts.Token.abi; public UNLIMITED_ALLOWANCE_IN_BASE_UNITS = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS; private _tokenContractsByAddress: { [address: string]: TokenContract }; private _tokenTransferProxyWrapper: TokenTransferProxyWrapper; diff --git a/packages/contract_templates/README.md b/packages/contract_templates/README.md new file mode 100644 index 000000000..e5f4b09d1 --- /dev/null +++ b/packages/contract_templates/README.md @@ -0,0 +1,17 @@ +These templates are used with [abi-gen](https://github.com/0xProject/0x-monorepo/tree/development/packages/abi-gen). + +To successfully compile the generated TypeScript contract wrappers, you must: + +* Install the packages on which the main contract template directly depends: `yarn add @0xproject/base-contract @0xproject/sol-compiler @0xproject/utils @0xproject/web3-wrapper ethereum-types ethers lodash` +* Install the packages on which the main contract template *in*directly depends: `yarn add @types/lodash` +* Ensure that your TypeScript configuration includes the following: + +``` +"compilerOptions": { + "lib": ["ES2015"], + "typeRoots": [ + "node_modules/@0xproject/typescript-typings/types", + "node_modules/@types" + ] +} +``` diff --git a/packages/contract_templates/contract.handlebars b/packages/contract_templates/contract.handlebars index 431359109..997088c8f 100644 --- a/packages/contract_templates/contract.handlebars +++ b/packages/contract_templates/contract.handlebars @@ -1,7 +1,3 @@ -/** - * This file is auto-generated using abi-gen. Don't edit directly. - * Templates can be found at https://github.com/0xProject/0x-monorepo/tree/development/packages/contract_templates. - */ // tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma whitespace // tslint:disable:no-unused-variable import { BaseContract } from '@0xproject/base-contract'; diff --git a/packages/contract_templates/partials/params.handlebars b/packages/contract_templates/partials/params.handlebars index ac5d4ae85..2d9bb8ed9 100644 --- a/packages/contract_templates/partials/params.handlebars +++ b/packages/contract_templates/partials/params.handlebars @@ -1,3 +1,3 @@ {{#each inputs}} -{{name}}, +{{name}}{{#if @last}}{{else}},{{/if}} {{/each}} diff --git a/packages/contracts/package.json b/packages/contracts/package.json index d6ca3727b..8807c727e 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "contracts", - "version": "2.1.29", + "version": "2.1.33", "engines": { "node": ">=6.12" }, @@ -19,6 +19,7 @@ "rebuild_and_test": "run-s build test", "test:coverage": "SOLIDITY_COVERAGE=true run-s build run_mocha coverage:report:text coverage:report:lcov", "test:profiler": "SOLIDITY_PROFILER=true run-s build run_mocha profiler:report:html", + "test:trace": "SOLIDITY_REVERT_TRACE=true run-s build run_mocha", "run_mocha": "mocha --require source-map-support/register 'lib/test/**/*.js' --timeout 100000 --bail --exit", "compile": "sol-compiler", "clean": "shx rm -rf lib src/generated_contract_wrappers", @@ -45,11 +46,11 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/contracts/README.md", "devDependencies": { - "@0xproject/abi-gen": "^0.3.0", - "@0xproject/dev-utils": "^0.4.2", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/abi-gen": "^0.3.2", + "@0xproject/dev-utils": "^0.4.4", + "@0xproject/tslint-config": "^0.4.20", "@0xproject/subproviders": "^0.10.1", - "@0xproject/sol-cov": "^0.0.11", + "@0xproject/sol-cov": "^0.1.1", "@types/lodash": "4.14.104", "@types/bn.js": "^4.11.0", "@types/node": "^8.0.53", @@ -70,18 +71,18 @@ "yargs": "^10.0.3" }, "dependencies": { - "@0xproject/base-contract": "^0.3.2", - "@0xproject/order-utils": "^0.0.6", - "@0xproject/sol-compiler": "^0.5.0", + "@0xproject/base-contract": "^0.3.4", + "@0xproject/order-utils": "^1.0.0", + "@0xproject/sol-compiler": "^0.5.2", "@0xproject/types": "^1.0.0", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", - "@0xproject/web3-wrapper": "^0.6.4", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", + "@0xproject/web3-wrapper": "^0.7.1", "ethereum-types": "^0.0.1", "bn.js": "^4.11.8", "ethereumjs-abi": "^0.6.4", "ethereumjs-util": "^5.1.1", - "ethers": "^3.0.15", + "ethers": "3.0.22", "lodash": "^4.17.4", "web3": "^0.20.0" } diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol b/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol index ddcd78e93..7ca823d1f 100644 --- a/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol +++ b/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC20Proxy.sol @@ -22,41 +22,16 @@ pragma experimental ABIEncoderV2; import "../../utils/LibBytes/LibBytes.sol"; import "./MixinAssetProxy.sol"; import "./MixinAuthorizable.sol"; -import "../../tokens/ERC20Token/IERC20Token.sol"; +import "./MixinERC20Transfer.sol"; contract ERC20Proxy is - LibBytes, MixinAssetProxy, - MixinAuthorizable + MixinAuthorizable, + MixinERC20Transfer { - // Id of this proxy. uint8 constant PROXY_ID = 1; - /// @dev Internal version of `transferFrom`. - /// @param assetData Encoded byte array. - /// @param from Address to transfer asset from. - /// @param to Address to transfer asset to. - /// @param amount Amount of asset to transfer. - function transferFromInternal( - bytes memory assetData, - address from, - address to, - uint256 amount - ) - internal - { - // Decode asset data. - address token = readAddress(assetData, 0); - - // Transfer tokens. - bool success = IERC20Token(token).transferFrom(from, to, amount); - require( - success, - TRANSFER_FAILED - ); - } - /// @dev Gets the proxy id associated with the proxy address. /// @return Proxy id. function getProxyId() diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC721Proxy.sol b/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC721Proxy.sol index 861fac2c1..7ff25aea3 100644 --- a/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC721Proxy.sol +++ b/packages/contracts/src/contracts/current/protocol/AssetProxy/ERC721Proxy.sol @@ -22,52 +22,16 @@ pragma experimental ABIEncoderV2; import "../../utils/LibBytes/LibBytes.sol"; import "./MixinAssetProxy.sol"; import "./MixinAuthorizable.sol"; -import "../../tokens/ERC721Token/ERC721Token.sol"; +import "./MixinERC721Transfer.sol"; contract ERC721Proxy is - LibBytes, MixinAssetProxy, - MixinAuthorizable + MixinAuthorizable, + MixinERC721Transfer { - // Id of this proxy. uint8 constant PROXY_ID = 2; - /// @dev Internal version of `transferFrom`. - /// @param assetData Encoded byte array. - /// @param from Address to transfer asset from. - /// @param to Address to transfer asset to. - /// @param amount Amount of asset to transfer. - function transferFromInternal( - bytes memory assetData, - address from, - address to, - uint256 amount - ) - internal - { - // There exists only 1 of each token. - require( - amount == 1, - INVALID_AMOUNT - ); - - // Decode asset data. - ( - address token, - uint256 tokenId, - bytes memory receiverData - ) = decodeERC721AssetData(assetData); - - // Transfer token. Saves gas by calling safeTransferFrom only - // when there is receiverData present. Either succeeds or throws. - if (receiverData.length > 0) { - ERC721Token(token).safeTransferFrom(from, to, tokenId, receiverData); - } else { - ERC721Token(token).transferFrom(from, to, tokenId); - } - } - /// @dev Gets the proxy id associated with the proxy address. /// @return Proxy id. function getProxyId() @@ -77,34 +41,4 @@ contract ERC721Proxy is { return PROXY_ID; } - - /// @dev Decodes ERC721 Asset data. - /// @param assetData Encoded byte array. - /// @return proxyId Intended ERC721 proxy id. - /// @return token ERC721 token address. - /// @return tokenId ERC721 token id. - /// @return receiverData Additional data with no specific format, which - /// is passed to the receiving contract's onERC721Received. - function decodeERC721AssetData(bytes memory assetData) - internal - pure - returns ( - address token, - uint256 tokenId, - bytes memory receiverData - ) - { - // Decode asset data. - token = readAddress(assetData, 0); - tokenId = readUint256(assetData, 20); - if (assetData.length > 52) { - receiverData = readBytes(assetData, 52); - } - - return ( - token, - tokenId, - receiverData - ); - } } diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxy/MixinERC20Transfer.sol b/packages/contracts/src/contracts/current/protocol/AssetProxy/MixinERC20Transfer.sol new file mode 100644 index 000000000..4af39a00b --- /dev/null +++ b/packages/contracts/src/contracts/current/protocol/AssetProxy/MixinERC20Transfer.sol @@ -0,0 +1,81 @@ +/* + + Copyright 2018 ZeroEx Intl. + + 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. + +*/ + +pragma solidity ^0.4.24; +pragma experimental ABIEncoderV2; + +import "../../utils/LibBytes/LibBytes.sol"; +import "../../tokens/ERC20Token/IERC20Token.sol"; +import "./libs/LibTransferErrors.sol"; + +contract MixinERC20Transfer is + LibBytes, + LibTransferErrors +{ + /// @dev Internal version of `transferFrom`. + /// @param assetData Encoded byte array. + /// @param from Address to transfer asset from. + /// @param to Address to transfer asset to. + /// @param amount Amount of asset to transfer. + function transferFromInternal( + bytes memory assetData, + address from, + address to, + uint256 amount + ) + internal + { + // Decode asset data. + address token = readAddress(assetData, 0); + + // Transfer tokens. + // We do a raw call so we can check the success separate + // from the return data. + bool success = token.call(abi.encodeWithSelector( + IERC20Token(token).transferFrom.selector, + from, + to, + amount + )); + require( + success, + TRANSFER_FAILED + ); + + // Check return data. + // If there is no return data, we assume the token incorrectly + // does not return a bool. In this case we expect it to revert + // on failure, which was handled above. + // If the token does return data, we require that it is a single + // value that evaluates to true. + assembly { + if returndatasize { + success := 0 + if eq(returndatasize, 32) { + // First 64 bytes of memory are reserved scratch space + returndatacopy(0, 0, 32) + success := mload(0) + } + } + } + require( + success, + TRANSFER_FAILED + ); + } +} diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxy/MixinERC721Transfer.sol b/packages/contracts/src/contracts/current/protocol/AssetProxy/MixinERC721Transfer.sol new file mode 100644 index 000000000..d09aba599 --- /dev/null +++ b/packages/contracts/src/contracts/current/protocol/AssetProxy/MixinERC721Transfer.sol @@ -0,0 +1,94 @@ +/* + + Copyright 2018 ZeroEx Intl. + + 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. + +*/ + +pragma solidity ^0.4.24; +pragma experimental ABIEncoderV2; + +import "../../utils/LibBytes/LibBytes.sol"; +import "../../tokens/ERC721Token/ERC721Token.sol"; +import "./libs/LibTransferErrors.sol"; + +contract MixinERC721Transfer is + LibBytes, + LibTransferErrors +{ + /// @dev Internal version of `transferFrom`. + /// @param assetData Encoded byte array. + /// @param from Address to transfer asset from. + /// @param to Address to transfer asset to. + /// @param amount Amount of asset to transfer. + function transferFromInternal( + bytes memory assetData, + address from, + address to, + uint256 amount + ) + internal + { + // There exists only 1 of each token. + require( + amount == 1, + INVALID_AMOUNT + ); + + // Decode asset data. + ( + address token, + uint256 tokenId, + bytes memory receiverData + ) = decodeERC721AssetData(assetData); + + // Transfer token. Saves gas by calling safeTransferFrom only + // when there is receiverData present. Either succeeds or throws. + if (receiverData.length > 0) { + ERC721Token(token).safeTransferFrom(from, to, tokenId, receiverData); + } else { + ERC721Token(token).transferFrom(from, to, tokenId); + } + } + + /// @dev Decodes ERC721 Asset data. + /// @param assetData Encoded byte array. + /// @return proxyId Intended ERC721 proxy id. + /// @return token ERC721 token address. + /// @return tokenId ERC721 token id. + /// @return receiverData Additional data with no specific format, which + /// is passed to the receiving contract's onERC721Received. + function decodeERC721AssetData(bytes memory assetData) + internal + pure + returns ( + address token, + uint256 tokenId, + bytes memory receiverData + ) + { + // Decode asset data. + token = readAddress(assetData, 0); + tokenId = readUint256(assetData, 20); + if (assetData.length > 52) { + receiverData = readBytes(assetData, 52); + } + + return ( + token, + tokenId, + receiverData + ); + } +} diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxy/libs/LibAssetProxyErrors.sol b/packages/contracts/src/contracts/current/protocol/AssetProxy/libs/LibAssetProxyErrors.sol index 65bdacdb7..dca4f400f 100644 --- a/packages/contracts/src/contracts/current/protocol/AssetProxy/libs/LibAssetProxyErrors.sol +++ b/packages/contracts/src/contracts/current/protocol/AssetProxy/libs/LibAssetProxyErrors.sol @@ -25,8 +25,4 @@ contract LibAssetProxyErrors { string constant TARGET_ALREADY_AUTHORIZED = "TARGET_ALREADY_AUTHORIZED"; // Target address must not already be authorized. string constant INDEX_OUT_OF_BOUNDS = "INDEX_OUT_OF_BOUNDS"; // Specified array index is out of bounds. string constant AUTHORIZED_ADDRESS_MISMATCH = "AUTHORIZED_ADDRESS_MISMATCH"; // Address at index does not match given target address. - - /// AssetProxy errors /// - string constant INVALID_AMOUNT = "INVALID_AMOUNT"; // Transfer amount must equal 1. - string constant TRANSFER_FAILED = "TRANSFER_FAILED"; // Transfer failed. } diff --git a/packages/contracts/src/contracts/current/protocol/AssetProxy/libs/LibTransferErrors.sol b/packages/contracts/src/contracts/current/protocol/AssetProxy/libs/LibTransferErrors.sol new file mode 100644 index 000000000..ba784ab22 --- /dev/null +++ b/packages/contracts/src/contracts/current/protocol/AssetProxy/libs/LibTransferErrors.sol @@ -0,0 +1,25 @@ +/* + + Copyright 2018 ZeroEx Intl. + + 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. + +*/ + +pragma solidity ^0.4.24; + +contract LibTransferErrors { + /// Transfer errors /// + string constant INVALID_AMOUNT = "INVALID_AMOUNT"; // Transfer amount must equal 1. + string constant TRANSFER_FAILED = "TRANSFER_FAILED"; // Transfer failed. +} diff --git a/packages/contracts/src/contracts/current/protocol/Exchange/MixinSignatureValidator.sol b/packages/contracts/src/contracts/current/protocol/Exchange/MixinSignatureValidator.sol index 1a556dfe2..8ad15aaff 100644 --- a/packages/contracts/src/contracts/current/protocol/Exchange/MixinSignatureValidator.sol +++ b/packages/contracts/src/contracts/current/protocol/Exchange/MixinSignatureValidator.sol @@ -82,7 +82,7 @@ contract MixinSignatureValidator is address signer, bytes memory signature ) - internal + public view returns (bool isValid) { diff --git a/packages/contracts/src/contracts/current/protocol/Exchange/MixinWrapperFunctions.sol b/packages/contracts/src/contracts/current/protocol/Exchange/MixinWrapperFunctions.sol index a7849f4cb..724f95518 100644 --- a/packages/contracts/src/contracts/current/protocol/Exchange/MixinWrapperFunctions.sol +++ b/packages/contracts/src/contracts/current/protocol/Exchange/MixinWrapperFunctions.sol @@ -263,40 +263,50 @@ contract MixinWrapperFunctions is /// @param orders Array of order specifications. /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders. /// @param signatures Proofs that orders have been created by makers. + /// @return Amounts filled and fees paid by makers and taker. + /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets. function batchFillOrders( LibOrder.Order[] memory orders, uint256[] memory takerAssetFillAmounts, bytes[] memory signatures ) public + returns (FillResults memory totalFillResults) { for (uint256 i = 0; i < orders.length; i++) { - fillOrder( + FillResults memory singleFillResults = fillOrder( orders[i], takerAssetFillAmounts[i], signatures[i] ); + addFillResults(totalFillResults, singleFillResults); } + return totalFillResults; } /// @dev Synchronously executes multiple calls of fillOrKill. /// @param orders Array of order specifications. /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders. /// @param signatures Proofs that orders have been created by makers. + /// @return Amounts filled and fees paid by makers and taker. + /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets. function batchFillOrKillOrders( LibOrder.Order[] memory orders, uint256[] memory takerAssetFillAmounts, bytes[] memory signatures ) public + returns (FillResults memory totalFillResults) { for (uint256 i = 0; i < orders.length; i++) { - fillOrKillOrder( + FillResults memory singleFillResults = fillOrKillOrder( orders[i], takerAssetFillAmounts[i], signatures[i] ); + addFillResults(totalFillResults, singleFillResults); } + return totalFillResults; } /// @dev Fills an order with specified parameters and ECDSA signature. @@ -304,20 +314,25 @@ contract MixinWrapperFunctions is /// @param orders Array of order specifications. /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders. /// @param signatures Proofs that orders have been created by makers. + /// @return Amounts filled and fees paid by makers and taker. + /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets. function batchFillOrdersNoThrow( LibOrder.Order[] memory orders, uint256[] memory takerAssetFillAmounts, bytes[] memory signatures ) public + returns (FillResults memory totalFillResults) { for (uint256 i = 0; i < orders.length; i++) { - fillOrderNoThrow( + FillResults memory singleFillResults = fillOrderNoThrow( orders[i], takerAssetFillAmounts[i], signatures[i] ); + addFillResults(totalFillResults, singleFillResults); } + return totalFillResults; } /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker. diff --git a/packages/contracts/src/contracts/current/protocol/Exchange/interfaces/ISignatureValidator.sol b/packages/contracts/src/contracts/current/protocol/Exchange/interfaces/ISignatureValidator.sol index 26e360c91..02aa9776e 100644 --- a/packages/contracts/src/contracts/current/protocol/Exchange/interfaces/ISignatureValidator.sol +++ b/packages/contracts/src/contracts/current/protocol/Exchange/interfaces/ISignatureValidator.sol @@ -39,4 +39,18 @@ contract ISignatureValidator { bool approval ) external; + + /// @dev Verifies that a signature is valid. + /// @param hash Message hash that is signed. + /// @param signer Address of signer. + /// @param signature Proof of signing. + /// @return Validity of order signature. + function isValidSignature( + bytes32 hash, + address signer, + bytes memory signature + ) + public + view + returns (bool isValid); } diff --git a/packages/contracts/src/contracts/current/protocol/Exchange/interfaces/IWrapperFunctions.sol b/packages/contracts/src/contracts/current/protocol/Exchange/interfaces/IWrapperFunctions.sol index acd4f359c..84bb683bc 100644 --- a/packages/contracts/src/contracts/current/protocol/Exchange/interfaces/IWrapperFunctions.sol +++ b/packages/contracts/src/contracts/current/protocol/Exchange/interfaces/IWrapperFunctions.sol @@ -22,10 +22,7 @@ pragma experimental ABIEncoderV2; import "../libs/LibOrder.sol"; import "../libs/LibFillResults.sol"; -contract IWrapperFunctions is - LibOrder, - LibFillResults -{ +contract IWrapperFunctions { /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled. /// @param order LibOrder.Order struct containing order specifications. /// @param takerAssetFillAmount Desired amount of takerAsset to sell. @@ -56,35 +53,41 @@ contract IWrapperFunctions is /// @param orders Array of order specifications. /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders. /// @param signatures Proofs that orders have been created by makers. + /// @return Amounts filled and fees paid by makers and taker. function batchFillOrders( LibOrder.Order[] memory orders, uint256[] memory takerAssetFillAmounts, bytes[] memory signatures ) - public; + public + returns (LibFillResults.FillResults memory totalFillResults); /// @dev Synchronously executes multiple calls of fillOrKill. /// @param orders Array of order specifications. /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders. /// @param signatures Proofs that orders have been created by makers. + /// @return Amounts filled and fees paid by makers and taker. function batchFillOrKillOrders( LibOrder.Order[] memory orders, uint256[] memory takerAssetFillAmounts, bytes[] memory signatures ) - public; + public + returns (LibFillResults.FillResults memory totalFillResults); /// @dev Fills an order with specified parameters and ECDSA signature. /// Returns false if the transaction would otherwise revert. /// @param orders Array of order specifications. /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders. /// @param signatures Proofs that orders have been created by makers. + /// @return Amounts filled and fees paid by makers and taker. function batchFillOrdersNoThrow( LibOrder.Order[] memory orders, uint256[] memory takerAssetFillAmounts, bytes[] memory signatures ) - public; + public + returns (LibFillResults.FillResults memory totalFillResults); /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker. /// @param orders Array of order specifications. diff --git a/packages/contracts/src/contracts/current/protocol/Exchange/mixins/MSignatureValidator.sol b/packages/contracts/src/contracts/current/protocol/Exchange/mixins/MSignatureValidator.sol index 7eed453ff..5e286e43a 100644 --- a/packages/contracts/src/contracts/current/protocol/Exchange/mixins/MSignatureValidator.sol +++ b/packages/contracts/src/contracts/current/protocol/Exchange/mixins/MSignatureValidator.sol @@ -35,18 +35,4 @@ contract MSignatureValidator is PreSigned, // 0x07 Trezor // 0x08 } - - /// @dev Verifies that a signature is valid. - /// @param hash Message hash that is signed. - /// @param signer Address of signer. - /// @param signature Proof of signing. - /// @return Validity of order signature. - function isValidSignature( - bytes32 hash, - address signer, - bytes memory signature - ) - internal - view - returns (bool isValid); } diff --git a/packages/contracts/src/contracts/current/utils/LibMem/LibMem.sol b/packages/contracts/src/contracts/current/utils/LibMem/LibMem.sol index 6afb9973a..97fb5fb0f 100644 --- a/packages/contracts/src/contracts/current/utils/LibMem/LibMem.sol +++ b/packages/contracts/src/contracts/current/utils/LibMem/LibMem.sol @@ -80,9 +80,6 @@ contract LibMem // if (source > dest) { assembly { - // Record the total number of full words to copy - let nWords := div(length, 32) - // We subtract 32 from `sEnd` and `dEnd` because it // is easier to compare with in the loop, and these // are also the addresses we need for copying the @@ -98,20 +95,19 @@ contract LibMem let last := mload(sEnd) // Copy whole words front to back - for {let i := 0} lt(i, nWords) {i := add(i, 1)} { + // Note: the first check is always true, + // this could have been a do-while loop. + for {} lt(source, sEnd) {} { mstore(dest, mload(source)) source := add(source, 32) dest := add(dest, 32) } - + // Write the last 32 bytes mstore(dEnd, last) } } else { assembly { - // Record the total number of full words to copy - let nWords := div(length, 32) - // We subtract 32 from `sEnd` and `dEnd` because those // are the starting points when copying a word at the end. length := sub(length, 32) @@ -125,12 +121,18 @@ contract LibMem let first := mload(source) // Copy whole words back to front - for {let i := 0} lt(i, nWords) {i := add(i, 1)} { + // We use a signed comparisson here to allow dEnd to become + // negative (happens when source and dest < 32). Valid + // addresses in local memory will never be larger than + // 2**255, so they can be safely re-interpreted as signed. + // Note: the first check is always true, + // this could have been a do-while loop. + for {} slt(dest, dEnd) {} { mstore(dEnd, mload(sEnd)) sEnd := sub(sEnd, 32) dEnd := sub(dEnd, 32) } - + // Write the first 32 bytes mstore(dest, first) } diff --git a/packages/contracts/src/utils/revert_trace.ts b/packages/contracts/src/utils/revert_trace.ts new file mode 100644 index 000000000..0bf8384bc --- /dev/null +++ b/packages/contracts/src/utils/revert_trace.ts @@ -0,0 +1,21 @@ +import { devConstants } from '@0xproject/dev-utils'; +import { RevertTraceSubprovider, SolCompilerArtifactAdapter } from '@0xproject/sol-cov'; +import * as _ from 'lodash'; + +let revertTraceSubprovider: RevertTraceSubprovider; + +export const revertTrace = { + getRevertTraceSubproviderSingleton(): RevertTraceSubprovider { + if (_.isUndefined(revertTraceSubprovider)) { + revertTraceSubprovider = revertTrace._getRevertTraceSubprovider(); + } + return revertTraceSubprovider; + }, + _getRevertTraceSubprovider(): RevertTraceSubprovider { + const defaultFromAddress = devConstants.TESTRPC_FIRST_ADDRESS; + const solCompilerArtifactAdapter = new SolCompilerArtifactAdapter(); + const isVerbose = true; + const subprovider = new RevertTraceSubprovider(solCompilerArtifactAdapter, defaultFromAddress, isVerbose); + return subprovider; + }, +}; diff --git a/packages/contracts/src/utils/web3_wrapper.ts b/packages/contracts/src/utils/web3_wrapper.ts index c475d96a9..c9d83a02d 100644 --- a/packages/contracts/src/utils/web3_wrapper.ts +++ b/packages/contracts/src/utils/web3_wrapper.ts @@ -2,9 +2,11 @@ import { devConstants, env, EnvVars, web3Factory } from '@0xproject/dev-utils'; import { prependSubprovider } from '@0xproject/subproviders'; import { logUtils } from '@0xproject/utils'; import { Web3Wrapper } from '@0xproject/web3-wrapper'; +import * as _ from 'lodash'; import { coverage } from './coverage'; import { profiler } from './profiler'; +import { revertTrace } from './revert_trace'; enum ProviderType { Ganache = 'ganache', @@ -48,10 +50,11 @@ const providerConfigs = testProvider === ProviderType.Ganache ? ganacheConfigs : export const provider = web3Factory.getRpcProvider(providerConfigs); const isCoverageEnabled = env.parseBoolean(EnvVars.SolidityCoverage); const isProfilerEnabled = env.parseBoolean(EnvVars.SolidityProfiler); -if (isCoverageEnabled && isProfilerEnabled) { - throw new Error( - `Unfortunately for now you can't enable both coverage and profiler at the same time. They both use coverage.json file and there is no way to configure that.`, - ); +const isRevertTraceEnabled = env.parseBoolean(EnvVars.SolidityRevertTrace); +const enabledSubproviderCount = _.filter([isCoverageEnabled, isProfilerEnabled, isRevertTraceEnabled], _.identity) + .length; +if (enabledSubproviderCount > 1) { + throw new Error(`Only one of coverage, profiler, or revert trace subproviders can be enabled at a time`); } if (isCoverageEnabled) { const coverageSubprovider = coverage.getCoverageSubproviderSingleton(); @@ -71,5 +74,9 @@ if (isProfilerEnabled) { profilerSubprovider.stop(); prependSubprovider(provider, profilerSubprovider); } +if (isRevertTraceEnabled) { + const revertTraceSubprovider = revertTrace.getRevertTraceSubproviderSingleton(); + prependSubprovider(provider, revertTraceSubprovider); +} export const web3Wrapper = new Web3Wrapper(provider); diff --git a/packages/dev-utils/CHANGELOG.json b/packages/dev-utils/CHANGELOG.json index a49535366..6c52bbf6b 100644 --- a/packages/dev-utils/CHANGELOG.json +++ b/packages/dev-utils/CHANGELOG.json @@ -1,5 +1,14 @@ [ { + "timestamp": 1529397769, + "version": "0.4.4", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { "version": "0.4.3", "changes": [ { diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 8e2f007d2..af4a800cc 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.4.4 - _June 19, 2018_ + + * Dependencies updated + +## v0.4.3 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.4.2 - _May 22, 2018_ * Move callbackErrorReporter over from 0x.js (#579) -## v0.4.1 - _May 4, 2018_ +## v0.4.1 - _May 5, 2018_ * Dependencies updated diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index cac3863a6..a12d6c161 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/dev-utils", - "version": "0.4.2", + "version": "0.4.4", "engines": { "node": ">=6.12" }, @@ -30,8 +30,8 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/dev-utils/README.md", "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "@types/lodash": "4.14.104", "@types/mocha": "^2.2.42", "chai": "^4.0.1", @@ -45,11 +45,11 @@ "typescript": "2.7.1" }, "dependencies": { - "@0xproject/subproviders": "^0.10.2", - "@0xproject/types": "^0.7.0", + "@0xproject/subproviders": "^0.10.4", + "@0xproject/types": "^0.8.1", "ethereum-types": "^0.0.1", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/web3-wrapper": "^0.6.4", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/web3-wrapper": "^0.7.1", "lodash": "^4.17.4", "web3": "^0.20.0", "web3-provider-engine": "^14.0.4" diff --git a/packages/dev-utils/src/env.ts b/packages/dev-utils/src/env.ts index e74ef3d23..024162c2f 100644 --- a/packages/dev-utils/src/env.ts +++ b/packages/dev-utils/src/env.ts @@ -4,6 +4,7 @@ import * as process from 'process'; export enum EnvVars { SolidityCoverage = 'SOLIDITY_COVERAGE', SolidityProfiler = 'SOLIDITY_PROFILER', + SolidityRevertTrace = 'SOLIDITY_REVERT_TRACE', VerboseGanache = 'VERBOSE_GANACHE', } diff --git a/packages/ethereum-types/package.json b/packages/ethereum-types/package.json index 68755c206..a937f6ad1 100644 --- a/packages/ethereum-types/package.json +++ b/packages/ethereum-types/package.json @@ -35,8 +35,8 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/ethereum-types/README.md", "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "copyfiles": "^1.2.0", "make-promises-safe": "^1.1.0", "shx": "^0.2.2", diff --git a/packages/fill-scenarios/CHANGELOG.json b/packages/fill-scenarios/CHANGELOG.json index 0f78fab22..87b49c196 100644 --- a/packages/fill-scenarios/CHANGELOG.json +++ b/packages/fill-scenarios/CHANGELOG.json @@ -1,10 +1,19 @@ [ { - "version": "0.1.0", + "timestamp": 1529397769, + "version": "0.0.4", "changes": [ { - "note": "Make fill-scenarios compatible with V2 of 0x protocol", - "pr": 656 + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1527616612, + "version": "0.0.3", + "changes": [ + { + "note": "Dependencies updated" } ] }, diff --git a/packages/fill-scenarios/CHANGELOG.md b/packages/fill-scenarios/CHANGELOG.md index b32b8a289..e609fc88c 100644 --- a/packages/fill-scenarios/CHANGELOG.md +++ b/packages/fill-scenarios/CHANGELOG.md @@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.0.4 - _June 19, 2018_ + + * Dependencies updated + +## v0.0.3 - _May 29, 2018_ + + * Dependencies updated + ## v0.0.2 - _May 22, 2018_ * Dependencies updated diff --git a/packages/fill-scenarios/package.json b/packages/fill-scenarios/package.json index d0c2b8000..883300fa0 100644 --- a/packages/fill-scenarios/package.json +++ b/packages/fill-scenarios/package.json @@ -28,10 +28,10 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/fill-scenarios/README.md", "devDependencies": { - "@0xproject/abi-gen": "^0.3.0", - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/sol-compiler": "^0.5.0", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/abi-gen": "^0.3.2", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/sol-compiler": "^0.5.2", + "@0xproject/tslint-config": "^0.4.20", "@types/lodash": "4.14.104", "copyfiles": "^1.2.0", "make-promises-safe": "^1.1.0", @@ -41,14 +41,14 @@ "typescript": "2.7.1" }, "dependencies": { - "@0xproject/base-contract": "^0.3.2", - "@0xproject/order-utils": "^0.0.6", + "@0xproject/base-contract": "^0.3.4", + "@0xproject/order-utils": "^1.0.0", "@0xproject/types": "1.0.0", "ethereum-types": "^0.0.1", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", - "@0xproject/web3-wrapper": "^0.6.4", - "ethers": "^3.0.15", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", + "@0xproject/web3-wrapper": "^0.7.1", + "ethers": "3.0.22", "lodash": "^4.17.4" }, "publishConfig": { diff --git a/packages/json-schemas/CHANGELOG.json b/packages/json-schemas/CHANGELOG.json index 3399a452a..bb9cd3cd2 100644 --- a/packages/json-schemas/CHANGELOG.json +++ b/packages/json-schemas/CHANGELOG.json @@ -1,5 +1,14 @@ [ { + "timestamp": 1529397769, + "version": "0.8.1", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { "version": "0.8.0", "changes": [ { diff --git a/packages/json-schemas/CHANGELOG.md b/packages/json-schemas/CHANGELOG.md index 0b35f2408..46a7c18cd 100644 --- a/packages/json-schemas/CHANGELOG.md +++ b/packages/json-schemas/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.8.1 - _June 19, 2018_ + + * Dependencies updated + +## v0.8.0 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.7.24 - _May 22, 2018_ * Dependencies updated -## v0.7.23 - _May 4, 2018_ +## v0.7.23 - _May 5, 2018_ * Dependencies updated diff --git a/packages/json-schemas/package.json b/packages/json-schemas/package.json index c6ab369b3..66ef364d6 100644 --- a/packages/json-schemas/package.json +++ b/packages/json-schemas/package.json @@ -47,15 +47,15 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/json-schemas/README.md", "dependencies": { - "@0xproject/typescript-typings": "^0.3.2", + "@0xproject/typescript-typings": "^0.4.1", "@types/node": "^8.0.53", "jsonschema": "^1.2.0", "lodash.values": "^4.3.0" }, "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", - "@0xproject/utils": "^0.6.2", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", + "@0xproject/utils": "^0.7.1", "@types/lodash.foreach": "^4.5.3", "@types/lodash.values": "^4.3.3", "@types/mocha": "^2.2.42", diff --git a/packages/metacoin/package.json b/packages/metacoin/package.json index 9b706fa09..6db14334e 100644 --- a/packages/metacoin/package.json +++ b/packages/metacoin/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/metacoin", - "version": "0.0.7", + "version": "0.0.8", "engines": { "node": ">=6.12" }, @@ -29,22 +29,22 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "@0xproject/abi-gen": "^0.3.0", - "@0xproject/base-contract": "^0.3.2", - "@0xproject/sol-compiler": "^0.5.0", - "@0xproject/sol-cov": "^0.0.11", - "@0xproject/subproviders": "^0.10.2", - "@0xproject/tslint-config": "^0.4.18", - "@0xproject/types": "^0.7.0", - "@0xproject/utils": "^0.6.2", - "@0xproject/web3-wrapper": "^0.6.4", + "@0xproject/abi-gen": "^0.3.2", + "@0xproject/base-contract": "^0.3.4", + "@0xproject/sol-compiler": "^0.5.2", + "@0xproject/sol-cov": "^0.1.1", + "@0xproject/subproviders": "^0.10.4", + "@0xproject/tslint-config": "^0.4.20", + "@0xproject/types": "^0.8.1", + "@0xproject/utils": "^0.7.1", + "@0xproject/web3-wrapper": "^0.7.1", "ethereum-types": "^0.0.1", - "ethers": "^3.0.15", + "ethers": "3.0.22", "lodash": "^4.17.4", "web3-provider-engine": "^14.0.4" }, "devDependencies": { - "@0xproject/dev-utils": "^0.4.2", + "@0xproject/dev-utils": "^0.4.4", "chai": "^4.0.1", "chai-as-promised": "^7.1.0", "chai-bignumber": "^2.0.1", diff --git a/packages/migrations/CHANGELOG.json b/packages/migrations/CHANGELOG.json index 50fe6885a..0eb67736e 100644 --- a/packages/migrations/CHANGELOG.json +++ b/packages/migrations/CHANGELOG.json @@ -1,5 +1,14 @@ [ { + "timestamp": 1529397769, + "version": "0.0.8", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { "version": "0.0.7", "changes": [ { diff --git a/packages/migrations/CHANGELOG.md b/packages/migrations/CHANGELOG.md index 78d915b6c..a5445ce80 100644 --- a/packages/migrations/CHANGELOG.md +++ b/packages/migrations/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.0.8 - _June 19, 2018_ + + * Dependencies updated + +## v0.0.7 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.0.6 - _May 22, 2018_ * Dependencies updated -## v0.0.5 - _May 4, 2018_ +## v0.0.5 - _May 5, 2018_ * Dependencies updated diff --git a/packages/migrations/artifacts/2.0.0/ERC20Proxy.json b/packages/migrations/artifacts/2.0.0/ERC20Proxy.json index cea5d460a..b259f4ba3 100644 --- a/packages/migrations/artifacts/2.0.0/ERC20Proxy.json +++ b/packages/migrations/artifacts/2.0.0/ERC20Proxy.json @@ -233,15 +233,15 @@ "evm": { "bytecode": { "linkReferences": {}, - "object": "0x608060405260008054600160a060020a03191633179055611249806100256000396000f3006080604052600436106100ae5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100b3578063494503d4146100d5578063563c875d1461010b578063707129391461012b5780638da5cb5b1461014b5780639ad2674414610160578063a85e59e414610180578063ae25532e146101a0578063b9181611146101c2578063d39de6e9146101ef578063f2fde38b14610211575b600080fd5b3480156100bf57600080fd5b506100d36100ce366004610dcf565b610231565b005b3480156100e157600080fd5b506100f56100f0366004610f8a565b610378565b60405161010291906110b4565b60405180910390f35b34801561011757600080fd5b506100d3610126366004610e2f565b6103a0565b34801561013757600080fd5b506100d3610146366004610dcf565b610493565b34801561015757600080fd5b506100f5610661565b34801561016c57600080fd5b506100d361017b366004610df5565b610670565b34801561018c57600080fd5b506100d361019b366004610f0d565b610832565b3480156101ac57600080fd5b506101b56108de565b604051610102919061112a565b3480156101ce57600080fd5b506101e26101dd366004610dcf565b6108e4565b60405161010291906110fb565b3480156101fb57600080fd5b506102046108f9565b60405161010291906110ea565b34801561021d57600080fd5b506100d361022c366004610dcf565b61095b565b600054600160a060020a031633146102675760405160e560020a62461bcd02815260040161025e9061111a565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156102dc5760405160e560020a62461bcd02815260040161025e9190611109565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b600280548290811061038657fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff16151561040d5760405160e560020a62461bcd02815260040161025e9190611109565b50600090505b845181101561048c57610484858281518110151561042d57fe5b90602001906020020151858381518110151561044557fe5b90602001906020020151858481518110151561045d57fe5b90602001906020020151858581518110151561047557fe5b906020019060200201516109c3565b600101610413565b5050505050565b60008054600160a060020a031633146104c15760405160e560020a62461bcd02815260040161025e9061111a565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105375760405160e560020a62461bcd02815260040161025e9190611109565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b6002548110156106275781600160a060020a031660028281548110151561057d57fe5b600091825260209091200154600160a060020a0316141561061f576002805460001981019081106105aa57fe5b60009182526020909120015460028054600160a060020a0390921691839081106105d057fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906106199082610b79565b50610627565b60010161055a565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e44530000000000000000000000000060208201529082106106ca5760405160e560020a62461bcd02815260040161025e9190611109565b5081600160a060020a03166002828154811015156106e457fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107555760405160e560020a62461bcd02815260040161025e9190611109565b50600160a060020a0382166000908152600160205260409020805460ff1916905560028054600019810190811061078857fe5b60009182526020909120015460028054600160a060020a0390921691839081106107ae57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906107f79082610b79565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff16151561089f5760405160e560020a62461bcd02815260040161025e9190611109565b5061048c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508484846109c3565b60015b90565b60016020526000908152604090205460ff1681565b6060600280548060200260200160405190810160405280929190818152602001828054801561095157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610933575b5050505050905090565b600054600160a060020a031633146109885760405160e560020a62461bcd02815260040161025e9061111a565b600160a060020a038116156109c0576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b6000806109d1866000610ad2565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152909250600160a060020a038316906323b872dd90610a1d908890889088906004016110c2565b602060405180830381600087803b158015610a3757600080fd5b505af1158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a6f9190810190610eef565b60408051808201909152600f81527f5452414e534645525f4641494c454400000000000000000000000000000000006020820152909150811515610ac95760405160e560020a62461bcd02815260040161025e9190611109565b50505050505050565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610b5c5760405160e560020a62461bcd02815260040161025e9190611109565b50506014818301810151910190600160a060020a03165b92915050565b815481835581811115610b9d57600083815260209020610b9d918101908301610ba2565b505050565b6108e191905b80821115610bbc5760008155600101610ba8565b5090565b6000610bcc82356111b2565b9392505050565b6000601f82018313610be457600080fd5b8135610bf7610bf28261115f565b611138565b91508181835260208401935060208101905083856020840282011115610c1c57600080fd5b60005b83811015610c485781610c328882610bc0565b8452506020928301929190910190600101610c1f565b5050505092915050565b6000601f82018313610c6357600080fd5b8135610c71610bf28261115f565b81815260209384019390925082018360005b83811015610c485781358601610c998882610d74565b8452506020928301929190910190600101610c83565b6000601f82018313610cc057600080fd5b8135610cce610bf28261115f565b91508181835260208401935060208101905083856020840282011115610cf357600080fd5b60005b83811015610c485781610d098882610dc3565b8452506020928301929190910190600101610cf6565b6000610bcc82516111be565b600080601f83018413610d3d57600080fd5b50813567ffffffffffffffff811115610d5557600080fd5b602083019150836001820283011115610d6d57600080fd5b9250929050565b6000601f82018313610d8557600080fd5b8135610d93610bf282611180565b91508082526020830160208301858383011115610daf57600080fd5b610dba8382846111c9565b50505092915050565b6000610bcc82356108e1565b600060208284031215610de157600080fd5b6000610ded8484610bc0565b949350505050565b60008060408385031215610e0857600080fd5b6000610e148585610bc0565b9250506020610e2585828601610dc3565b9150509250929050565b60008060008060808587031215610e4557600080fd5b843567ffffffffffffffff811115610e5c57600080fd5b610e6887828801610c52565b945050602085013567ffffffffffffffff811115610e8557600080fd5b610e9187828801610bd3565b935050604085013567ffffffffffffffff811115610eae57600080fd5b610eba87828801610bd3565b925050606085013567ffffffffffffffff811115610ed757600080fd5b610ee387828801610caf565b91505092959194509250565b600060208284031215610f0157600080fd5b6000610ded8484610d1f565b600080600080600060808688031215610f2557600080fd5b853567ffffffffffffffff811115610f3c57600080fd5b610f4888828901610d2b565b95509550506020610f5b88828901610bc0565b9350506040610f6c88828901610bc0565b9250506060610f7d88828901610dc3565b9150509295509295909350565b600060208284031215610f9c57600080fd5b6000610ded8484610dc3565b610fb1816111b2565b82525050565b6000610fc2826111ae565b808452602084019350610fd4836111a8565b60005b8281101561100457610fea868351610fa8565b610ff3826111a8565b602096909601959150600101610fd7565b5093949350505050565b610fb1816111be565b6000611022826111ae565b8084526110368160208601602086016111d5565b61103f81611205565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b610fb1816108e1565b610fb1816111c3565b60208101610b738284610fa8565b606081016110d08286610fa8565b6110dd6020830185610fa8565b610ded60408301846110a2565b60208082528101610bcc8184610fb7565b60208101610b73828461100e565b60208082528101610bcc8184611017565b60208082528101610b738161104c565b60208101610b7382846110ab565b60405181810167ffffffffffffffff8111828210171561115757600080fd5b604052919050565b600067ffffffffffffffff82111561117657600080fd5b5060209081020190565b600067ffffffffffffffff82111561119757600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156111f05781810151838201526020016111d8565b838111156111ff576000848401525b50505050565b601f01601f1916905600a265627a7a72305820a3600dd329debfedd90359bd095ebfdbaa780d6d5d04bb9d306401a4aabf100e6c6578706572696d656e74616cf50037", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x1249 DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xAE JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xB3 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xD5 JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x10B JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x12B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x14B JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x160 JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x180 JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1A0 JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x1C2 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x1EF JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x211 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0xCE CALLDATASIZE PUSH1 0x4 PUSH2 0xDCF JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF5 PUSH2 0xF0 CALLDATASIZE PUSH1 0x4 PUSH2 0xF8A JUMP JUMPDEST PUSH2 0x378 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x10B4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x117 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x126 CALLDATASIZE PUSH1 0x4 PUSH2 0xE2F JUMP JUMPDEST PUSH2 0x3A0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x137 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x146 CALLDATASIZE PUSH1 0x4 PUSH2 0xDCF JUMP JUMPDEST PUSH2 0x493 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF5 PUSH2 0x661 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x17B CALLDATASIZE PUSH1 0x4 PUSH2 0xDF5 JUMP JUMPDEST PUSH2 0x670 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x19B CALLDATASIZE PUSH1 0x4 PUSH2 0xF0D JUMP JUMPDEST PUSH2 0x832 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B5 PUSH2 0x8DE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x112A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E2 PUSH2 0x1DD CALLDATASIZE PUSH1 0x4 PUSH2 0xDCF JUMP JUMPDEST PUSH2 0x8E4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x10FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x204 PUSH2 0x8F9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x10EA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x22C CALLDATASIZE PUSH1 0x4 PUSH2 0xDCF JUMP JUMPDEST PUSH2 0x95B JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x267 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP1 PUSH2 0x111A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x2DC JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x386 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x40D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x48C JUMPI PUSH2 0x484 DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x42D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x445 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x45D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x475 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x9C3 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x413 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4C1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP1 PUSH2 0x111A JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x537 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x627 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x57D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x61F JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x5AA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x5D0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x619 SWAP1 DUP3 PUSH2 0xB79 JUMP JUMPDEST POP PUSH2 0x627 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x55A JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x6CA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6E4 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x755 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x788 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x7AE JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x7F7 SWAP1 DUP3 PUSH2 0xB79 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x89F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP PUSH2 0x48C DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0x9C3 JUMP JUMPDEST PUSH1 0x1 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x951 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x933 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x988 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP1 PUSH2 0x111A JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0x9C0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x9D1 DUP7 PUSH1 0x0 PUSH2 0xAD2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0xA1D SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x10C2 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA4B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xA6F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xEEF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0xAC9 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xB5C JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xB9D JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xB9D SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xBA2 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x8E1 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xBBC JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xBA8 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCC DUP3 CALLDATALOAD PUSH2 0x11B2 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xBE4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xBF7 PUSH2 0xBF2 DUP3 PUSH2 0x115F JUMP JUMPDEST PUSH2 0x1138 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xC1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC48 JUMPI DUP2 PUSH2 0xC32 DUP9 DUP3 PUSH2 0xBC0 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xC1F JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xC63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xC71 PUSH2 0xBF2 DUP3 PUSH2 0x115F JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC48 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xC99 DUP9 DUP3 PUSH2 0xD74 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xC83 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xCC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xCCE PUSH2 0xBF2 DUP3 PUSH2 0x115F JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xCF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC48 JUMPI DUP2 PUSH2 0xD09 DUP9 DUP3 PUSH2 0xDC3 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xCF6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCC DUP3 MLOAD PUSH2 0x11BE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0xD3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xD55 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0xD6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xD85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xD93 PUSH2 0xBF2 DUP3 PUSH2 0x1180 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0xDAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xDBA DUP4 DUP3 DUP5 PUSH2 0x11C9 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCC DUP3 CALLDATALOAD PUSH2 0x8E1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xDE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xDED DUP5 DUP5 PUSH2 0xBC0 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xE08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xE14 DUP6 DUP6 PUSH2 0xBC0 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xE25 DUP6 DUP3 DUP7 ADD PUSH2 0xDC3 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xE45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE68 DUP8 DUP3 DUP9 ADD PUSH2 0xC52 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE91 DUP8 DUP3 DUP9 ADD PUSH2 0xBD3 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xEAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEBA DUP8 DUP3 DUP9 ADD PUSH2 0xBD3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xED7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEE3 DUP8 DUP3 DUP9 ADD PUSH2 0xCAF JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xDED DUP5 DUP5 PUSH2 0xD1F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xF25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF3C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF48 DUP9 DUP3 DUP10 ADD PUSH2 0xD2B JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0xF5B DUP9 DUP3 DUP10 ADD PUSH2 0xBC0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0xF6C DUP9 DUP3 DUP10 ADD PUSH2 0xBC0 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0xF7D DUP9 DUP3 DUP10 ADD PUSH2 0xDC3 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xDED DUP5 DUP5 PUSH2 0xDC3 JUMP JUMPDEST PUSH2 0xFB1 DUP2 PUSH2 0x11B2 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFC2 DUP3 PUSH2 0x11AE JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0xFD4 DUP4 PUSH2 0x11A8 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1004 JUMPI PUSH2 0xFEA DUP7 DUP4 MLOAD PUSH2 0xFA8 JUMP JUMPDEST PUSH2 0xFF3 DUP3 PUSH2 0x11A8 JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0xFD7 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xFB1 DUP2 PUSH2 0x11BE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1022 DUP3 PUSH2 0x11AE JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1036 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x11D5 JUMP JUMPDEST PUSH2 0x103F DUP2 PUSH2 0x1205 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0xFB1 DUP2 PUSH2 0x8E1 JUMP JUMPDEST PUSH2 0xFB1 DUP2 PUSH2 0x11C3 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB73 DUP3 DUP5 PUSH2 0xFA8 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x10D0 DUP3 DUP7 PUSH2 0xFA8 JUMP JUMPDEST PUSH2 0x10DD PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xFA8 JUMP JUMPDEST PUSH2 0xDED PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x10A2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBCC DUP2 DUP5 PUSH2 0xFB7 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB73 DUP3 DUP5 PUSH2 0x100E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBCC DUP2 DUP5 PUSH2 0x1017 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB73 DUP2 PUSH2 0x104C JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB73 DUP3 DUP5 PUSH2 0x10AB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1176 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1197 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11F0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x11D8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x11FF JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 LOG3 PUSH1 0xD 0xd3 0x29 0xde 0xbf 0xed 0xd9 SUB MSIZE 0xbd MULMOD 0x5e 0xbf 0xdb 0xaa PUSH25 0xD6D5D04BB9D306401A4AABF100E6C6578706572696D656E74 PUSH2 0x6CF5 STOP CALLDATACOPY ", - "sourceMap": "801:1026:0:-;;;363:5:12;:18;;-1:-1:-1;;;;;;363:18:12;371:10;363:18;;;801:1026:0;;;;;;" + "object": "0x608060405260008054600160a060020a03191633179055611303806100256000396000f3006080604052600436106100ae5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100b3578063494503d4146100d5578063563c875d1461010b578063707129391461012b5780638da5cb5b1461014b5780639ad2674414610160578063a85e59e414610180578063ae25532e146101a0578063b9181611146101c2578063d39de6e9146101ef578063f2fde38b14610211575b600080fd5b3480156100bf57600080fd5b506100d36100ce366004610ea7565b610231565b005b3480156100e157600080fd5b506100f56100f0366004611044565b610378565b604051610102919061116e565b60405180910390f35b34801561011757600080fd5b506100d3610126366004610f07565b6103a0565b34801561013757600080fd5b506100d3610146366004610ea7565b610493565b34801561015757600080fd5b506100f5610661565b34801561016c57600080fd5b506100d361017b366004610ecd565b610670565b34801561018c57600080fd5b506100d361019b366004610fc7565b610832565b3480156101ac57600080fd5b506101b56108de565b60405161010291906111e4565b3480156101ce57600080fd5b506101e26101dd366004610ea7565b6108e4565b60405161010291906111b5565b3480156101fb57600080fd5b506102046108f9565b60405161010291906111a4565b34801561021d57600080fd5b506100d361022c366004610ea7565b61095b565b600054600160a060020a031633146102675760405160e560020a62461bcd02815260040161025e906111d4565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156102dc5760405160e560020a62461bcd02815260040161025e91906111c3565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b600280548290811061038657fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff16151561040d5760405160e560020a62461bcd02815260040161025e91906111c3565b50600090505b845181101561048c57610484858281518110151561042d57fe5b90602001906020020151858381518110151561044557fe5b90602001906020020151858481518110151561045d57fe5b90602001906020020151858581518110151561047557fe5b906020019060200201516109c3565b600101610413565b5050505050565b60008054600160a060020a031633146104c15760405160e560020a62461bcd02815260040161025e906111d4565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105375760405160e560020a62461bcd02815260040161025e91906111c3565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b6002548110156106275781600160a060020a031660028281548110151561057d57fe5b600091825260209091200154600160a060020a0316141561061f576002805460001981019081106105aa57fe5b60009182526020909120015460028054600160a060020a0390921691839081106105d057fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906106199082610c5d565b50610627565b60010161055a565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e44530000000000000000000000000060208201529082106106ca5760405160e560020a62461bcd02815260040161025e91906111c3565b5081600160a060020a03166002828154811015156106e457fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107555760405160e560020a62461bcd02815260040161025e91906111c3565b50600160a060020a0382166000908152600160205260409020805460ff1916905560028054600019810190811061078857fe5b60009182526020909120015460028054600160a060020a0390921691839081106107ae57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906107f79082610c5d565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff16151561089f5760405160e560020a62461bcd02815260040161025e91906111c3565b5061048c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508484846109c3565b60015b90565b60016020526000908152604090205460ff1681565b6060600280548060200260200160405190810160405280929190818152602001828054801561095157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610933575b5050505050905090565b600054600160a060020a031633146109885760405160e560020a62461bcd02815260040161025e906111d4565b600160a060020a038116156109c0576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b6000806109d1866000610bb6565b604051909250600160a060020a038316907f23b872dd0000000000000000000000000000000000000000000000000000000090610a169088908890889060240161117c565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b83811015610a9c578181015183820152602001610a84565b50505050905090810190601f168015610ac95780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af160408051808201909152600f81527f5452414e534645525f4641494c454400000000000000000000000000000000006020820152909350915050811515610b385760405160e560020a62461bcd02815260040161025e91906111c3565b503d15610b56575060003d60201415610b565760206000803e506000515b60408051808201909152600f81527f5452414e534645525f4641494c454400000000000000000000000000000000006020820152811515610bad5760405160e560020a62461bcd02815260040161025e91906111c3565b50505050505050565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610c405760405160e560020a62461bcd02815260040161025e91906111c3565b50506014818301810151910190600160a060020a03165b92915050565b815481835581811115610c8157600083815260209020610c81918101908301610c86565b505050565b6108e191905b80821115610ca05760008155600101610c8c565b5090565b6000610cb0823561126c565b9392505050565b6000601f82018313610cc857600080fd5b8135610cdb610cd682611219565b6111f2565b91508181835260208401935060208101905083856020840282011115610d0057600080fd5b60005b83811015610d2c5781610d168882610ca4565b8452506020928301929190910190600101610d03565b5050505092915050565b6000601f82018313610d4757600080fd5b8135610d55610cd682611219565b81815260209384019390925082018360005b83811015610d2c5781358601610d7d8882610e4c565b8452506020928301929190910190600101610d67565b6000601f82018313610da457600080fd5b8135610db2610cd682611219565b91508181835260208401935060208101905083856020840282011115610dd757600080fd5b60005b83811015610d2c5781610ded8882610e9b565b8452506020928301929190910190600101610dda565b600080601f83018413610e1557600080fd5b50813567ffffffffffffffff811115610e2d57600080fd5b602083019150836001820283011115610e4557600080fd5b9250929050565b6000601f82018313610e5d57600080fd5b8135610e6b610cd68261123a565b91508082526020830160208301858383011115610e8757600080fd5b610e92838284611283565b50505092915050565b6000610cb082356108e1565b600060208284031215610eb957600080fd5b6000610ec58484610ca4565b949350505050565b60008060408385031215610ee057600080fd5b6000610eec8585610ca4565b9250506020610efd85828601610e9b565b9150509250929050565b60008060008060808587031215610f1d57600080fd5b843567ffffffffffffffff811115610f3457600080fd5b610f4087828801610d36565b945050602085013567ffffffffffffffff811115610f5d57600080fd5b610f6987828801610cb7565b935050604085013567ffffffffffffffff811115610f8657600080fd5b610f9287828801610cb7565b925050606085013567ffffffffffffffff811115610faf57600080fd5b610fbb87828801610d93565b91505092959194509250565b600080600080600060808688031215610fdf57600080fd5b853567ffffffffffffffff811115610ff657600080fd5b61100288828901610e03565b9550955050602061101588828901610ca4565b935050604061102688828901610ca4565b925050606061103788828901610e9b565b9150509295509295909350565b60006020828403121561105657600080fd5b6000610ec58484610e9b565b61106b8161126c565b82525050565b600061107c82611268565b80845260208401935061108e83611262565b60005b828110156110be576110a4868351611062565b6110ad82611262565b602096909601959150600101611091565b5093949350505050565b61106b81611278565b60006110dc82611268565b8084526110f081602086016020860161128f565b6110f9816112bf565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b61106b816108e1565b61106b8161127d565b60208101610c578284611062565b6060810161118a8286611062565b6111976020830185611062565b610ec5604083018461115c565b60208082528101610cb08184611071565b60208101610c5782846110c8565b60208082528101610cb081846110d1565b60208082528101610c5781611106565b60208101610c578284611165565b60405181810167ffffffffffffffff8111828210171561121157600080fd5b604052919050565b600067ffffffffffffffff82111561123057600080fd5b5060209081020190565b600067ffffffffffffffff82111561125157600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156112aa578181015183820152602001611292565b838111156112b9576000848401525b50505050565b601f01601f1916905600a265627a7a723058209dbaf0a0b2a02e72b8d78685384ac31ca7d68ad4294dcb7fc1086cd8435404696c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x1303 DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xAE JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xB3 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xD5 JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x10B JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x12B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x14B JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x160 JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x180 JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1A0 JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x1C2 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x1EF JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x211 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0xCE CALLDATASIZE PUSH1 0x4 PUSH2 0xEA7 JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF5 PUSH2 0xF0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1044 JUMP JUMPDEST PUSH2 0x378 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x117 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x126 CALLDATASIZE PUSH1 0x4 PUSH2 0xF07 JUMP JUMPDEST PUSH2 0x3A0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x137 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x146 CALLDATASIZE PUSH1 0x4 PUSH2 0xEA7 JUMP JUMPDEST PUSH2 0x493 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF5 PUSH2 0x661 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x17B CALLDATASIZE PUSH1 0x4 PUSH2 0xECD JUMP JUMPDEST PUSH2 0x670 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x19B CALLDATASIZE PUSH1 0x4 PUSH2 0xFC7 JUMP JUMPDEST PUSH2 0x832 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B5 PUSH2 0x8DE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x11E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E2 PUSH2 0x1DD CALLDATASIZE PUSH1 0x4 PUSH2 0xEA7 JUMP JUMPDEST PUSH2 0x8E4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x11B5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x204 PUSH2 0x8F9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x11A4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x22C CALLDATASIZE PUSH1 0x4 PUSH2 0xEA7 JUMP JUMPDEST PUSH2 0x95B JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x267 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP1 PUSH2 0x11D4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x2DC JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x386 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x40D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x48C JUMPI PUSH2 0x484 DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x42D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x445 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x45D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x475 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x9C3 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x413 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4C1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP1 PUSH2 0x11D4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x537 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x627 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x57D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x61F JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x5AA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x5D0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x619 SWAP1 DUP3 PUSH2 0xC5D JUMP JUMPDEST POP PUSH2 0x627 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x55A JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x6CA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6E4 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x755 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x788 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x7AE JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x7F7 SWAP1 DUP3 PUSH2 0xC5D JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x89F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP PUSH2 0x48C DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0x9C3 JUMP JUMPDEST PUSH1 0x1 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x951 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x933 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x988 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP1 PUSH2 0x11D4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0x9C0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x9D1 DUP7 PUSH1 0x0 PUSH2 0xBB6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xA16 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x117C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA9C JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA84 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xAC9 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP4 POP SWAP2 POP POP DUP2 ISZERO ISZERO PUSH2 0xB38 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP RETURNDATASIZE ISZERO PUSH2 0xB56 JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0xB56 JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 ISZERO ISZERO PUSH2 0xBAD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xC40 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xC81 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xC81 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xC86 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x8E1 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xCA0 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xC8C JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB0 DUP3 CALLDATALOAD PUSH2 0x126C JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xCC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xCDB PUSH2 0xCD6 DUP3 PUSH2 0x1219 JUMP JUMPDEST PUSH2 0x11F2 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xD00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD2C JUMPI DUP2 PUSH2 0xD16 DUP9 DUP3 PUSH2 0xCA4 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xD03 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xD47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xD55 PUSH2 0xCD6 DUP3 PUSH2 0x1219 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD2C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xD7D DUP9 DUP3 PUSH2 0xE4C JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xD67 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xDA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xDB2 PUSH2 0xCD6 DUP3 PUSH2 0x1219 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xDD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD2C JUMPI DUP2 PUSH2 0xDED DUP9 DUP3 PUSH2 0xE9B JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xDDA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0xE15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0xE45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xE5D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xE6B PUSH2 0xCD6 DUP3 PUSH2 0x123A JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0xE87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE92 DUP4 DUP3 DUP5 PUSH2 0x1283 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB0 DUP3 CALLDATALOAD PUSH2 0x8E1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xEB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEC5 DUP5 DUP5 PUSH2 0xCA4 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xEE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEEC DUP6 DUP6 PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xEFD DUP6 DUP3 DUP7 ADD PUSH2 0xE9B JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xF1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF40 DUP8 DUP3 DUP9 ADD PUSH2 0xD36 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF5D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF69 DUP8 DUP3 DUP9 ADD PUSH2 0xCB7 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF86 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF92 DUP8 DUP3 DUP9 ADD PUSH2 0xCB7 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xFBB DUP8 DUP3 DUP9 ADD PUSH2 0xD93 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xFDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1002 DUP9 DUP3 DUP10 ADD PUSH2 0xE03 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0x1015 DUP9 DUP3 DUP10 ADD PUSH2 0xCA4 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x1026 DUP9 DUP3 DUP10 ADD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x1037 DUP9 DUP3 DUP10 ADD PUSH2 0xE9B JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1056 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEC5 DUP5 DUP5 PUSH2 0xE9B JUMP JUMPDEST PUSH2 0x106B DUP2 PUSH2 0x126C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x107C DUP3 PUSH2 0x1268 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x108E DUP4 PUSH2 0x1262 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x10BE JUMPI PUSH2 0x10A4 DUP7 DUP4 MLOAD PUSH2 0x1062 JUMP JUMPDEST PUSH2 0x10AD DUP3 PUSH2 0x1262 JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1091 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x106B DUP2 PUSH2 0x1278 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10DC DUP3 PUSH2 0x1268 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x10F0 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x128F JUMP JUMPDEST PUSH2 0x10F9 DUP2 PUSH2 0x12BF JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0x106B DUP2 PUSH2 0x8E1 JUMP JUMPDEST PUSH2 0x106B DUP2 PUSH2 0x127D JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC57 DUP3 DUP5 PUSH2 0x1062 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x118A DUP3 DUP7 PUSH2 0x1062 JUMP JUMPDEST PUSH2 0x1197 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1062 JUMP JUMPDEST PUSH2 0xEC5 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x115C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCB0 DUP2 DUP5 PUSH2 0x1071 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC57 DUP3 DUP5 PUSH2 0x10C8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCB0 DUP2 DUP5 PUSH2 0x10D1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC57 DUP2 PUSH2 0x1106 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC57 DUP3 DUP5 PUSH2 0x1165 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1211 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1230 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x12AA JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1292 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x12B9 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 SWAP14 0xba CREATE LOG0 0xb2 LOG0 0x2e PUSH19 0xB8D78685384AC31CA7D68AD4294DCB7FC1086C 0xd8 NUMBER SLOAD DIV PUSH10 0x6C6578706572696D656E PUSH21 0x616CF5003700000000000000000000000000000000 ", + "sourceMap": "801:1973:0:-;;;363:5:12;:18;;-1:-1:-1;;;;;;363:18:12;371:10;363:18;;;801:1973:0;;;;;;" }, "deployedBytecode": { "linkReferences": {}, - "object": "0x6080604052600436106100ae5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100b3578063494503d4146100d5578063563c875d1461010b578063707129391461012b5780638da5cb5b1461014b5780639ad2674414610160578063a85e59e414610180578063ae25532e146101a0578063b9181611146101c2578063d39de6e9146101ef578063f2fde38b14610211575b600080fd5b3480156100bf57600080fd5b506100d36100ce366004610dcf565b610231565b005b3480156100e157600080fd5b506100f56100f0366004610f8a565b610378565b60405161010291906110b4565b60405180910390f35b34801561011757600080fd5b506100d3610126366004610e2f565b6103a0565b34801561013757600080fd5b506100d3610146366004610dcf565b610493565b34801561015757600080fd5b506100f5610661565b34801561016c57600080fd5b506100d361017b366004610df5565b610670565b34801561018c57600080fd5b506100d361019b366004610f0d565b610832565b3480156101ac57600080fd5b506101b56108de565b604051610102919061112a565b3480156101ce57600080fd5b506101e26101dd366004610dcf565b6108e4565b60405161010291906110fb565b3480156101fb57600080fd5b506102046108f9565b60405161010291906110ea565b34801561021d57600080fd5b506100d361022c366004610dcf565b61095b565b600054600160a060020a031633146102675760405160e560020a62461bcd02815260040161025e9061111a565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156102dc5760405160e560020a62461bcd02815260040161025e9190611109565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b600280548290811061038657fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff16151561040d5760405160e560020a62461bcd02815260040161025e9190611109565b50600090505b845181101561048c57610484858281518110151561042d57fe5b90602001906020020151858381518110151561044557fe5b90602001906020020151858481518110151561045d57fe5b90602001906020020151858581518110151561047557fe5b906020019060200201516109c3565b600101610413565b5050505050565b60008054600160a060020a031633146104c15760405160e560020a62461bcd02815260040161025e9061111a565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105375760405160e560020a62461bcd02815260040161025e9190611109565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b6002548110156106275781600160a060020a031660028281548110151561057d57fe5b600091825260209091200154600160a060020a0316141561061f576002805460001981019081106105aa57fe5b60009182526020909120015460028054600160a060020a0390921691839081106105d057fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906106199082610b79565b50610627565b60010161055a565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e44530000000000000000000000000060208201529082106106ca5760405160e560020a62461bcd02815260040161025e9190611109565b5081600160a060020a03166002828154811015156106e457fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107555760405160e560020a62461bcd02815260040161025e9190611109565b50600160a060020a0382166000908152600160205260409020805460ff1916905560028054600019810190811061078857fe5b60009182526020909120015460028054600160a060020a0390921691839081106107ae57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906107f79082610b79565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff16151561089f5760405160e560020a62461bcd02815260040161025e9190611109565b5061048c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508484846109c3565b60015b90565b60016020526000908152604090205460ff1681565b6060600280548060200260200160405190810160405280929190818152602001828054801561095157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610933575b5050505050905090565b600054600160a060020a031633146109885760405160e560020a62461bcd02815260040161025e9061111a565b600160a060020a038116156109c0576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b6000806109d1866000610ad2565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152909250600160a060020a038316906323b872dd90610a1d908890889088906004016110c2565b602060405180830381600087803b158015610a3757600080fd5b505af1158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a6f9190810190610eef565b60408051808201909152600f81527f5452414e534645525f4641494c454400000000000000000000000000000000006020820152909150811515610ac95760405160e560020a62461bcd02815260040161025e9190611109565b50505050505050565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610b5c5760405160e560020a62461bcd02815260040161025e9190611109565b50506014818301810151910190600160a060020a03165b92915050565b815481835581811115610b9d57600083815260209020610b9d918101908301610ba2565b505050565b6108e191905b80821115610bbc5760008155600101610ba8565b5090565b6000610bcc82356111b2565b9392505050565b6000601f82018313610be457600080fd5b8135610bf7610bf28261115f565b611138565b91508181835260208401935060208101905083856020840282011115610c1c57600080fd5b60005b83811015610c485781610c328882610bc0565b8452506020928301929190910190600101610c1f565b5050505092915050565b6000601f82018313610c6357600080fd5b8135610c71610bf28261115f565b81815260209384019390925082018360005b83811015610c485781358601610c998882610d74565b8452506020928301929190910190600101610c83565b6000601f82018313610cc057600080fd5b8135610cce610bf28261115f565b91508181835260208401935060208101905083856020840282011115610cf357600080fd5b60005b83811015610c485781610d098882610dc3565b8452506020928301929190910190600101610cf6565b6000610bcc82516111be565b600080601f83018413610d3d57600080fd5b50813567ffffffffffffffff811115610d5557600080fd5b602083019150836001820283011115610d6d57600080fd5b9250929050565b6000601f82018313610d8557600080fd5b8135610d93610bf282611180565b91508082526020830160208301858383011115610daf57600080fd5b610dba8382846111c9565b50505092915050565b6000610bcc82356108e1565b600060208284031215610de157600080fd5b6000610ded8484610bc0565b949350505050565b60008060408385031215610e0857600080fd5b6000610e148585610bc0565b9250506020610e2585828601610dc3565b9150509250929050565b60008060008060808587031215610e4557600080fd5b843567ffffffffffffffff811115610e5c57600080fd5b610e6887828801610c52565b945050602085013567ffffffffffffffff811115610e8557600080fd5b610e9187828801610bd3565b935050604085013567ffffffffffffffff811115610eae57600080fd5b610eba87828801610bd3565b925050606085013567ffffffffffffffff811115610ed757600080fd5b610ee387828801610caf565b91505092959194509250565b600060208284031215610f0157600080fd5b6000610ded8484610d1f565b600080600080600060808688031215610f2557600080fd5b853567ffffffffffffffff811115610f3c57600080fd5b610f4888828901610d2b565b95509550506020610f5b88828901610bc0565b9350506040610f6c88828901610bc0565b9250506060610f7d88828901610dc3565b9150509295509295909350565b600060208284031215610f9c57600080fd5b6000610ded8484610dc3565b610fb1816111b2565b82525050565b6000610fc2826111ae565b808452602084019350610fd4836111a8565b60005b8281101561100457610fea868351610fa8565b610ff3826111a8565b602096909601959150600101610fd7565b5093949350505050565b610fb1816111be565b6000611022826111ae565b8084526110368160208601602086016111d5565b61103f81611205565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b610fb1816108e1565b610fb1816111c3565b60208101610b738284610fa8565b606081016110d08286610fa8565b6110dd6020830185610fa8565b610ded60408301846110a2565b60208082528101610bcc8184610fb7565b60208101610b73828461100e565b60208082528101610bcc8184611017565b60208082528101610b738161104c565b60208101610b7382846110ab565b60405181810167ffffffffffffffff8111828210171561115757600080fd5b604052919050565b600067ffffffffffffffff82111561117657600080fd5b5060209081020190565b600067ffffffffffffffff82111561119757600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156111f05781810151838201526020016111d8565b838111156111ff576000848401525b50505050565b601f01601f1916905600a265627a7a72305820a3600dd329debfedd90359bd095ebfdbaa780d6d5d04bb9d306401a4aabf100e6c6578706572696d656e74616cf50037", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xAE JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xB3 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xD5 JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x10B JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x12B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x14B JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x160 JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x180 JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1A0 JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x1C2 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x1EF JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x211 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0xCE CALLDATASIZE PUSH1 0x4 PUSH2 0xDCF JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF5 PUSH2 0xF0 CALLDATASIZE PUSH1 0x4 PUSH2 0xF8A JUMP JUMPDEST PUSH2 0x378 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x10B4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x117 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x126 CALLDATASIZE PUSH1 0x4 PUSH2 0xE2F JUMP JUMPDEST PUSH2 0x3A0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x137 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x146 CALLDATASIZE PUSH1 0x4 PUSH2 0xDCF JUMP JUMPDEST PUSH2 0x493 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF5 PUSH2 0x661 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x17B CALLDATASIZE PUSH1 0x4 PUSH2 0xDF5 JUMP JUMPDEST PUSH2 0x670 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x19B CALLDATASIZE PUSH1 0x4 PUSH2 0xF0D JUMP JUMPDEST PUSH2 0x832 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B5 PUSH2 0x8DE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x112A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E2 PUSH2 0x1DD CALLDATASIZE PUSH1 0x4 PUSH2 0xDCF JUMP JUMPDEST PUSH2 0x8E4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x10FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x204 PUSH2 0x8F9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x10EA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x22C CALLDATASIZE PUSH1 0x4 PUSH2 0xDCF JUMP JUMPDEST PUSH2 0x95B JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x267 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP1 PUSH2 0x111A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x2DC JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x386 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x40D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x48C JUMPI PUSH2 0x484 DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x42D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x445 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x45D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x475 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x9C3 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x413 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4C1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP1 PUSH2 0x111A JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x537 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x627 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x57D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x61F JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x5AA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x5D0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x619 SWAP1 DUP3 PUSH2 0xB79 JUMP JUMPDEST POP PUSH2 0x627 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x55A JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x6CA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6E4 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x755 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x788 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x7AE JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x7F7 SWAP1 DUP3 PUSH2 0xB79 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x89F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP PUSH2 0x48C DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0x9C3 JUMP JUMPDEST PUSH1 0x1 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x951 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x933 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x988 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP1 PUSH2 0x111A JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0x9C0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x9D1 DUP7 PUSH1 0x0 PUSH2 0xAD2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0xA1D SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x10C2 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA4B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xA6F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xEEF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0xAC9 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xB5C JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x1109 JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xB9D JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xB9D SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xBA2 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x8E1 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xBBC JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xBA8 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCC DUP3 CALLDATALOAD PUSH2 0x11B2 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xBE4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xBF7 PUSH2 0xBF2 DUP3 PUSH2 0x115F JUMP JUMPDEST PUSH2 0x1138 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xC1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC48 JUMPI DUP2 PUSH2 0xC32 DUP9 DUP3 PUSH2 0xBC0 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xC1F JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xC63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xC71 PUSH2 0xBF2 DUP3 PUSH2 0x115F JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC48 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xC99 DUP9 DUP3 PUSH2 0xD74 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xC83 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xCC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xCCE PUSH2 0xBF2 DUP3 PUSH2 0x115F JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xCF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC48 JUMPI DUP2 PUSH2 0xD09 DUP9 DUP3 PUSH2 0xDC3 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xCF6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCC DUP3 MLOAD PUSH2 0x11BE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0xD3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xD55 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0xD6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xD85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xD93 PUSH2 0xBF2 DUP3 PUSH2 0x1180 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0xDAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xDBA DUP4 DUP3 DUP5 PUSH2 0x11C9 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCC DUP3 CALLDATALOAD PUSH2 0x8E1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xDE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xDED DUP5 DUP5 PUSH2 0xBC0 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xE08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xE14 DUP6 DUP6 PUSH2 0xBC0 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xE25 DUP6 DUP3 DUP7 ADD PUSH2 0xDC3 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xE45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE68 DUP8 DUP3 DUP9 ADD PUSH2 0xC52 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE91 DUP8 DUP3 DUP9 ADD PUSH2 0xBD3 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xEAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEBA DUP8 DUP3 DUP9 ADD PUSH2 0xBD3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xED7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEE3 DUP8 DUP3 DUP9 ADD PUSH2 0xCAF JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xDED DUP5 DUP5 PUSH2 0xD1F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xF25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF3C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF48 DUP9 DUP3 DUP10 ADD PUSH2 0xD2B JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0xF5B DUP9 DUP3 DUP10 ADD PUSH2 0xBC0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0xF6C DUP9 DUP3 DUP10 ADD PUSH2 0xBC0 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0xF7D DUP9 DUP3 DUP10 ADD PUSH2 0xDC3 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xDED DUP5 DUP5 PUSH2 0xDC3 JUMP JUMPDEST PUSH2 0xFB1 DUP2 PUSH2 0x11B2 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFC2 DUP3 PUSH2 0x11AE JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0xFD4 DUP4 PUSH2 0x11A8 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1004 JUMPI PUSH2 0xFEA DUP7 DUP4 MLOAD PUSH2 0xFA8 JUMP JUMPDEST PUSH2 0xFF3 DUP3 PUSH2 0x11A8 JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0xFD7 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xFB1 DUP2 PUSH2 0x11BE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1022 DUP3 PUSH2 0x11AE JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1036 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x11D5 JUMP JUMPDEST PUSH2 0x103F DUP2 PUSH2 0x1205 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0xFB1 DUP2 PUSH2 0x8E1 JUMP JUMPDEST PUSH2 0xFB1 DUP2 PUSH2 0x11C3 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB73 DUP3 DUP5 PUSH2 0xFA8 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x10D0 DUP3 DUP7 PUSH2 0xFA8 JUMP JUMPDEST PUSH2 0x10DD PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xFA8 JUMP JUMPDEST PUSH2 0xDED PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x10A2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBCC DUP2 DUP5 PUSH2 0xFB7 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB73 DUP3 DUP5 PUSH2 0x100E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBCC DUP2 DUP5 PUSH2 0x1017 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB73 DUP2 PUSH2 0x104C JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB73 DUP3 DUP5 PUSH2 0x10AB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1176 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1197 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11F0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x11D8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x11FF JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 LOG3 PUSH1 0xD 0xd3 0x29 0xde 0xbf 0xed 0xd9 SUB MSIZE 0xbd MULMOD 0x5e 0xbf 0xdb 0xaa PUSH25 0xD6D5D04BB9D306401A4AABF100E6C6578706572696D656E74 PUSH2 0x6CF5 STOP CALLDATACOPY ", - "sourceMap": "801:1026:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1244:318:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1244:318:2;;;;;;;;;;;1129:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1129:28:2;;;;;;;;;;;;;;;;;;;;;;;;;1679:431:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1679:431:1;;;;;;;;;1676:542:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1676:542:2;;;;;;;;;292:20:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;292:20:12;;;;2391:525:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2391:525:2;;;;;;;;;1037:287:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1037:287:1;;;;;;;;;1713:112:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1713:112:0;;;;;;;;;;;;1080:43:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1080:43:2;;;;;;;;;;;;;;;;;3013:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3013:138:2;;;;;;;;;;;;566:167:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;566:167:12;;;;;;;;;1244:318:2;460:5:12;;-1:-1:-1;;;;;460:5:12;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:12;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1361:18:2;;;;;;:10;:18;;;;;;;;;;1393:25;;;;;;;;;;;;;;;;;;;1361:18;;1360:19;1339:89;;;;-1:-1:-1;;;;;1339:89:2;;;;;;;;;;-1:-1:-1;;;;;;1439:18:2;;;;;;1460:4;1439:18;;;;;;;;:25;;-1:-1:-1;;1439:25:2;;;;;1474:11;27:10:-1;;23:18;;;45:23;;1474:24:2;;;;;;;;-1:-1:-1;;1474:24:2;;;;;1513:42;1544:10;;1439:18;1513:42;;;1244:318;:::o;1129:28::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1129:28:2;;-1:-1:-1;1129:28:2;:::o;1679:431:1:-;1000:10:2;1897:9:1;989:22:2;;;:10;:22;;;;;;;;;1025:21;;;;;;;;;;;;;;;;;;;;989:22;;968:88;;;;;;-1:-1:-1;;;;;968:88:2;;;;;;;;;;;1909:1:1;1897:13;;1892:212;1916:9;:16;1912:1;:20;1892:212;;;1953:140;1991:9;2001:1;1991:12;;;;;;;;;;;;;;;;;;2021:4;2026:1;2021:7;;;;;;;;;;;;;;;;;;2046:2;2049:1;2046:5;;;;;;;;;;;;;;;;;;2069:7;2077:1;2069:10;;;;;;;;;;;;;;;;;;1953:20;:140::i;:::-;1934:3;;1892:212;;;1679:431;;;;;:::o;1676:542:2:-;1909:6;460:5:12;;-1:-1:-1;;;;;460:5:12;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:12;;;;;;;;;-1:-1:-1;;;;;1795:18:2;;;;;;:10;:18;;;;;;;;;;1827:21;;;;;;;;;;;;;;;;;;;1795:18;;1774:84;;;;;;-1:-1:-1;;;;;1774:84:2;;;;;;;;;;-1:-1:-1;;;;;;;1876:18:2;;;;;;:10;:18;;;;;1869:25;;-1:-1:-1;;1869:25:2;;;1904:249;1925:11;:18;1921:22;;1904:249;;;1986:6;-1:-1:-1;;;;;1968:24:2;:11;1980:1;1968:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1968:14:2;:24;1964:179;;;2029:11;2041:18;;-1:-1:-1;;2041:22:2;;;2029:35;;;;;;;;;;;;;;;;2012:11;:14;;-1:-1:-1;;;;;2029:35:2;;;;2024:1;;2012:14;;;;;;;;;;;;;;;:52;;-1:-1:-1;;2012:52:2;-1:-1:-1;;;;;2012:52:2;;;;;;;;;;2082:11;:23;;-1:-1:-1;;2082:23:2;;;;;;:::i;:::-;;2123:5;;1964:179;1945:3;;1904:249;;;2167:44;;2200:10;;-1:-1:-1;;;;;2167:44:2;;;;;;;;1676:542;;:::o;292:20:12:-;;;-1:-1:-1;;;;;292:20:12;;:::o;2391:525:2:-;2544:11;:18;2576:19;;;;;;;;;;;;;;;;;;2536:26;;2515:90;;;;-1:-1:-1;;;;;2515:90:2;;;;;;;;;;;2658:6;-1:-1:-1;;;;;2636:28:2;:11;2648:5;2636:18;;;;;;;;;;;;;;;;;;;;;2678:27;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2636:18:2;;;:28;2615:100;;;;-1:-1:-1;;;;;2615:100:2;;;;;;;;;;-1:-1:-1;;;;;;2733:18:2;;;;;;:10;:18;;;;;2726:25;;-1:-1:-1;;2726:25:2;;;2782:11;2794:18;;-1:-1:-1;;2794:22:2;;;2782:35;;;;;;;;;;;;;;;;2761:11;:18;;-1:-1:-1;;;;;2782:35:2;;;;2773:5;;2761:18;;;;;;;;;;;;;;;:56;;-1:-1:-1;;2761:56:2;-1:-1:-1;;;;;2761:56:2;;;;;;;;;;2827:11;:23;;-1:-1:-1;;2827:23:2;;;;;;:::i;:::-;-1:-1:-1;2865:44:2;;2898:10;;-1:-1:-1;;;;;2865:44:2;;;;;;;;2391:525;;:::o;1037:287:1:-;1000:10:2;989:22;;;;:10;:22;;;;;;;;;;1025:21;;;;;;;;;;;;;;;;;;;989:22;;968:88;;;;;;-1:-1:-1;;;;;968:88:2;;;;;;;;;;;1210:107:1;1244:9;;1210:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1267:4;1285:2;1301:6;1210:20;:107::i;1713:112:0:-;939:1;1713:112;;:::o;1080:43:2:-;;;;;;;;;;;;;;;:::o;3013:138::-;3094:9;3133:11;3126:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3126:18:2;;;;;;;;;;;;;;;;;;;;;;;3013:138;:::o;566:167:12:-;460:5;;-1:-1:-1;;;;;460:5:12;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:12;;;;;;;;;-1:-1:-1;;;;;662:22:12;;;658:69;;700:5;:16;;-1:-1:-1;;700:16:12;-1:-1:-1;;;;;700:16:12;;;;;658:69;566:167;:::o;1192:423:0:-;1387:13;1467:12;1403:25;1415:9;1426:1;1403:11;:25::i;:::-;1482:49;;;;;1387:41;;-1:-1:-1;;;;;;1482:31:0;;;;;:49;;1514:4;;1520:2;;1524:6;;1482:49;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1482:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1482:49:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1482:49:0;;;;;;;;;1583:15;;;;;;;;;;;;;;;;;1467:64;;-1:-1:-1;1541:67:0;;;;;;;-1:-1:-1;;;;;1541:67:0;;;;;;;;;;;1192:423;;;;;;:::o;2855:884:9:-;2976:14;3039:5;3047:2;3039:10;3027:1;:8;:22;;3091:38;;;;;;;;;;;;;;;;;;;;;;;3006:133;;;;;;;-1:-1:-1;;;;;3006:133:9;;;;;;;;;;-1:-1:-1;;3386:2:9;3641:13;;;;;3635:20;3377:11;;;-1:-1:-1;;;;;3631:69:9;2855:884;;;;;:::o;801:1026:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;5:118:-1;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;148:707;;258:4;246:17;;242:27;-1:-1;232:2;;283:1;280;273:12;232:2;320:6;307:20;342:80;357:64;414:6;357:64;;;342:80;;;333:89;;439:5;464:6;457:5;450:21;494:4;486:6;482:17;472:27;;516:4;511:3;507:14;500:21;;569:6;616:3;608:4;600:6;596:17;591:3;587:27;584:36;581:2;;;633:1;630;623:12;581:2;658:1;643:206;668:6;665:1;662:13;643:206;;;726:3;748:37;781:3;769:10;748:37;;;736:50;;-1:-1;809:4;800:14;;;;828;;;;;690:1;683:9;643:206;;;647:14;225:630;;;;;;;;879:693;;994:4;982:17;;978:27;-1:-1;968:2;;1019:1;1016;1009:12;968:2;1056:6;1043:20;1078:85;1093:69;1155:6;1093:69;;1078:85;1191:21;;;1235:4;1223:17;;;;1069:94;;-1:-1;1248:14;;1223:17;1343:1;1328:238;1353:6;1350:1;1347:13;1328:238;;;1436:3;1423:17;1415:6;1411:30;1460:42;1498:3;1486:10;1460:42;;;1448:55;;-1:-1;1526:4;1517:14;;;;1545;;;;;1375:1;1368:9;1328:238;;1598:707;;1708:4;1696:17;;1692:27;-1:-1;1682:2;;1733:1;1730;1723:12;1682:2;1770:6;1757:20;1792:80;1807:64;1864:6;1807:64;;1792:80;1783:89;;1889:5;1914:6;1907:5;1900:21;1944:4;1936:6;1932:17;1922:27;;1966:4;1961:3;1957:14;1950:21;;2019:6;2066:3;2058:4;2050:6;2046:17;2041:3;2037:27;2034:36;2031:2;;;2083:1;2080;2073:12;2031:2;2108:1;2093:206;2118:6;2115:1;2112:13;2093:206;;;2176:3;2198:37;2231:3;2219:10;2198:37;;;2186:50;;-1:-1;2259:4;2250:14;;;;2278;;;;;2140:1;2133:9;2093:206;;2313:116;;2388:36;2416:6;2410:13;2388:36;;2450:335;;;2557:4;2545:17;;2541:27;-1:-1;2531:2;;2582:1;2579;2572:12;2531:2;-1:-1;2602:20;;2642:18;2631:30;;2628:2;;;2674:1;2671;2664:12;2628:2;2708:4;2700:6;2696:17;2684:29;;2758:3;2751;2743:6;2739:16;2729:8;2725:31;2722:40;2719:2;;;2775:1;2772;2765:12;2719:2;2524:261;;;;;;2794:432;;2884:4;2872:17;;2868:27;-1:-1;2858:2;;2909:1;2906;2899:12;2858:2;2946:6;2933:20;2968:60;2983:44;3020:6;2983:44;;2968:60;2959:69;;3048:6;3041:5;3034:21;3084:4;3076:6;3072:17;3117:4;3110:5;3106:16;3152:3;3143:6;3138:3;3134:16;3131:25;3128:2;;;3169:1;3166;3159:12;3128:2;3179:41;3213:6;3208:3;3203;3179:41;;;2851:375;;;;;;;;3234:118;;3301:46;3339:6;3326:20;3301:46;;3359:241;;3463:2;3451:9;3442:7;3438:23;3434:32;3431:2;;;3479:1;3476;3469:12;3431:2;3514:1;3531:53;3576:7;3556:9;3531:53;;;3521:63;3425:175;-1:-1;;;;3425:175;3607:366;;;3728:2;3716:9;3707:7;3703:23;3699:32;3696:2;;;3744:1;3741;3734:12;3696:2;3779:1;3796:53;3841:7;3821:9;3796:53;;;3786:63;;3758:97;3886:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;;;3894:63;;3865:98;3690:283;;;;;;3980:1171;;;;;4240:3;4228:9;4219:7;4215:23;4211:33;4208:2;;;4257:1;4254;4247:12;4208:2;4292:31;;4343:18;4332:30;;4329:2;;;4375:1;4372;4365:12;4329:2;4395:83;4470:7;4461:6;4450:9;4446:22;4395:83;;;4385:93;;4271:213;4543:2;4532:9;4528:18;4515:32;4567:18;4559:6;4556:30;4553:2;;;4599:1;4596;4589:12;4553:2;4619:78;4689:7;4680:6;4669:9;4665:22;4619:78;;;4609:88;;4494:209;4762:2;4751:9;4747:18;4734:32;4786:18;4778:6;4775:30;4772:2;;;4818:1;4815;4808:12;4772:2;4838:78;4908:7;4899:6;4888:9;4884:22;4838:78;;;4828:88;;4713:209;4981:2;4970:9;4966:18;4953:32;5005:18;4997:6;4994:30;4991:2;;;5037:1;5034;5027:12;4991:2;5057:78;5127:7;5118:6;5107:9;5103:22;5057:78;;;5047:88;;4932:209;4202:949;;;;;;;;5158:257;;5270:2;5258:9;5249:7;5245:23;5241:32;5238:2;;;5286:1;5283;5276:12;5238:2;5321:1;5338:61;5391:7;5371:9;5338:61;;5422:741;;;;;;5596:3;5584:9;5575:7;5571:23;5567:33;5564:2;;;5613:1;5610;5603:12;5564:2;5648:31;;5699:18;5688:30;;5685:2;;;5731:1;5728;5721:12;5685:2;5759:64;5815:7;5806:6;5795:9;5791:22;5759:64;;;5741:82;;;;5627:202;5860:2;5878:53;5923:7;5914:6;5903:9;5899:22;5878:53;;;5868:63;;5839:98;5968:2;5986:53;6031:7;6022:6;6011:9;6007:22;5986:53;;;5976:63;;5947:98;6076:2;6094:53;6139:7;6130:6;6119:9;6115:22;6094:53;;;6084:63;;6055:98;5558:605;;;;;;;;;6170:241;;6274:2;6262:9;6253:7;6249:23;6245:32;6242:2;;;6290:1;6287;6280:12;6242:2;6325:1;6342:53;6387:7;6367:9;6342:53;;6418:110;6491:31;6516:5;6491:31;;;6486:3;6479:44;6473:55;;;6566:590;;6701:54;6749:5;6701:54;;;6773:6;6768:3;6761:19;6797:4;6792:3;6788:14;6781:21;;6842:56;6892:5;6842:56;;;6919:1;6904:230;6929:6;6926:1;6923:13;6904:230;;;6969:53;7018:3;7009:6;7003:13;6969:53;;;7039:60;7092:6;7039:60;;;7122:4;7113:14;;;;;7029:70;-1:-1;6951:1;6944:9;6904:230;;;-1:-1;7147:3;;6680:476;-1:-1;;;;6680:476;7164:101;7231:28;7253:5;7231:28;;7272:292;;7370:35;7399:5;7370:35;;;7422:6;7417:3;7410:19;7434:63;7490:6;7483:4;7478:3;7474:14;7467:4;7460:5;7456:16;7434:63;;;7529:29;7551:6;7529:29;;;7509:50;;;7522:4;7509:50;;7350:214;-1:-1;;;7350:214;7572:397;7727:2;7715:15;;7764:66;7759:2;7750:12;;7743:88;7865:66;7860:2;7851:12;;7844:88;7960:2;7951:12;;7708:261;7977:110;8050:31;8075:5;8050:31;;8094:104;8163:29;8186:5;8163:29;;8205:193;8313:2;8298:18;;8327:61;8302:9;8361:6;8327:61;;8405:395;8569:2;8554:18;;8583:61;8558:9;8617:6;8583:61;;;8655:62;8713:2;8702:9;8698:18;8689:6;8655:62;;;8728;8786:2;8775:9;8771:18;8762:6;8728:62;;8807:341;8965:2;8979:47;;;8950:18;;9040:98;8950:18;9124:6;9040:98;;9155:181;9257:2;9242:18;;9271:55;9246:9;9299:6;9271:55;;9343:273;9467:2;9481:47;;;9452:18;;9542:64;9452:18;9592:6;9542:64;;9623:387;9804:2;9818:47;;;9789:18;;9879:121;9789:18;9879:121;;10017:185;10121:2;10106:18;;10135:57;10110:9;10165:6;10135:57;;10209:256;10271:2;10265:9;10297:17;;;10372:18;10357:34;;10393:22;;;10354:62;10351:2;;;10429:1;10426;10419:12;10351:2;10445;10438:22;10249:216;;-1:-1;10249:216;10472:258;;10631:18;10623:6;10620:30;10617:2;;;10663:1;10660;10653:12;10617:2;-1:-1;10692:4;10680:17;;;10710:15;;10554:176;11272:254;;11411:18;11403:6;11400:30;11397:2;;;11443:1;11440;11433:12;11397:2;-1:-1;11516:4;11487;11464:17;;;;-1:-1;;11460:33;11506:15;;11334:192;11535:121;11644:4;11632:17;;11613:43;11665:107;11755:12;;11739:33;12005:128;-1:-1;;;;;12074:54;;12057:76;12140:92;12213:13;12206:21;;12189:43;12325:88;12403:4;12392:16;;12375:38;12741:145;12822:6;12817:3;12812;12799:30;-1:-1;12878:1;12860:16;;12853:27;12792:94;12895:268;12960:1;12967:101;12981:6;12978:1;12975:13;12967:101;;;13048:11;;;13042:18;13029:11;;;13022:39;13003:2;12996:10;12967:101;;;13083:6;13080:1;13077:13;13074:2;;;13148:1;13139:6;13134:3;13130:16;13123:27;13074:2;12944:219;;;;;13171:97;13259:2;13239:14;-1:-1;;13235:28;;13219:49" + "object": "0x6080604052600436106100ae5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100b3578063494503d4146100d5578063563c875d1461010b578063707129391461012b5780638da5cb5b1461014b5780639ad2674414610160578063a85e59e414610180578063ae25532e146101a0578063b9181611146101c2578063d39de6e9146101ef578063f2fde38b14610211575b600080fd5b3480156100bf57600080fd5b506100d36100ce366004610ea7565b610231565b005b3480156100e157600080fd5b506100f56100f0366004611044565b610378565b604051610102919061116e565b60405180910390f35b34801561011757600080fd5b506100d3610126366004610f07565b6103a0565b34801561013757600080fd5b506100d3610146366004610ea7565b610493565b34801561015757600080fd5b506100f5610661565b34801561016c57600080fd5b506100d361017b366004610ecd565b610670565b34801561018c57600080fd5b506100d361019b366004610fc7565b610832565b3480156101ac57600080fd5b506101b56108de565b60405161010291906111e4565b3480156101ce57600080fd5b506101e26101dd366004610ea7565b6108e4565b60405161010291906111b5565b3480156101fb57600080fd5b506102046108f9565b60405161010291906111a4565b34801561021d57600080fd5b506100d361022c366004610ea7565b61095b565b600054600160a060020a031633146102675760405160e560020a62461bcd02815260040161025e906111d4565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156102dc5760405160e560020a62461bcd02815260040161025e91906111c3565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b600280548290811061038657fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff16151561040d5760405160e560020a62461bcd02815260040161025e91906111c3565b50600090505b845181101561048c57610484858281518110151561042d57fe5b90602001906020020151858381518110151561044557fe5b90602001906020020151858481518110151561045d57fe5b90602001906020020151858581518110151561047557fe5b906020019060200201516109c3565b600101610413565b5050505050565b60008054600160a060020a031633146104c15760405160e560020a62461bcd02815260040161025e906111d4565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105375760405160e560020a62461bcd02815260040161025e91906111c3565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b6002548110156106275781600160a060020a031660028281548110151561057d57fe5b600091825260209091200154600160a060020a0316141561061f576002805460001981019081106105aa57fe5b60009182526020909120015460028054600160a060020a0390921691839081106105d057fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906106199082610c5d565b50610627565b60010161055a565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e44530000000000000000000000000060208201529082106106ca5760405160e560020a62461bcd02815260040161025e91906111c3565b5081600160a060020a03166002828154811015156106e457fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107555760405160e560020a62461bcd02815260040161025e91906111c3565b50600160a060020a0382166000908152600160205260409020805460ff1916905560028054600019810190811061078857fe5b60009182526020909120015460028054600160a060020a0390921691839081106107ae57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906107f79082610c5d565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff16151561089f5760405160e560020a62461bcd02815260040161025e91906111c3565b5061048c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508484846109c3565b60015b90565b60016020526000908152604090205460ff1681565b6060600280548060200260200160405190810160405280929190818152602001828054801561095157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610933575b5050505050905090565b600054600160a060020a031633146109885760405160e560020a62461bcd02815260040161025e906111d4565b600160a060020a038116156109c0576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b6000806109d1866000610bb6565b604051909250600160a060020a038316907f23b872dd0000000000000000000000000000000000000000000000000000000090610a169088908890889060240161117c565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b83811015610a9c578181015183820152602001610a84565b50505050905090810190601f168015610ac95780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af160408051808201909152600f81527f5452414e534645525f4641494c454400000000000000000000000000000000006020820152909350915050811515610b385760405160e560020a62461bcd02815260040161025e91906111c3565b503d15610b56575060003d60201415610b565760206000803e506000515b60408051808201909152600f81527f5452414e534645525f4641494c454400000000000000000000000000000000006020820152811515610bad5760405160e560020a62461bcd02815260040161025e91906111c3565b50505050505050565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610c405760405160e560020a62461bcd02815260040161025e91906111c3565b50506014818301810151910190600160a060020a03165b92915050565b815481835581811115610c8157600083815260209020610c81918101908301610c86565b505050565b6108e191905b80821115610ca05760008155600101610c8c565b5090565b6000610cb0823561126c565b9392505050565b6000601f82018313610cc857600080fd5b8135610cdb610cd682611219565b6111f2565b91508181835260208401935060208101905083856020840282011115610d0057600080fd5b60005b83811015610d2c5781610d168882610ca4565b8452506020928301929190910190600101610d03565b5050505092915050565b6000601f82018313610d4757600080fd5b8135610d55610cd682611219565b81815260209384019390925082018360005b83811015610d2c5781358601610d7d8882610e4c565b8452506020928301929190910190600101610d67565b6000601f82018313610da457600080fd5b8135610db2610cd682611219565b91508181835260208401935060208101905083856020840282011115610dd757600080fd5b60005b83811015610d2c5781610ded8882610e9b565b8452506020928301929190910190600101610dda565b600080601f83018413610e1557600080fd5b50813567ffffffffffffffff811115610e2d57600080fd5b602083019150836001820283011115610e4557600080fd5b9250929050565b6000601f82018313610e5d57600080fd5b8135610e6b610cd68261123a565b91508082526020830160208301858383011115610e8757600080fd5b610e92838284611283565b50505092915050565b6000610cb082356108e1565b600060208284031215610eb957600080fd5b6000610ec58484610ca4565b949350505050565b60008060408385031215610ee057600080fd5b6000610eec8585610ca4565b9250506020610efd85828601610e9b565b9150509250929050565b60008060008060808587031215610f1d57600080fd5b843567ffffffffffffffff811115610f3457600080fd5b610f4087828801610d36565b945050602085013567ffffffffffffffff811115610f5d57600080fd5b610f6987828801610cb7565b935050604085013567ffffffffffffffff811115610f8657600080fd5b610f9287828801610cb7565b925050606085013567ffffffffffffffff811115610faf57600080fd5b610fbb87828801610d93565b91505092959194509250565b600080600080600060808688031215610fdf57600080fd5b853567ffffffffffffffff811115610ff657600080fd5b61100288828901610e03565b9550955050602061101588828901610ca4565b935050604061102688828901610ca4565b925050606061103788828901610e9b565b9150509295509295909350565b60006020828403121561105657600080fd5b6000610ec58484610e9b565b61106b8161126c565b82525050565b600061107c82611268565b80845260208401935061108e83611262565b60005b828110156110be576110a4868351611062565b6110ad82611262565b602096909601959150600101611091565b5093949350505050565b61106b81611278565b60006110dc82611268565b8084526110f081602086016020860161128f565b6110f9816112bf565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b61106b816108e1565b61106b8161127d565b60208101610c578284611062565b6060810161118a8286611062565b6111976020830185611062565b610ec5604083018461115c565b60208082528101610cb08184611071565b60208101610c5782846110c8565b60208082528101610cb081846110d1565b60208082528101610c5781611106565b60208101610c578284611165565b60405181810167ffffffffffffffff8111828210171561121157600080fd5b604052919050565b600067ffffffffffffffff82111561123057600080fd5b5060209081020190565b600067ffffffffffffffff82111561125157600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156112aa578181015183820152602001611292565b838111156112b9576000848401525b50505050565b601f01601f1916905600a265627a7a723058209dbaf0a0b2a02e72b8d78685384ac31ca7d68ad4294dcb7fc1086cd8435404696c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xAE JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xB3 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xD5 JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x10B JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x12B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x14B JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x160 JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x180 JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1A0 JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x1C2 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x1EF JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x211 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0xCE CALLDATASIZE PUSH1 0x4 PUSH2 0xEA7 JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF5 PUSH2 0xF0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1044 JUMP JUMPDEST PUSH2 0x378 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x117 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x126 CALLDATASIZE PUSH1 0x4 PUSH2 0xF07 JUMP JUMPDEST PUSH2 0x3A0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x137 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x146 CALLDATASIZE PUSH1 0x4 PUSH2 0xEA7 JUMP JUMPDEST PUSH2 0x493 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF5 PUSH2 0x661 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x17B CALLDATASIZE PUSH1 0x4 PUSH2 0xECD JUMP JUMPDEST PUSH2 0x670 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x19B CALLDATASIZE PUSH1 0x4 PUSH2 0xFC7 JUMP JUMPDEST PUSH2 0x832 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B5 PUSH2 0x8DE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x11E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E2 PUSH2 0x1DD CALLDATASIZE PUSH1 0x4 PUSH2 0xEA7 JUMP JUMPDEST PUSH2 0x8E4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x11B5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x204 PUSH2 0x8F9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x102 SWAP2 SWAP1 PUSH2 0x11A4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x22C CALLDATASIZE PUSH1 0x4 PUSH2 0xEA7 JUMP JUMPDEST PUSH2 0x95B JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x267 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP1 PUSH2 0x11D4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x2DC JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x386 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x40D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x48C JUMPI PUSH2 0x484 DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x42D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x445 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x45D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x475 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x9C3 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x413 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4C1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP1 PUSH2 0x11D4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x537 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x627 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x57D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x61F JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x5AA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x5D0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x619 SWAP1 DUP3 PUSH2 0xC5D JUMP JUMPDEST POP PUSH2 0x627 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x55A JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x6CA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6E4 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x755 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x788 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x7AE JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x7F7 SWAP1 DUP3 PUSH2 0xC5D JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x89F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP PUSH2 0x48C DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0x9C3 JUMP JUMPDEST PUSH1 0x1 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x951 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x933 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x988 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP1 PUSH2 0x11D4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0x9C0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x9D1 DUP7 PUSH1 0x0 PUSH2 0xBB6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND SWAP1 PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xA16 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x117C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA9C JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA84 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xAC9 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP4 POP SWAP2 POP POP DUP2 ISZERO ISZERO PUSH2 0xB38 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP RETURNDATASIZE ISZERO PUSH2 0xB56 JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0xB56 JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 ISZERO ISZERO PUSH2 0xBAD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xC40 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x25E SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xC81 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xC81 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xC86 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x8E1 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xCA0 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xC8C JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB0 DUP3 CALLDATALOAD PUSH2 0x126C JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xCC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xCDB PUSH2 0xCD6 DUP3 PUSH2 0x1219 JUMP JUMPDEST PUSH2 0x11F2 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xD00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD2C JUMPI DUP2 PUSH2 0xD16 DUP9 DUP3 PUSH2 0xCA4 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xD03 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xD47 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xD55 PUSH2 0xCD6 DUP3 PUSH2 0x1219 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD2C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xD7D DUP9 DUP3 PUSH2 0xE4C JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xD67 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xDA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xDB2 PUSH2 0xCD6 DUP3 PUSH2 0x1219 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xDD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD2C JUMPI DUP2 PUSH2 0xDED DUP9 DUP3 PUSH2 0xE9B JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xDDA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0xE15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0xE45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xE5D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xE6B PUSH2 0xCD6 DUP3 PUSH2 0x123A JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0xE87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE92 DUP4 DUP3 DUP5 PUSH2 0x1283 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB0 DUP3 CALLDATALOAD PUSH2 0x8E1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xEB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEC5 DUP5 DUP5 PUSH2 0xCA4 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xEE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEEC DUP6 DUP6 PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xEFD DUP6 DUP3 DUP7 ADD PUSH2 0xE9B JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xF1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF40 DUP8 DUP3 DUP9 ADD PUSH2 0xD36 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF5D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF69 DUP8 DUP3 DUP9 ADD PUSH2 0xCB7 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF86 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF92 DUP8 DUP3 DUP9 ADD PUSH2 0xCB7 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xFBB DUP8 DUP3 DUP9 ADD PUSH2 0xD93 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xFDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1002 DUP9 DUP3 DUP10 ADD PUSH2 0xE03 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0x1015 DUP9 DUP3 DUP10 ADD PUSH2 0xCA4 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x1026 DUP9 DUP3 DUP10 ADD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x1037 DUP9 DUP3 DUP10 ADD PUSH2 0xE9B JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1056 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xEC5 DUP5 DUP5 PUSH2 0xE9B JUMP JUMPDEST PUSH2 0x106B DUP2 PUSH2 0x126C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x107C DUP3 PUSH2 0x1268 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x108E DUP4 PUSH2 0x1262 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x10BE JUMPI PUSH2 0x10A4 DUP7 DUP4 MLOAD PUSH2 0x1062 JUMP JUMPDEST PUSH2 0x10AD DUP3 PUSH2 0x1262 JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1091 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x106B DUP2 PUSH2 0x1278 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10DC DUP3 PUSH2 0x1268 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x10F0 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x128F JUMP JUMPDEST PUSH2 0x10F9 DUP2 PUSH2 0x12BF JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0x106B DUP2 PUSH2 0x8E1 JUMP JUMPDEST PUSH2 0x106B DUP2 PUSH2 0x127D JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC57 DUP3 DUP5 PUSH2 0x1062 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x118A DUP3 DUP7 PUSH2 0x1062 JUMP JUMPDEST PUSH2 0x1197 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1062 JUMP JUMPDEST PUSH2 0xEC5 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x115C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCB0 DUP2 DUP5 PUSH2 0x1071 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC57 DUP3 DUP5 PUSH2 0x10C8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCB0 DUP2 DUP5 PUSH2 0x10D1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC57 DUP2 PUSH2 0x1106 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC57 DUP3 DUP5 PUSH2 0x1165 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1211 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1230 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x12AA JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1292 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x12B9 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 SWAP14 0xba CREATE LOG0 0xb2 LOG0 0x2e PUSH19 0xB8D78685384AC31CA7D68AD4294DCB7FC1086C 0xd8 NUMBER SLOAD DIV PUSH10 0x6C6578706572696D656E PUSH21 0x616CF5003700000000000000000000000000000000 ", + "sourceMap": "801:1973:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1244:318:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1244:318:2;;;;;;;;;;;1129:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1129:28:2;;;;;;;;;;;;;;;;;;;;;;;;;1679:431:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1679:431:1;;;;;;;;;1676:542:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1676:542:2;;;;;;;;;292:20:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;292:20:12;;;;2391:525:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2391:525:2;;;;;;;;;1037:287:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1037:287:1;;;;;;;;;2660:112:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2660:112:0;;;;;;;;;;;;1080:43:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1080:43:2;;;;;;;;;;;;;;;;;3013:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3013:138:2;;;;;;;;;;;;566:167:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;566:167:12;;;;;;;;;1244:318:2;460:5:12;;-1:-1:-1;;;;;460:5:12;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:12;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1361:18:2;;;;;;:10;:18;;;;;;;;;;1393:25;;;;;;;;;;;;;;;;;;;1361:18;;1360:19;1339:89;;;;-1:-1:-1;;;;;1339:89:2;;;;;;;;;;-1:-1:-1;;;;;;1439:18:2;;;;;;1460:4;1439:18;;;;;;;;:25;;-1:-1:-1;;1439:25:2;;;;;1474:11;27:10:-1;;23:18;;;45:23;;1474:24:2;;;;;;;;-1:-1:-1;;1474:24:2;;;;;1513:42;1544:10;;1439:18;1513:42;;;1244:318;:::o;1129:28::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1129:28:2;;-1:-1:-1;1129:28:2;:::o;1679:431:1:-;1000:10:2;1897:9:1;989:22:2;;;:10;:22;;;;;;;;;1025:21;;;;;;;;;;;;;;;;;;;;989:22;;968:88;;;;;;-1:-1:-1;;;;;968:88:2;;;;;;;;;;;1909:1:1;1897:13;;1892:212;1916:9;:16;1912:1;:20;1892:212;;;1953:140;1991:9;2001:1;1991:12;;;;;;;;;;;;;;;;;;2021:4;2026:1;2021:7;;;;;;;;;;;;;;;;;;2046:2;2049:1;2046:5;;;;;;;;;;;;;;;;;;2069:7;2077:1;2069:10;;;;;;;;;;;;;;;;;;1953:20;:140::i;:::-;1934:3;;1892:212;;;1679:431;;;;;:::o;1676:542:2:-;1909:6;460:5:12;;-1:-1:-1;;;;;460:5:12;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:12;;;;;;;;;-1:-1:-1;;;;;1795:18:2;;;;;;:10;:18;;;;;;;;;;1827:21;;;;;;;;;;;;;;;;;;;1795:18;;1774:84;;;;;;-1:-1:-1;;;;;1774:84:2;;;;;;;;;;-1:-1:-1;;;;;;;1876:18:2;;;;;;:10;:18;;;;;1869:25;;-1:-1:-1;;1869:25:2;;;1904:249;1925:11;:18;1921:22;;1904:249;;;1986:6;-1:-1:-1;;;;;1968:24:2;:11;1980:1;1968:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1968:14:2;:24;1964:179;;;2029:11;2041:18;;-1:-1:-1;;2041:22:2;;;2029:35;;;;;;;;;;;;;;;;2012:11;:14;;-1:-1:-1;;;;;2029:35:2;;;;2024:1;;2012:14;;;;;;;;;;;;;;;:52;;-1:-1:-1;;2012:52:2;-1:-1:-1;;;;;2012:52:2;;;;;;;;;;2082:11;:23;;-1:-1:-1;;2082:23:2;;;;;;:::i;:::-;;2123:5;;1964:179;1945:3;;1904:249;;;2167:44;;2200:10;;-1:-1:-1;;;;;2167:44:2;;;;;;;;1676:542;;:::o;292:20:12:-;;;-1:-1:-1;;;;;292:20:12;;:::o;2391:525:2:-;2544:11;:18;2576:19;;;;;;;;;;;;;;;;;;2536:26;;2515:90;;;;-1:-1:-1;;;;;2515:90:2;;;;;;;;;;;2658:6;-1:-1:-1;;;;;2636:28:2;:11;2648:5;2636:18;;;;;;;;;;;;;;;;;;;;;2678:27;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2636:18:2;;;:28;2615:100;;;;-1:-1:-1;;;;;2615:100:2;;;;;;;;;;-1:-1:-1;;;;;;2733:18:2;;;;;;:10;:18;;;;;2726:25;;-1:-1:-1;;2726:25:2;;;2782:11;2794:18;;-1:-1:-1;;2794:22:2;;;2782:35;;;;;;;;;;;;;;;;2761:11;:18;;-1:-1:-1;;;;;2782:35:2;;;;2773:5;;2761:18;;;;;;;;;;;;;;;:56;;-1:-1:-1;;2761:56:2;-1:-1:-1;;;;;2761:56:2;;;;;;;;;;2827:11;:23;;-1:-1:-1;;2827:23:2;;;;;;:::i;:::-;-1:-1:-1;2865:44:2;;2898:10;;-1:-1:-1;;;;;2865:44:2;;;;;;;;2391:525;;:::o;1037:287:1:-;1000:10:2;989:22;;;;:10;:22;;;;;;;;;;1025:21;;;;;;;;;;;;;;;;;;;989:22;;968:88;;;;;;-1:-1:-1;;;;;968:88:2;;;;;;;;;;;1210:107:1;1244:9;;1210:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1267:4;1285:2;1301:6;1210:20;:107::i;2660:112:0:-;939:1;2660:112;;:::o;1080:43:2:-;;;;;;;;;;;;;;;:::o;3013:138::-;3094:9;3133:11;3126:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3126:18:2;;;;;;;;;;;;;;;;;;;;;;;3013:138;:::o;566:167:12:-;460:5;;-1:-1:-1;;;;;460:5:12;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:12;;;;;;;;;-1:-1:-1;;;;;662:22:12;;;658:69;;700:5;:16;;-1:-1:-1;;700:16:12;-1:-1:-1;;;;;700:16:12;;;;;658:69;566:167;:::o;1192:1370:0:-;1387:13;1565:12;1403:25;1415:9;1426:1;1403:11;:25::i;:::-;1591:140;;1387:41;;-1:-1:-1;;;;;;1580:10:0;;;1627:40;;1591:140;;1681:4;;1699:2;;1715:6;;1591:140;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;1591:140:0;;;49:4:-1;25:18;;61:17;;1591:140:0;182:15:-1;1591:140:0;;;;179:29:-1;;;;160:49;;1580:152:0;;;1591:140;;1580:152;;;;25:18:-1;1580:152:0;;25:18:-1;-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1580:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1784:15;;;;;;;;;;;;;;;;;1580:152;;-1:-1:-1;1784:15:0;-1:-1:-1;;1742:67:0;;;;;;;-1:-1:-1;;;;;1742:67:0;;;;;;;;;;;2188:14;2185:2;;;-1:-1:-1;2232:1:0;2256:14;2272:2;2253:22;2250:2;;;2394;2391:1;2388;2373:24;-1:-1:-1;2435:1:0;2429:8;2250:2;2530:15;;;;;;;;;;;;;;;;;2488:67;;;;;;;-1:-1:-1;;;;;2488:67:0;;;;;;;;;;;1192:1370;;;;;;:::o;2855:884:9:-;2976:14;3039:5;3047:2;3039:10;3027:1;:8;:22;;3091:38;;;;;;;;;;;;;;;;;;;;;;;3006:133;;;;;;;-1:-1:-1;;;;;3006:133:9;;;;;;;;;;-1:-1:-1;;3386:2:9;3641:13;;;;;3635:20;3377:11;;;-1:-1:-1;;;;;3631:69:9;2855:884;;;;;:::o;801:1973:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;5:118:-1;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;148:707;;258:4;246:17;;242:27;-1:-1;232:2;;283:1;280;273:12;232:2;320:6;307:20;342:80;357:64;414:6;357:64;;;342:80;;;333:89;;439:5;464:6;457:5;450:21;494:4;486:6;482:17;472:27;;516:4;511:3;507:14;500:21;;569:6;616:3;608:4;600:6;596:17;591:3;587:27;584:36;581:2;;;633:1;630;623:12;581:2;658:1;643:206;668:6;665:1;662:13;643:206;;;726:3;748:37;781:3;769:10;748:37;;;736:50;;-1:-1;809:4;800:14;;;;828;;;;;690:1;683:9;643:206;;;647:14;225:630;;;;;;;;879:693;;994:4;982:17;;978:27;-1:-1;968:2;;1019:1;1016;1009:12;968:2;1056:6;1043:20;1078:85;1093:69;1155:6;1093:69;;1078:85;1191:21;;;1235:4;1223:17;;;;1069:94;;-1:-1;1248:14;;1223:17;1343:1;1328:238;1353:6;1350:1;1347:13;1328:238;;;1436:3;1423:17;1415:6;1411:30;1460:42;1498:3;1486:10;1460:42;;;1448:55;;-1:-1;1526:4;1517:14;;;;1545;;;;;1375:1;1368:9;1328:238;;1598:707;;1708:4;1696:17;;1692:27;-1:-1;1682:2;;1733:1;1730;1723:12;1682:2;1770:6;1757:20;1792:80;1807:64;1864:6;1807:64;;1792:80;1783:89;;1889:5;1914:6;1907:5;1900:21;1944:4;1936:6;1932:17;1922:27;;1966:4;1961:3;1957:14;1950:21;;2019:6;2066:3;2058:4;2050:6;2046:17;2041:3;2037:27;2034:36;2031:2;;;2083:1;2080;2073:12;2031:2;2108:1;2093:206;2118:6;2115:1;2112:13;2093:206;;;2176:3;2198:37;2231:3;2219:10;2198:37;;;2186:50;;-1:-1;2259:4;2250:14;;;;2278;;;;;2140:1;2133:9;2093:206;;2327:335;;;2434:4;2422:17;;2418:27;-1:-1;2408:2;;2459:1;2456;2449:12;2408:2;-1:-1;2479:20;;2519:18;2508:30;;2505:2;;;2551:1;2548;2541:12;2505:2;2585:4;2577:6;2573:17;2561:29;;2635:3;2628;2620:6;2616:16;2606:8;2602:31;2599:40;2596:2;;;2652:1;2649;2642:12;2596:2;2401:261;;;;;;2671:432;;2761:4;2749:17;;2745:27;-1:-1;2735:2;;2786:1;2783;2776:12;2735:2;2823:6;2810:20;2845:60;2860:44;2897:6;2860:44;;2845:60;2836:69;;2925:6;2918:5;2911:21;2961:4;2953:6;2949:17;2994:4;2987:5;2983:16;3029:3;3020:6;3015:3;3011:16;3008:25;3005:2;;;3046:1;3043;3036:12;3005:2;3056:41;3090:6;3085:3;3080;3056:41;;;2728:375;;;;;;;;3111:118;;3178:46;3216:6;3203:20;3178:46;;3236:241;;3340:2;3328:9;3319:7;3315:23;3311:32;3308:2;;;3356:1;3353;3346:12;3308:2;3391:1;3408:53;3453:7;3433:9;3408:53;;;3398:63;3302:175;-1:-1;;;;3302:175;3484:366;;;3605:2;3593:9;3584:7;3580:23;3576:32;3573:2;;;3621:1;3618;3611:12;3573:2;3656:1;3673:53;3718:7;3698:9;3673:53;;;3663:63;;3635:97;3763:2;3781:53;3826:7;3817:6;3806:9;3802:22;3781:53;;;3771:63;;3742:98;3567:283;;;;;;3857:1171;;;;;4117:3;4105:9;4096:7;4092:23;4088:33;4085:2;;;4134:1;4131;4124:12;4085:2;4169:31;;4220:18;4209:30;;4206:2;;;4252:1;4249;4242:12;4206:2;4272:83;4347:7;4338:6;4327:9;4323:22;4272:83;;;4262:93;;4148:213;4420:2;4409:9;4405:18;4392:32;4444:18;4436:6;4433:30;4430:2;;;4476:1;4473;4466:12;4430:2;4496:78;4566:7;4557:6;4546:9;4542:22;4496:78;;;4486:88;;4371:209;4639:2;4628:9;4624:18;4611:32;4663:18;4655:6;4652:30;4649:2;;;4695:1;4692;4685:12;4649:2;4715:78;4785:7;4776:6;4765:9;4761:22;4715:78;;;4705:88;;4590:209;4858:2;4847:9;4843:18;4830:32;4882:18;4874:6;4871:30;4868:2;;;4914:1;4911;4904:12;4868:2;4934:78;5004:7;4995:6;4984:9;4980:22;4934:78;;;4924:88;;4809:209;4079:949;;;;;;;;5035:741;;;;;;5209:3;5197:9;5188:7;5184:23;5180:33;5177:2;;;5226:1;5223;5216:12;5177:2;5261:31;;5312:18;5301:30;;5298:2;;;5344:1;5341;5334:12;5298:2;5372:64;5428:7;5419:6;5408:9;5404:22;5372:64;;;5354:82;;;;5240:202;5473:2;5491:53;5536:7;5527:6;5516:9;5512:22;5491:53;;;5481:63;;5452:98;5581:2;5599:53;5644:7;5635:6;5624:9;5620:22;5599:53;;;5589:63;;5560:98;5689:2;5707:53;5752:7;5743:6;5732:9;5728:22;5707:53;;;5697:63;;5668:98;5171:605;;;;;;;;;5783:241;;5887:2;5875:9;5866:7;5862:23;5858:32;5855:2;;;5903:1;5900;5893:12;5855:2;5938:1;5955:53;6000:7;5980:9;5955:53;;6031:110;6104:31;6129:5;6104:31;;;6099:3;6092:44;6086:55;;;6179:590;;6314:54;6362:5;6314:54;;;6386:6;6381:3;6374:19;6410:4;6405:3;6401:14;6394:21;;6455:56;6505:5;6455:56;;;6532:1;6517:230;6542:6;6539:1;6536:13;6517:230;;;6582:53;6631:3;6622:6;6616:13;6582:53;;;6652:60;6705:6;6652:60;;;6735:4;6726:14;;;;;6642:70;-1:-1;6564:1;6557:9;6517:230;;;-1:-1;6760:3;;6293:476;-1:-1;;;;6293:476;6777:101;6844:28;6866:5;6844:28;;6885:292;;6983:35;7012:5;6983:35;;;7035:6;7030:3;7023:19;7047:63;7103:6;7096:4;7091:3;7087:14;7080:4;7073:5;7069:16;7047:63;;;7142:29;7164:6;7142:29;;;7122:50;;;7135:4;7122:50;;6963:214;-1:-1;;;6963:214;7185:397;7340:2;7328:15;;7377:66;7372:2;7363:12;;7356:88;7478:66;7473:2;7464:12;;7457:88;7573:2;7564:12;;7321:261;7590:110;7663:31;7688:5;7663:31;;7707:104;7776:29;7799:5;7776:29;;7818:193;7926:2;7911:18;;7940:61;7915:9;7974:6;7940:61;;8018:395;8182:2;8167:18;;8196:61;8171:9;8230:6;8196:61;;;8268:62;8326:2;8315:9;8311:18;8302:6;8268:62;;;8341;8399:2;8388:9;8384:18;8375:6;8341:62;;8420:341;8578:2;8592:47;;;8563:18;;8653:98;8563:18;8737:6;8653:98;;8768:181;8870:2;8855:18;;8884:55;8859:9;8912:6;8884:55;;8956:273;9080:2;9094:47;;;9065:18;;9155:64;9065:18;9205:6;9155:64;;9236:387;9417:2;9431:47;;;9402:18;;9492:121;9402:18;9492:121;;9630:185;9734:2;9719:18;;9748:57;9723:9;9778:6;9748:57;;9822:256;9884:2;9878:9;9910:17;;;9985:18;9970:34;;10006:22;;;9967:62;9964:2;;;10042:1;10039;10032:12;9964:2;10058;10051:22;9862:216;;-1:-1;9862:216;10085:258;;10244:18;10236:6;10233:30;10230:2;;;10276:1;10273;10266:12;10230:2;-1:-1;10305:4;10293:17;;;10323:15;;10167:176;10885:254;;11024:18;11016:6;11013:30;11010:2;;;11056:1;11053;11046:12;11010:2;-1:-1;11129:4;11100;11077:17;;;;-1:-1;;11073:33;11119:15;;10947:192;11148:121;11257:4;11245:17;;11226:43;11278:107;11368:12;;11352:33;11618:128;-1:-1;;;;;11687:54;;11670:76;11753:92;11826:13;11819:21;;11802:43;11938:88;12016:4;12005:16;;11988:38;12255:145;12336:6;12331:3;12326;12313:30;-1:-1;12392:1;12374:16;;12367:27;12306:94;12409:268;12474:1;12481:101;12495:6;12492:1;12489:13;12481:101;;;12562:11;;;12556:18;12543:11;;;12536:39;12517:2;12510:10;12481:101;;;12597:6;12594:1;12591:13;12588:2;;;12662:1;12653:6;12648:3;12644:16;12637:27;12588:2;12458:219;;;;;12685:97;12773:2;12753:14;-1:-1;;12749:28;;12733:49" } } }, @@ -287,7 +287,7 @@ } }, "sourceCodes": { - "current/protocol/AssetProxy/ERC20Proxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAssetProxy.sol\";\nimport \"./MixinAuthorizable.sol\";\nimport \"../../tokens/ERC20Token/IERC20Token.sol\";\n\ncontract ERC20Proxy is\n LibBytes,\n MixinAssetProxy,\n MixinAuthorizable\n{\n\n // Id of this proxy.\n uint8 constant PROXY_ID = 1;\n\n /// @dev Internal version of `transferFrom`.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFromInternal(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Decode asset data.\n address token = readAddress(assetData, 0);\n\n // Transfer tokens.\n bool success = IERC20Token(token).transferFrom(from, to, amount);\n require(\n success,\n TRANSFER_FAILED\n );\n }\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n view\n returns (uint8)\n {\n return PROXY_ID;\n }\n}\n", + "current/protocol/AssetProxy/ERC20Proxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAssetProxy.sol\";\nimport \"./MixinAuthorizable.sol\";\nimport \"../../tokens/ERC20Token/IERC20Token.sol\";\n\ncontract ERC20Proxy is\n LibBytes,\n MixinAssetProxy,\n MixinAuthorizable\n{\n\n // Id of this proxy.\n uint8 constant PROXY_ID = 1;\n\n /// @dev Internal version of `transferFrom`.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFromInternal(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Decode asset data.\n address token = readAddress(assetData, 0);\n\n // Transfer tokens.\n // We do a raw call so we can check the success separate\n // from the return data.\n bool success = token.call(abi.encodeWithSelector(\n IERC20Token(token).transferFrom.selector,\n from,\n to,\n amount\n ));\n require(\n success,\n TRANSFER_FAILED\n );\n \n // Check return data.\n // If there is no return data, we assume the token incorrectly\n // does not return a bool. In this case we expect it to revert\n // on failure, which was handled above.\n // If the token does return data, we require that it is a single\n // value that evaluates to true.\n assembly {\n if returndatasize {\n success := 0\n if eq(returndatasize, 32) {\n // First 64 bytes of memory are reserved scratch space\n returndatacopy(0, 0, 32)\n success := mload(0)\n }\n }\n }\n require(\n success,\n TRANSFER_FAILED\n );\n }\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n view\n returns (uint8)\n {\n return PROXY_ID;\n }\n}\n", "current/protocol/AssetProxy/MixinAssetProxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./mixins/MAuthorizable.sol\";\nimport \"./mixins/MAssetProxy.sol\";\n\ncontract MixinAssetProxy is\n MAuthorizable,\n MAssetProxy\n{\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes assetData,\n address from,\n address to,\n uint256 amount\n )\n external\n onlyAuthorized\n {\n transferFromInternal(\n assetData,\n from,\n to,\n amount\n );\n }\n\n /// @dev Makes multiple transfers of assets. Either succeeds or throws.\n /// @param assetData Array of byte arrays encoded for the respective asset proxy.\n /// @param from Array of addresses to transfer assets from.\n /// @param to Array of addresses to transfer assets to.\n /// @param amounts Array of amounts of assets to transfer.\n function batchTransferFrom(\n bytes[] memory assetData,\n address[] memory from,\n address[] memory to,\n uint256[] memory amounts\n )\n public\n onlyAuthorized\n {\n for (uint256 i = 0; i < assetData.length; i++) {\n transferFromInternal(\n assetData[i],\n from[i],\n to[i],\n amounts[i]\n );\n }\n }\n}\n", "current/protocol/AssetProxy/MixinAuthorizable.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibAssetProxyErrors.sol\";\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"./mixins/MAuthorizable.sol\";\n\ncontract MixinAuthorizable is\n LibAssetProxyErrors,\n Ownable,\n MAuthorizable\n{\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n require(\n authorized[msg.sender],\n SENDER_NOT_AUTHORIZED\n );\n _;\n }\n\n mapping (address => bool) public authorized;\n address[] public authorities;\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n !authorized[target],\n TARGET_ALREADY_AUTHORIZED\n );\n\n authorized[target] = true;\n authorities.push(target);\n emit AuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n authorized[target],\n TARGET_NOT_AUTHORIZED\n );\n\n delete authorized[target];\n for (uint i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n authorities[i] = authorities[authorities.length - 1];\n authorities.length -= 1;\n break;\n }\n }\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external\n {\n require(\n index < authorities.length,\n INDEX_OUT_OF_BOUNDS\n );\n require(\n authorities[index] == target,\n AUTHORIZED_ADDRESS_MISMATCH\n );\n\n delete authorized[target];\n authorities[index] = authorities[authorities.length - 1];\n authorities.length -= 1;\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory)\n {\n return authorities;\n }\n}\n", "current/protocol/AssetProxy/interfaces/IAssetProxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./IAuthorizable.sol\";\n\ncontract IAssetProxy is\n IAuthorizable\n{\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes assetData,\n address from,\n address to,\n uint256 amount\n )\n external;\n \n /// @dev Makes multiple transfers of assets. Either succeeds or throws.\n /// @param assetData Array of byte arrays encoded for the respective asset proxy.\n /// @param from Array of addresses to transfer assets from.\n /// @param to Array of addresses to transfer assets to.\n /// @param amounts Array of amounts of assets to transfer.\n function batchTransferFrom(\n bytes[] memory assetData,\n address[] memory from,\n address[] memory to,\n uint256[] memory amounts\n )\n public;\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n view\n returns (uint8);\n}\n\n", @@ -301,7 +301,7 @@ "current/utils/Ownable/IOwnable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n", "current/utils/Ownable/Ownable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"Only contract owner is allowed to call this method.\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n" }, - "sourceTreeHashHex": "0xa1627d668e32d7e79358c9b198762530eb6bcd840b8642bea127a29fd5aba548", + "sourceTreeHashHex": "0x9cb5e063cffeafd409034589fc930640188ede902fcdbad5bd74e69932e654d8", "compiler": { "name": "solc", "version": "soljson-v0.4.24+commit.e67f0147.js", diff --git a/packages/migrations/artifacts/2.0.0/Exchange.json b/packages/migrations/artifacts/2.0.0/Exchange.json index e6d9f8f40..6a76fa0bc 100644 --- a/packages/migrations/artifacts/2.0.0/Exchange.json +++ b/packages/migrations/artifacts/2.0.0/Exchange.json @@ -1000,6 +1000,33 @@ "type": "function" }, { + "constant": true, + "inputs": [ + { + "name": "hash", + "type": "bytes32" + }, + { + "name": "signer", + "type": "address" + }, + { + "name": "signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "name": "isValid", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { "constant": false, "inputs": [ { @@ -1737,15 +1764,15 @@ "evm": { "bytecode": { "linkReferences": {}, - "object": "0x60806040523480156200001157600080fd5b50604051620045c9380380620045c983398101806040526200003791908101906200016a565b60008054600160a060020a03191633179055805181906200006090600490602084019062000069565b5050506200022c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000ac57805160ff1916838001178555620000dc565b82800160010185558215620000dc579182015b82811115620000dc578251825591602001919060010190620000bf565b50620000ea929150620000ee565b5090565b6200010b91905b80821115620000ea5760008155600101620000f5565b90565b6000601f820183136200012057600080fd5b8151620001376200013182620001d1565b620001aa565b915080825260208301602083018583830111156200015457600080fd5b62000161838284620001f9565b50505092915050565b6000602082840312156200017d57600080fd5b81516001604060020a038111156200019457600080fd5b620001a2848285016200010e565b949350505050565b6040518181016001604060020a0381118282101715620001c957600080fd5b604052919050565b60006001604060020a03821115620001e857600080fd5b506020601f91909101601f19160190565b60005b8381101562000216578181015183820152602001620001fc565b8381111562000226576000848401525b50505050565b61438d806200023c6000396000f30060806040526004361061018a5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663288cdc91811461018f578063297bb70b146101c55780632ac12622146101e75780633683ef8e1461021457806338077164146102345780633c28d861146102615780633e228bae1461028e5780634ac14782146102bb5780634d0ae546146102db5780634f9559b1146102fb57806350dde1901461031b5780635c78d0c71461033b578063642f2eaf1461035b57806364a3bc151461037b5780636f3627f81461039b57806377fcce68146103bb5780637b8e3514146103db5780637e1d9808146103fb57806382c174d01461041b5780638da5cb5b1461043b57806392c1421e1461045d578063a3e203801461047d578063b4be83d51461049d578063bfc8bfce146104bd578063c75e0a81146104dd578063d46b02c31461050a578063dd1c7d181461052a578063e5fa431b1461054a578063eea086ba1461056a578063f2fde38b1461057f578063ffa1ad741461059f575b600080fd5b34801561019b57600080fd5b506101af6101aa366004613bde565b6105c1565b6040516101bc9190614242565b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004613ae3565b6105d3565b005b3480156101f357600080fd5b50610207610202366004613bde565b61063e565b6040516101bc91906140fd565b34801561022057600080fd5b506101e561022f366004613c1b565b610653565b34801561024057600080fd5b5061025461024f366004613e83565b610721565b6040516101bc91906141e8565b34801561026d57600080fd5b5061028161027c366004613cb8565b61073c565b6040516101bc9190614225565b34801561029a57600080fd5b506102ae6102a9366004613d78565b610828565b6040516101bc9190614217565b3480156102c757600080fd5b506101e56102d6366004613aae565b610a38565b3480156102e757600080fd5b506101e56102f6366004613ae3565b610a70565b34801561030757600080fd5b506101e5610316366004613bde565b610ad5565b34801561032757600080fd5b506101e5610336366004613ae3565b610bbc565b34801561034757600080fd5b506101e5610356366004613ebf565b610c21565b34801561036757600080fd5b50610207610376366004613bde565b610e4f565b34801561038757600080fd5b506102ae610396366004613d78565b610e64565b3480156103a757600080fd5b506101af6103b6366004613a26565b610ee1565b3480156103c757600080fd5b506101e56103d6366004613a7e565b610ef3565b3480156103e757600080fd5b506102076103f6366004613a44565b610f38565b34801561040757600080fd5b506102ae610416366004613b77565b610f58565b34801561042757600080fd5b50610207610436366004613bfc565b611030565b34801561044757600080fd5b50610450611050565b6040516101bc919061407a565b34801561046957600080fd5b50610450610478366004613e83565b61105f565b34801561048957600080fd5b506102ae610498366004613b77565b61107d565b3480156104a957600080fd5b506102ae6104b8366004613d78565b61118d565b3480156104c957600080fd5b506101e56104d8366004613dea565b611211565b3480156104e957600080fd5b506104fd6104f8366004613c83565b611543565b6040516101bc9190614234565b34801561051657600080fd5b506101e5610525366004613c83565b61161f565b34801561053657600080fd5b506102ae610545366004613b77565b61164a565b34801561055657600080fd5b506102ae610565366004613b77565b611710565b34801561057657600080fd5b506104506117eb565b34801561058b57600080fd5b506101e561059a366004613a26565b6117fa565b3480156105ab57600080fd5b506105b4611862565b6040516101bc91906141f6565b60016020526000908152604090205481565b60005b83518110156106385761062f84828151811015156105f057fe5b90602001906020020151848381518110151561060857fe5b90602001906020020151848481518110151561062057fe5b9060200190602002015161118d565b506001016105d6565b50505050565b60026020526000908152604090205460ff1681565b61068e848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750611899945050505050565b60408051808201909152601181527f494e56414c49445f5349474e415455524500000000000000000000000000000060208201529015156106ee5760405160e560020a62461bcd0281526004016106e591906141f6565b60405180910390fd5b5050506000918252600560209081526040808420600160a060020a0390931684529190529020805460ff19166001179055565b600960205260009081526040902054600160a060020a031681565b61074461364c565b61074c61367b565b61075461367b565b610160808801516101408089019190915288015190870152600061077788611543565b925061078287611543565b915061078c612075565b905061079888886120a4565b6107ac888885604001518560400151612124565b8051602001519094506107c690899085908490808b6121e8565b60208085015101516107df90889084908490808a6121e8565b6107f88882856020015186604001518860000151612488565b6108118782846020015185604001518860200151612488565b61081d88888387612527565b505050949350505050565b61083061369b565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000008082526060600483018181528851606485019081526020808b01516084870152958a015160a48601529189015160c4850152608089015160e485015260a089015161010485015260c089015161012485015260e0890151610144850152610100890151610164850152610120890151610184850152610140890180516101a486019081526101608b01516101c487015261018090525180516101e48601819052939591938493926024870192849261020489019291820191601f82010460005b81811015610933578351855260209485019490930192600101610915565b50505050818103610160808401919091528c0151805180835260209283019291820191601f82010460005b8181101561097c57835185526020948501949093019260010161095e565b5050508b84525084810360209384019081528a518083529093918201918b81019190601f82010460005b818110156109c45783518552602094850194909301926001016109a6565b5060808a8b86038c305af48080156109e35760018114610a0157610a24565b60008e52600060208f0152600060408f0152600060608f0152610a24565b8b518e5260208c015160208f015260408c015160408f015260608c015160608f01525b505050505050505050505050509392505050565b60005b8151811015610a6c57610a648282815181101515610a5557fe5b9060200190602002015161161f565b600101610a3b565b5050565b60005b835181101561063857610acc8482815181101515610a8d57fe5b906020019060200201518483815181101515610aa557fe5b906020019060200201518484815181101515610abd57fe5b90602001906020020151610e64565b50600101610a73565b6000806000610ae2612075565b600160a060020a038116600090815260036020908152604091829020548251808401909352601783527f494e56414c49445f4e45575f4d414b45525f45504f434800000000000000000091830191909152919450600186019350909150818311610b625760405160e560020a62461bcd0281526004016106e591906141f6565b50600160a060020a03831660008181526003602052604090819020849055517f666a5047451d0c744e58819166260f8048fe2786e33b3c1115af94887a451ca790610bae908590614242565b60405180910390a250505050565b60005b835181101561063857610c188482815181101515610bd957fe5b906020019060200201518483815181101515610bf157fe5b906020019060200201518484815181101515610c0957fe5b90602001906020020151610828565b50600101610bbf565b6000805481908190600160a060020a03163314610c535760405160e560020a62461bcd0281526004016106e590614207565b60ff8616600090815260096020908152604091829020548251808401909352601483527f41535345545f50524f58595f4d49534d4154434800000000000000000000000091830191909152600160a060020a03908116945085168414610ccf5760405160e560020a62461bcd0281526004016106e591906141f6565b50849150600160a060020a03821615610dd35781600160a060020a031663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610d3957600080fd5b505af1158015610d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d719190810190613ea1565b60408051808201909152601781527f41535345545f50524f58595f49445f4d49534d41544348000000000000000000602082015290915060ff80831690881614610dd15760405160e560020a62461bcd0281526004016106e591906141f6565b505b60ff861660009081526009602052604090819020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038516179055517f27ef5f484e50f2daf7c2d82c60fe4ce409009541176eb64095beac369db1d26090610e3f90889088908890614250565b60405180910390a1505050505050565b60076020526000908152604090205460ff1681565b610e6c61369b565b610e7784848461118d565b9050828160200151146040805190810160405280601481526020017f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000815250901515610ed95760405160e560020a62461bcd0281526004016106e591906141f6565b509392505050565b60036020526000908152604090205481565b6000610efd612075565b600160a060020a03908116600090815260066020908152604080832096909316825294909452909220805460ff191691151591909117905550565b600660209081526000928352604080842090915290825290205460ff1681565b610f6061369b565b6060600080610f6d61369b565b876000815181101515610f7c57fe5b9060200190602002015161016001519350600092505b875183101561102557838884815181101515610faa57fe5b906020019060200201516101600181905250610fca878660200151612703565b9150610ff68884815181101515610fdd57fe5b9060200190602002015183888681518110151561062057fe5b8451600101855290506110098582612715565b868560200151141561101a57611025565b600190920191610f92565b505050509392505050565b600560209081526000928352604080842090915290825290205460ff1681565b600054600160a060020a031681565b60ff16600090815260096020526040902054600160a060020a031690565b61108561369b565b6060600080600061109461369b565b8860008151811015156110a357fe5b9060200190602002015161014001519450600093505b8851841015611181578489858151811015156110d157fe5b60209081029091010151610140015285516110ed908990612703565b9250611130898581518110151561110057fe5b9060200190602002015160a001518a8681518110151561111c57fe5b906020019060200201516080015185612777565b915061115c898581518110151561114357fe5b90602001906020020151838987815181101515610c0957fe5b90506111688682612715565b855188141561117657611181565b6001909301926110b9565b50505050509392505050565b61119561369b565b61119d61367b565b60008060006111ab88611543565b93506111b5612075565b92506111c98860a001518560400151612703565b91506111d58783612794565b90506111e58885858a858b6121e8565b6111ef88826127ac565b945061120688848660200151876040015189612488565b611025888487612816565b60085460408051808201909152601281527f5245454e5452414e43595f494c4c4547414c00000000000000000000000000006020820152600091600160a060020a0316156112755760405160e560020a62461bcd0281526004016106e591906141f6565b5030868887876040516020018086600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018481526020018383808284378201915050955050505050506040516020818303038152906040526040518082805190602001908083835b602083106113265780518252601f199092019160209182019101611307565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008181526007835285902054838601909552600f83527f494e56414c49445f54585f48415348000000000000000000000000000000000091830191909152955093505060ff161590506113b75760405160e560020a62461bcd0281526004016106e591906141f6565b50600160a060020a038616331461148457611403818785858080601f01602080910402602001604051908101604052809392919081815260200183838082843750611899945050505050565b60408051808201909152601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015290151561145a5760405160e560020a62461bcd0281526004016106e591906141f6565b506008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161790555b60008181526007602052604090819020805460ff191660011790555130908690869080838380828437820191505092505050600060405180830381855af460408051808201909152601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015292501515905061151c5760405160e560020a62461bcd0281526004016106e591906141f6565b50506008805473ffffffffffffffffffffffffffffffffffffffff19169055505050505050565b61154b61367b565b61155482612942565b6020820152608082015115156115715760015b60ff16815261161a565b60a08201511515611583576002611567565b6101008201514210611596576004611567565b60208082015160009081526002909152604090205460ff16156115ba576006611567565b6101208201518251600160a060020a031660009081526003602052604090205411156115e7576006611567565b602080820151600090815260019091526040908190205490820181905260a083015111611615576005611567565b600381525b919050565b61162761367b565b61163082611543565b905061163c82826130b6565b610a6c8282602001516131ff565b61165261369b565b606060008061165f61369b565b87600081518110151561166e57fe5b9060200190602002015161016001519350600092505b87518310156110255783888481518110151561169c57fe5b9060200190602002015161016001819052506116bc878660200151612703565b91506116e888848151811015156116cf57fe5b90602001906020020151838886815181101515610c0957fe5b90506116f48582612715565b868560200151141561170557611025565b600190920191611684565b61171861369b565b6060600080600061172761369b565b88600081518110151561173657fe5b9060200190602002015161014001519450600093505b88518410156111815784898581518110151561176457fe5b6020908102909101015161014001528551611780908990612703565b9250611793898581518110151561110057fe5b91506117bf89858151811015156117a657fe5b9060200190602002015183898781518110151561062057fe5b8551600101865290506117d28682612715565b85518814156117e057611181565b60019093019261174c565b600854600160a060020a031681565b600054600160a060020a031633146118275760405160e560020a62461bcd0281526004016106e590614207565b600160a060020a0381161561185f576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60408051808201909152600b81527f322e302e312d616c706861000000000000000000000000000000000000000000602082015281565b6000806000806000806000808851116040805190810160405280601e81526020017f4c454e4754485f475245415445525f5448414e5f305f524551554952454400008152509015156119015760405160e560020a62461bcd0281526004016106e591906141f6565b5061190b8861327b565b60f860020a900460ff16600881111561192057fe5b9550600086600881111561193057fe5b141561198457604080518082018252601181527f5349474e41545552455f494c4c4547414c0000000000000000000000000000006020820152905160e560020a62461bcd0281526106e591906004016141f6565b600186600881111561199257fe5b14156119fa57875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156119f05760405160e560020a62461bcd0281526004016106e591906141f6565b5060009650612068565b6002866008811115611a0857fe5b1415611b1057875160408051808201909152601281527f4c454e4754485f36365f52455155495245440000000000000000000000000000602082015290604114611a685760405160e560020a62461bcd0281526004016106e591906141f6565b50876000815181101515611a7857fe5b016020015160f860020a908190048102049450611a96886001613330565b9350611aa3886021613330565b925060018a86868660405160008152602001604052604051611ac89493929190614161565b60206040516020810390808403906000865af1158015611aec573d6000803e3d6000fd5b5050604051601f190151600160a060020a038b811690821614985092506120689050565b6003866008811115611b1e57fe5b1415611cca57875160408051808201909152601281527f4c454e4754485f36365f52455155495245440000000000000000000000000000602082015290604114611b7e5760405160e560020a62461bcd0281526004016106e591906141f6565b50876000815181101515611b8e57fe5b016020015160f860020a908190048102049450611bac886001613330565b9350611bb9886021613330565b925060016040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152508b6040516020018083805190602001908083835b60208310611c265780518252601f199092019160209182019101611c07565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b60208310611c865780518252601f199092019160209182019101611c67565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008352910192839052611ac89450925089918991508890614161565b6004866008811115611cd857fe5b1415611d4a57875160408051808201909152601181527f4c454e4754485f315f524551554952454400000000000000000000000000000060208201529015611d365760405160e560020a62461bcd0281526004016106e591906141f6565b50600160a060020a03891633149650612068565b6005866008811115611d5857fe5b1415611dfe576040517f1626ba7e000000000000000000000000000000000000000000000000000000008152600160a060020a038a1690631626ba7e90611da5908d908c90600401614141565b602060405180830381600087803b158015611dbf57600080fd5b505af1158015611dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611df79190810190613bc0565b9650612068565b6006866008811115611e0c57fe5b1415611e9f57611e1b886133c4565b600160a060020a03808b1660009081526006602090815260408083209385168352929052205490915060ff161515611e565760009650612068565b6040517f93634702000000000000000000000000000000000000000000000000000000008152600160a060020a03821690639363470290611da5908d908d908d9060040161410b565b6007866008811115611ead57fe5b1415611ee05760008a8152600560209081526040808320600160a060020a038d16845290915290205460ff169650612068565b6008866008811115611eee57fe5b1415611fd957875160408051808201909152601281527f4c454e4754485f36365f52455155495245440000000000000000000000000000602082015290604114611f4e5760405160e560020a62461bcd0281526004016106e591906141f6565b50876000815181101515611f5e57fe5b016020015160f860020a908190048102049450611f7c886001613330565b9350611f89886021613330565b604080518082018252601b8082527f19457468657265756d205369676e6564204d6573736167653a0a4100000000006020808401918252935194975060019492938f930191829190808383611c26565b6007866008811115611fe757fe5b141561201a5760008a8152600560209081526040808320600160a060020a038d16845290915290205460ff169650612068565b604080518082018252601581527f5349474e41545552455f554e535550504f5254454400000000000000000000006020820152905160e560020a62461bcd0281526106e591906004016141f6565b5050505050509392505050565b6008546000908190600160a060020a03161561209c57600854600160a060020a031661209e565b335b92915050565b6120b68260a001518260a00151613468565b6120c883608001518360800151613468565b60408051808201909152601881527f4e454741544956455f5350524541445f52455155495245440000000000000000602082015291111561211f5760405160e560020a62461bcd0281526004016106e591906141f6565b505050565b61212c61364c565b6000806000806121408960a0015188612703565b93506121508860a0015187612703565b9250612160838960800151613468565b61216e858a60a00151613468565b11612190578391506121898860a00151896080015184612777565b90506121a9565b8290506121a688608001518960a0015183612777565b91505b6121b389836127ac565b85526121bf88826127ac565b60208087018290528651519101516121d79190612703565b604086015250505050949350505050565b845160408051808201909152601081527f4f524445525f554e46494c4c41424c450000000000000000000000000000000060208201529060ff166003146122455760405160e560020a62461bcd0281526004016106e591906141f6565b5060408051808201909152601481527f494e56414c49445f54414b45525f414d4f554e54000000000000000000000000602082015283151561229d5760405160e560020a62461bcd0281526004016106e591906141f6565b506060860151600160a060020a03161561231857606086015160408051808201909152600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015290600160a060020a031633146123165760405160e560020a62461bcd0281526004016106e591906141f6565b505b6020860151600160a060020a03161561239f5783600160a060020a03168660200151600160a060020a0316146040805190810160405280600d81526020017f494e56414c49445f54414b45520000000000000000000000000000000000000081525090151561239d5760405160e560020a62461bcd0281526004016106e591906141f6565b505b60408501511515612416576123bd8560200151876000015183611899565b60408051808201909152601781527f494e56414c49445f4f524445525f5349474e415455524500000000000000000060208201529015156124145760405160e560020a62461bcd0281526004016106e591906141f6565b505b612429828760a00151886080015161348c565b60408051808201909152600e81527f524f554e44494e475f4552524f520000000000000000000000000000000000006020820152901561247f5760405160e560020a62461bcd0281526004016106e591906141f6565b50505050505050565b6124968282602001516134e2565b600084815260016020908152604091829020929092558681015187518451938501518584015160608701516101408c01516101608d015196518b98600160a060020a039788169897909616967fde19f18e1b56e6eada7ed95cca8398b602be32f5864640537ee9a9a3532bb29d96612518968f96919590949193909290614088565b60405180910390a45050505050565b600080606061253a87610140015161327b565b60f860020a9004925061255186610140015161327b565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260f860020a90940495508301828280156125e05780601f106125b5576101008083540402835291602001916125e0565b820191906000526020600020905b8154815290600101906020018083116125c357829003601f168201915b5050505050905061260987610140015184896000015189600001518860200151602001516134f1565b610140860151865188518651602001516126279392869290916134f1565b6126418761014001518489600001518888604001516134f1565b61265f81600189600001518a604001518860000151604001516134f1565b61267d816001886000015189604001518860200151604001516134f1565b8560400151600160a060020a03168760400151600160a060020a031614156126cf576126ca816001878a604001516126c58960000151606001518a60200151606001516134e2565b6134f1565b61247f565b6126e9816001878a604001518860000151606001516134f1565b61247f8160018789604001518860200151606001516134f1565b60008282111561270f57fe5b50900390565b8151815161272391906134e2565b82526020808301519082015161273991906134e2565b60208301526040808301519082015161275291906134e2565b60408301526060808301519082015161276b91906134e2565b60609092019190915250565b600061278c6127868584613468565b84613598565b949350505050565b60008183106127a357816127a5565b825b9392505050565b6127b461369b565b6020810182905260a083015160808401516127d0918491612777565b8152602081015160a084015160c08501516127ec929190612777565b6040820152602081015160a084015160e085015161280b929190612777565b606082015292915050565b600080606061282986610140015161327b565b60f860020a9004925061284086610160015161327b565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260f860020a90940495508301828280156128cf5780601f106128a4576101008083540402835291602001916128cf565b820191906000526020600020905b8154815290600101906020018083116128b257829003601f168201915b505050505090506128f08661014001518488600001518888600001516134f1565b61290a8661016001518387896000015188602001516134f1565b6129248160018860000151896040015188604001516134f1565b61293a81600187896040015188606001516134f1565b505050505050565b600060405160200180807f446f6d61696e536570617261746f72286164647265737320636f6e747261637481526020017f290000000000000000000000000000000000000000000000000000000000000081525060210190506040516020818303038152906040526040518082805190602001908083835b602083106129d95780518252601f1990920191602091820191016129ba565b51815160209384036101000a600019018019909216911617905260408051929094018290038220306c0100000000000000000000000002838301528451601481850301815260349093019485905282519096509194508392508401908083835b60208310612a585780518252601f199092019160209182019101612a39565b51815160209384036101000a6000190180199092169116179052604080519290940182900382207f4f72646572280000000000000000000000000000000000000000000000000000838301527f61646472657373206d616b6572416464726573732c000000000000000000000060268401527f616464726573732074616b6572416464726573732c0000000000000000000000603b8401527f6164647265737320666565526563697069656e74416464726573732c0000000060508401527f616464726573732073656e646572416464726573732c00000000000000000000606c8401527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828401527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8401527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48401527f75696e743235362074616b65724665652c00000000000000000000000000000060c58401527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68401527f75696e743235362073616c742c0000000000000000000000000000000000000060f48401527f6279746573206d616b65724173736574446174612c00000000000000000000006101018401527f62797465732074616b65724173736574446174612c00000000000000000000006101168401527f290000000000000000000000000000000000000000000000000000000000000061012b840152845180840361010c01815261012c9093019485905282519096509194508392508401908083835b60208310612cdb5780518252601f199092019160209182019101612cbc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020846000015185602001518660400151876060015188608001518960a001518a60c001518b60e001518c61010001518d61012001518e61014001516040516020018082805190602001908083835b60208310612d745780518252601f199092019160209182019101612d55565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310612dd75780518252601f199092019160209182019101612db8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208f61016001516040516020018082805190602001908083835b60208310612e3c5780518252601f199092019160209182019101612e1d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310612e9f5780518252601f199092019160209182019101612e80565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020604051602001808d600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018c600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018b600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018a600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401898152602001888152602001878152602001868152602001858152602001848152602001836000191660001916815260200182600019166000191681526020019c505050505050505050505050506040516020818303038152906040526040518082805190602001908083835b60208310612ffb5780518252601f199092019160209182019101612fdc565b51815160001960209485036101000a019081169019919091161790526040805194909201849003842084820199909952838201979097526060830195909552506080808201969096528351808203909601865260a001928390525050825190918291908401908083835b602083106130845780518252601f199092019160209182019101613065565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b805160408051808201909152601081527f4f524445525f554e46494c4c41424c4500000000000000000000000000000000602082015260009160ff166003146131155760405160e560020a62461bcd0281526004016106e591906141f6565b506060830151600160a060020a03161561319057606083015160408051808201909152600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015290600160a060020a0316331461318e5760405160e560020a62461bcd0281526004016106e591906141f6565b505b613198612075565b835160408051808201909152600d81527f494e56414c49445f4d414b4552000000000000000000000000000000000000006020820152919250600160a060020a038084169116146106385760405160e560020a62461bcd0281526004016106e591906141f6565b60008181526002602052604090819020805460ff1916600117905582810151835161014085015161016086015193518594600160a060020a039485169493909316927fb1ad640e9e79b6fdbc3c415dc2914ab54e753d2971f51eab910f7aa317a3163a9261326f929091906141c3565b60405180910390a45050565b600080825111606060405190810160405280602181526020017f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524581526020017f44000000000000000000000000000000000000000000000000000000000000008152509015156133015760405160e560020a62461bcd0281526004016106e591906141f6565b5081518290600019810190811061331457fe5b01602001518251600019019092525060f860020a908190040290565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f51554952454400000000000000000000000000000000000000000000000000008152509015156133ba5760405160e560020a62461bcd0281526004016106e591906141f6565b5050016020015190565b6000601482511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f515549524544000000000000000000000000000000000000000000000000000081525090151561344c5760405160e560020a62461bcd0281526004016106e591906141f6565b5061345b8260148451036135af565b8251601319019092525090565b6000828202831580613484575082848281151561348157fe5b04145b15156127a557fe5b60008060008480151561349b57fe5b86850991508115156134b057600092506134d9565b6134cf6134c083620f4240613468565b6134ca8887613468565b613598565b6103e88111935090505b50509392505050565b6000828201838110156127a557fe5b60008082111561293a575060ff8416600090815260096020526040908190205490517fa85e59e4000000000000000000000000000000000000000000000000000000008152600160a060020a0390911690819063a85e59e49061355e908990889088908890600401614196565b600060405180830381600087803b15801561357857600080fd5b505af115801561358c573d6000803e3d6000fd5b50505050505050505050565b60008082848115156135a657fe5b04949350505050565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f51554952454400000000000000000000000000000000000000000000000000008152509015156136395760405160e560020a62461bcd0281526004016106e591906141f6565b50500160140151600160a060020a031690565b6101206040519081016040528061366161369b565b815260200161366e61369b565b8152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b60006127a582356142ec565b6000601f820183136136e157600080fd5b81356136f46136ef8261429f565b614278565b81815260209384019390925082018360005b83811015613732578135860161371c8882613876565b8452506020928301929190910190600101613706565b5050505092915050565b6000601f8201831361374d57600080fd5b813561375b6136ef8261429f565b81815260209384019390925082018360005b83811015613732578135860161378388826138c5565b845250602092830192919091019060010161376d565b6000601f820183136137aa57600080fd5b81356137b86136ef8261429f565b915081818352602084019350602081019050838560208402820111156137dd57600080fd5b60005b8381101561373257816137f38882613821565b84525060209283019291909101906001016137e0565b60006127a582356142f8565b60006127a582516142f8565b60006127a582356142fd565b600080601f8301841361383f57600080fd5b50813567ffffffffffffffff81111561385757600080fd5b60208301915083600182028301111561386f57600080fd5b9250929050565b6000601f8201831361388757600080fd5b81356138956136ef826142c0565b915080825260208301602083018583830111156138b157600080fd5b6138bc838284614311565b50505092915050565b600061018082840312156138d857600080fd5b6138e3610180614278565b905060006138f184846136c4565b8252506020613902848483016136c4565b6020830152506040613916848285016136c4565b604083015250606061392a848285016136c4565b606083015250608061393e84828501613821565b60808301525060a061395284828501613821565b60a08301525060c061396684828501613821565b60c08301525060e061397a84828501613821565b60e08301525061010061398f84828501613821565b610100830152506101206139a584828501613821565b6101208301525061014082013567ffffffffffffffff8111156139c757600080fd5b6139d384828501613876565b6101408301525061016082013567ffffffffffffffff8111156139f557600080fd5b613a0184828501613876565b6101608301525092915050565b60006127a58235614300565b60006127a58251614300565b600060208284031215613a3857600080fd5b600061278c84846136c4565b60008060408385031215613a5757600080fd5b6000613a6385856136c4565b9250506020613a74858286016136c4565b9150509250929050565b60008060408385031215613a9157600080fd5b6000613a9d85856136c4565b9250506020613a7485828601613809565b600060208284031215613ac057600080fd5b813567ffffffffffffffff811115613ad757600080fd5b61278c8482850161373c565b600080600060608486031215613af857600080fd5b833567ffffffffffffffff811115613b0f57600080fd5b613b1b8682870161373c565b935050602084013567ffffffffffffffff811115613b3857600080fd5b613b4486828701613799565b925050604084013567ffffffffffffffff811115613b6157600080fd5b613b6d868287016136d0565b9150509250925092565b600080600060608486031215613b8c57600080fd5b833567ffffffffffffffff811115613ba357600080fd5b613baf8682870161373c565b9350506020613b4486828701613821565b600060208284031215613bd257600080fd5b600061278c8484613815565b600060208284031215613bf057600080fd5b600061278c8484613821565b60008060408385031215613c0f57600080fd5b6000613a638585613821565b60008060008060608587031215613c3157600080fd5b6000613c3d8787613821565b9450506020613c4e878288016136c4565b935050604085013567ffffffffffffffff811115613c6b57600080fd5b613c778782880161382d565b95989497509550505050565b600060208284031215613c9557600080fd5b813567ffffffffffffffff811115613cac57600080fd5b61278c848285016138c5565b60008060008060808587031215613cce57600080fd5b843567ffffffffffffffff811115613ce557600080fd5b613cf1878288016138c5565b945050602085013567ffffffffffffffff811115613d0e57600080fd5b613d1a878288016138c5565b935050604085013567ffffffffffffffff811115613d3757600080fd5b613d4387828801613876565b925050606085013567ffffffffffffffff811115613d6057600080fd5b613d6c87828801613876565b91505092959194509250565b600080600060608486031215613d8d57600080fd5b833567ffffffffffffffff811115613da457600080fd5b613db0868287016138c5565b9350506020613dc186828701613821565b925050604084013567ffffffffffffffff811115613dde57600080fd5b613b6d86828701613876565b60008060008060008060808789031215613e0357600080fd5b6000613e0f8989613821565b9650506020613e2089828a016136c4565b955050604087013567ffffffffffffffff811115613e3d57600080fd5b613e4989828a0161382d565b9450945050606087013567ffffffffffffffff811115613e6857600080fd5b613e7489828a0161382d565b92509250509295509295509295565b600060208284031215613e9557600080fd5b600061278c8484613a0e565b600060208284031215613eb357600080fd5b600061278c8484613a1a565b600080600060608486031215613ed457600080fd5b6000613ee08686613a0e565b9350506020613ef1868287016136c4565b9250506040613b6d868287016136c4565b613f0b816142ec565b82525050565b613f0b816142f8565b613f0b816142fd565b6000613f2e826142e8565b808452613f4281602086016020860161431d565b613f4b81614349565b9093016020019392505050565b613f0b81614306565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b80516080830190613fc88482613f1a565b506020820151613fdb6020850182613f1a565b506040820151613fee6040850182613f1a565b5060608201516106386060850182613f1a565b80516101208301906140138482613fb7565b5060208201516140266080850182613fb7565b506040820151610638610100850182613f1a565b8051606083019061404b8482614071565b50602082015161405e6020850182613f1a565b5060408201516106386040850182613f1a565b613f0b81614300565b6020810161209e8284613f02565b60e08101614096828a613f02565b6140a36020830189613f1a565b6140b06040830188613f1a565b6140bd6060830187613f1a565b6140ca6080830186613f1a565b81810360a08301526140dc8185613f23565b905081810360c08301526140f08184613f23565b9998505050505050505050565b6020810161209e8284613f11565b606081016141198286613f1a565b6141266020830185613f02565b81810360408301526141388184613f23565b95945050505050565b6040810161414f8285613f1a565b818103602083015261278c8184613f23565b6080810161416f8287613f1a565b61417c6020830186614071565b6141896040830185613f1a565b6141386060830184613f1a565b608080825281016141a78187613f23565b90506141b66020830186613f02565b6141896040830185613f02565b604080825281016141d48185613f23565b9050818103602083015261278c8184613f23565b6020810161209e8284613f58565b602080825281016127a58184613f23565b6020808252810161209e81613f61565b6080810161209e8284613fb7565b610120810161209e8284614001565b6060810161209e828461403a565b6020810161209e8284613f1a565b6060810161425e8286614071565b61426b6020830185613f02565b61278c6040830184613f02565b60405181810167ffffffffffffffff8111828210171561429757600080fd5b604052919050565b600067ffffffffffffffff8211156142b657600080fd5b5060209081020190565b600067ffffffffffffffff8211156142d757600080fd5b506020601f91909101601f19160190565b5190565b600160a060020a031690565b151590565b90565b60ff1690565b600061209e826142ec565b82818337506000910152565b60005b83811015614338578181015183820152602001614320565b838111156106385750506000910152565b601f01601f1916905600a265627a7a72305820bfabe09dfd0658769e182630c7628d39dcd8d912f30804a9f51e90300f9e47726c6578706572696d656e74616cf50037", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x45C9 CODESIZE SUB DUP1 PUSH3 0x45C9 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x16A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE DUP1 MLOAD DUP2 SWAP1 PUSH3 0x60 SWAP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x69 JUMP JUMPDEST POP POP POP PUSH3 0x22C JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0xAC JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0xDC JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0xDC JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0xDC JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0xBF JUMP JUMPDEST POP PUSH3 0xEA SWAP3 SWAP2 POP PUSH3 0xEE JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x10B SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0xEA JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0xF5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x120 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x137 PUSH3 0x131 DUP3 PUSH3 0x1D1 JUMP JUMPDEST PUSH3 0x1AA JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x161 DUP4 DUP3 DUP5 PUSH3 0x1F9 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x17D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x194 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x1A2 DUP5 DUP3 DUP6 ADD PUSH3 0x10E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x1C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x1E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x216 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x1FC JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x226 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x438D DUP1 PUSH3 0x23C PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x18A JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x288CDC91 DUP2 EQ PUSH2 0x18F JUMPI DUP1 PUSH4 0x297BB70B EQ PUSH2 0x1C5 JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x1E7 JUMPI DUP1 PUSH4 0x3683EF8E EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0x38077164 EQ PUSH2 0x234 JUMPI DUP1 PUSH4 0x3C28D861 EQ PUSH2 0x261 JUMPI DUP1 PUSH4 0x3E228BAE EQ PUSH2 0x28E JUMPI DUP1 PUSH4 0x4AC14782 EQ PUSH2 0x2BB JUMPI DUP1 PUSH4 0x4D0AE546 EQ PUSH2 0x2DB JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x2FB JUMPI DUP1 PUSH4 0x50DDE190 EQ PUSH2 0x31B JUMPI DUP1 PUSH4 0x5C78D0C7 EQ PUSH2 0x33B JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0x35B JUMPI DUP1 PUSH4 0x64A3BC15 EQ PUSH2 0x37B JUMPI DUP1 PUSH4 0x6F3627F8 EQ PUSH2 0x39B JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x3BB JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x3DB JUMPI DUP1 PUSH4 0x7E1D9808 EQ PUSH2 0x3FB JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x41B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x43B JUMPI DUP1 PUSH4 0x92C1421E EQ PUSH2 0x45D JUMPI DUP1 PUSH4 0xA3E20380 EQ PUSH2 0x47D JUMPI DUP1 PUSH4 0xB4BE83D5 EQ PUSH2 0x49D JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x4BD JUMPI DUP1 PUSH4 0xC75E0A81 EQ PUSH2 0x4DD JUMPI DUP1 PUSH4 0xD46B02C3 EQ PUSH2 0x50A JUMPI DUP1 PUSH4 0xDD1C7D18 EQ PUSH2 0x52A JUMPI DUP1 PUSH4 0xE5FA431B EQ PUSH2 0x54A JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x56A JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x57F JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x59F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AF PUSH2 0x1AA CALLDATASIZE PUSH1 0x4 PUSH2 0x3BDE JUMP JUMPDEST PUSH2 0x5C1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x4242 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x1E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AE3 JUMP JUMPDEST PUSH2 0x5D3 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x207 PUSH2 0x202 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BDE JUMP JUMPDEST PUSH2 0x63E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x40FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x220 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x22F CALLDATASIZE PUSH1 0x4 PUSH2 0x3C1B JUMP JUMPDEST PUSH2 0x653 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x240 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x254 PUSH2 0x24F CALLDATASIZE PUSH1 0x4 PUSH2 0x3E83 JUMP JUMPDEST PUSH2 0x721 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x41E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x281 PUSH2 0x27C CALLDATASIZE PUSH1 0x4 PUSH2 0x3CB8 JUMP JUMPDEST PUSH2 0x73C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x4225 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x2A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D78 JUMP JUMPDEST PUSH2 0x828 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x4217 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x2D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AAE JUMP JUMPDEST PUSH2 0xA38 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x2F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AE3 JUMP JUMPDEST PUSH2 0xA70 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x307 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x316 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BDE JUMP JUMPDEST PUSH2 0xAD5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x336 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AE3 JUMP JUMPDEST PUSH2 0xBBC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x347 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x356 CALLDATASIZE PUSH1 0x4 PUSH2 0x3EBF JUMP JUMPDEST PUSH2 0xC21 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x367 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x207 PUSH2 0x376 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BDE JUMP JUMPDEST PUSH2 0xE4F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x387 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x396 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D78 JUMP JUMPDEST PUSH2 0xE64 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AF PUSH2 0x3B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A26 JUMP JUMPDEST PUSH2 0xEE1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x3D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A7E JUMP JUMPDEST PUSH2 0xEF3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x207 PUSH2 0x3F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A44 JUMP JUMPDEST PUSH2 0xF38 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x407 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x416 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B77 JUMP JUMPDEST PUSH2 0xF58 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x427 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x207 PUSH2 0x436 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BFC JUMP JUMPDEST PUSH2 0x1030 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x450 PUSH2 0x1050 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x407A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x469 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x450 PUSH2 0x478 CALLDATASIZE PUSH1 0x4 PUSH2 0x3E83 JUMP JUMPDEST PUSH2 0x105F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x489 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x498 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B77 JUMP JUMPDEST PUSH2 0x107D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x4B8 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D78 JUMP JUMPDEST PUSH2 0x118D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x4D8 CALLDATASIZE PUSH1 0x4 PUSH2 0x3DEA JUMP JUMPDEST PUSH2 0x1211 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4FD PUSH2 0x4F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C83 JUMP JUMPDEST PUSH2 0x1543 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x4234 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x516 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x525 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C83 JUMP JUMPDEST PUSH2 0x161F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x536 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x545 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B77 JUMP JUMPDEST PUSH2 0x164A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x556 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x565 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B77 JUMP JUMPDEST PUSH2 0x1710 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x576 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x450 PUSH2 0x17EB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x59A CALLDATASIZE PUSH1 0x4 PUSH2 0x3A26 JUMP JUMPDEST PUSH2 0x17FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B4 PUSH2 0x1862 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x638 JUMPI PUSH2 0x62F DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5F0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x608 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x620 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x118D JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x5D6 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x68E DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x1899 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x6EE JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH2 0x744 PUSH2 0x364C JUMP JUMPDEST PUSH2 0x74C PUSH2 0x367B JUMP JUMPDEST PUSH2 0x754 PUSH2 0x367B JUMP JUMPDEST PUSH2 0x160 DUP1 DUP9 ADD MLOAD PUSH2 0x140 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x0 PUSH2 0x777 DUP9 PUSH2 0x1543 JUMP JUMPDEST SWAP3 POP PUSH2 0x782 DUP8 PUSH2 0x1543 JUMP JUMPDEST SWAP2 POP PUSH2 0x78C PUSH2 0x2075 JUMP JUMPDEST SWAP1 POP PUSH2 0x798 DUP9 DUP9 PUSH2 0x20A4 JUMP JUMPDEST PUSH2 0x7AC DUP9 DUP9 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2124 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0x7C6 SWAP1 DUP10 SWAP1 DUP6 SWAP1 DUP5 SWAP1 DUP1 DUP12 PUSH2 0x21E8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD MLOAD ADD MLOAD PUSH2 0x7DF SWAP1 DUP9 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP1 DUP11 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0x7F8 DUP9 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x2488 JUMP JUMPDEST PUSH2 0x811 DUP8 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x2488 JUMP JUMPDEST PUSH2 0x81D DUP9 DUP9 DUP4 DUP8 PUSH2 0x2527 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x830 PUSH2 0x369B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 DUP1 DUP3 MSTORE PUSH1 0x60 PUSH1 0x4 DUP4 ADD DUP2 DUP2 MSTORE DUP9 MLOAD PUSH1 0x64 DUP6 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 DUP1 DUP12 ADD MLOAD PUSH1 0x84 DUP8 ADD MSTORE SWAP6 DUP11 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP2 DUP10 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE PUSH1 0x80 DUP10 ADD MLOAD PUSH1 0xE4 DUP6 ADD MSTORE PUSH1 0xA0 DUP10 ADD MLOAD PUSH2 0x104 DUP6 ADD MSTORE PUSH1 0xC0 DUP10 ADD MLOAD PUSH2 0x124 DUP6 ADD MSTORE PUSH1 0xE0 DUP10 ADD MLOAD PUSH2 0x144 DUP6 ADD MSTORE PUSH2 0x100 DUP10 ADD MLOAD PUSH2 0x164 DUP6 ADD MSTORE PUSH2 0x120 DUP10 ADD MLOAD PUSH2 0x184 DUP6 ADD MSTORE PUSH2 0x140 DUP10 ADD DUP1 MLOAD PUSH2 0x1A4 DUP7 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP12 ADD MLOAD PUSH2 0x1C4 DUP8 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x1E4 DUP7 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP6 SWAP2 SWAP4 DUP5 SWAP4 SWAP3 PUSH1 0x24 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x204 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x933 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x915 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP13 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x97C JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x95E JUMP JUMPDEST POP POP POP DUP12 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP11 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP12 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x9C4 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x9A6 JUMP JUMPDEST POP PUSH1 0x80 DUP11 DUP12 DUP7 SUB DUP13 ADDRESS GAS DELEGATECALL DUP1 DUP1 ISZERO PUSH2 0x9E3 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0xA01 JUMPI PUSH2 0xA24 JUMP JUMPDEST PUSH1 0x0 DUP15 MSTORE PUSH1 0x0 PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP16 ADD MSTORE PUSH2 0xA24 JUMP JUMPDEST DUP12 MLOAD DUP15 MSTORE PUSH1 0x20 DUP13 ADD MLOAD PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x40 DUP13 ADD MLOAD PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x60 DUP13 ADD MLOAD PUSH1 0x60 DUP16 ADD MSTORE JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0xA6C JUMPI PUSH2 0xA64 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA55 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x161F JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xA3B JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x638 JUMPI PUSH2 0xACC DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA8D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAA5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xABD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xE64 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xA73 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xAE2 PUSH2 0x2075 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x17 DUP4 MSTORE PUSH32 0x494E56414C49445F4E45575F4D414B45525F45504F4348000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 SWAP5 POP PUSH1 0x1 DUP7 ADD SWAP4 POP SWAP1 SWAP2 POP DUP2 DUP4 GT PUSH2 0xB62 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP5 SWAP1 SSTORE MLOAD PUSH32 0x666A5047451D0C744E58819166260F8048FE2786E33B3C1115AF94887A451CA7 SWAP1 PUSH2 0xBAE SWAP1 DUP6 SWAP1 PUSH2 0x4242 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x638 JUMPI PUSH2 0xC18 DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBD9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBF1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC09 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x828 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xBBF JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP2 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xC53 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP1 PUSH2 0x4207 JUMP JUMPDEST PUSH1 0xFF DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x14 DUP4 MSTORE PUSH32 0x41535345545F50524F58595F4D49534D41544348000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND SWAP5 POP DUP6 AND DUP5 EQ PUSH2 0xCCF JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP DUP5 SWAP2 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND ISZERO PUSH2 0xDD3 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD39 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD4D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xD71 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x3EA1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH32 0x41535345545F50524F58595F49445F4D49534D41544348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0xFF DUP1 DUP4 AND SWAP1 DUP9 AND EQ PUSH2 0xDD1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP JUMPDEST PUSH1 0xFF DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP6 AND OR SWAP1 SSTORE MLOAD PUSH32 0x27EF5F484E50F2DAF7C2D82C60FE4CE409009541176EB64095BEAC369DB1D260 SWAP1 PUSH2 0xE3F SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x4250 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xE6C PUSH2 0x369B JUMP JUMPDEST PUSH2 0xE77 DUP5 DUP5 DUP5 PUSH2 0x118D JUMP JUMPDEST SWAP1 POP DUP3 DUP2 PUSH1 0x20 ADD MLOAD EQ PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x14 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xED9 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xEFD PUSH2 0x2075 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP7 SWAP1 SWAP4 AND DUP3 MSTORE SWAP5 SWAP1 SWAP5 MSTORE SWAP1 SWAP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xF60 PUSH2 0x369B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0xF6D PUSH2 0x369B JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF7C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x1025 JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xFAA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0xFCA DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x2703 JUMP JUMPDEST SWAP2 POP PUSH2 0xFF6 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xFDD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x620 JUMPI INVALID JUMPDEST DUP5 MLOAD PUSH1 0x1 ADD DUP6 MSTORE SWAP1 POP PUSH2 0x1009 DUP6 DUP3 PUSH2 0x2715 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x101A JUMPI PUSH2 0x1025 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xF92 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0xFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x1085 PUSH2 0x369B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1094 PUSH2 0x369B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10A3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1181 JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10D1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x10ED SWAP1 DUP10 SWAP1 PUSH2 0x2703 JUMP JUMPDEST SWAP3 POP PUSH2 0x1130 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1100 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP11 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x111C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x2777 JUMP JUMPDEST SWAP2 POP PUSH2 0x115C DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1143 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC09 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1168 DUP7 DUP3 PUSH2 0x2715 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x1176 JUMPI PUSH2 0x1181 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x10B9 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1195 PUSH2 0x369B JUMP JUMPDEST PUSH2 0x119D PUSH2 0x367B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x11AB DUP9 PUSH2 0x1543 JUMP JUMPDEST SWAP4 POP PUSH2 0x11B5 PUSH2 0x2075 JUMP JUMPDEST SWAP3 POP PUSH2 0x11C9 DUP9 PUSH1 0xA0 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2703 JUMP JUMPDEST SWAP2 POP PUSH2 0x11D5 DUP8 DUP4 PUSH2 0x2794 JUMP JUMPDEST SWAP1 POP PUSH2 0x11E5 DUP9 DUP6 DUP6 DUP11 DUP6 DUP12 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0x11EF DUP9 DUP3 PUSH2 0x27AC JUMP JUMPDEST SWAP5 POP PUSH2 0x1206 DUP9 DUP5 DUP7 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP10 PUSH2 0x2488 JUMP JUMPDEST PUSH2 0x1025 DUP9 DUP5 DUP8 PUSH2 0x2816 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x1275 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP ADDRESS DUP7 DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1326 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1307 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE DUP6 SWAP1 KECCAK256 SLOAD DUP4 DUP7 ADD SWAP1 SWAP6 MSTORE PUSH1 0xF DUP4 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP6 POP SWAP4 POP POP PUSH1 0xFF AND ISZERO SWAP1 POP PUSH2 0x13B7 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND CALLER EQ PUSH2 0x1484 JUMPI PUSH2 0x1403 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x1899 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x145A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x8 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP3 POP ISZERO ISZERO SWAP1 POP PUSH2 0x151C JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP POP PUSH1 0x8 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x154B PUSH2 0x367B JUMP JUMPDEST PUSH2 0x1554 DUP3 PUSH2 0x2942 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1571 JUMPI PUSH1 0x1 JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH2 0x161A JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1583 JUMPI PUSH1 0x2 PUSH2 0x1567 JUMP JUMPDEST PUSH2 0x100 DUP3 ADD MLOAD TIMESTAMP LT PUSH2 0x1596 JUMPI PUSH1 0x4 PUSH2 0x1567 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x15BA JUMPI PUSH1 0x6 PUSH2 0x1567 JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD GT ISZERO PUSH2 0x15E7 JUMPI PUSH1 0x6 PUSH2 0x1567 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD GT PUSH2 0x1615 JUMPI PUSH1 0x5 PUSH2 0x1567 JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1627 PUSH2 0x367B JUMP JUMPDEST PUSH2 0x1630 DUP3 PUSH2 0x1543 JUMP JUMPDEST SWAP1 POP PUSH2 0x163C DUP3 DUP3 PUSH2 0x30B6 JUMP JUMPDEST PUSH2 0xA6C DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x31FF JUMP JUMPDEST PUSH2 0x1652 PUSH2 0x369B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x165F PUSH2 0x369B JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x166E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x1025 JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x169C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x16BC DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x2703 JUMP JUMPDEST SWAP2 POP PUSH2 0x16E8 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x16CF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC09 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x16F4 DUP6 DUP3 PUSH2 0x2715 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x1705 JUMPI PUSH2 0x1025 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1684 JUMP JUMPDEST PUSH2 0x1718 PUSH2 0x369B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1727 PUSH2 0x369B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1736 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1181 JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1764 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x1780 SWAP1 DUP10 SWAP1 PUSH2 0x2703 JUMP JUMPDEST SWAP3 POP PUSH2 0x1793 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1100 JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0x17BF DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17A6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x620 JUMPI INVALID JUMPDEST DUP6 MLOAD PUSH1 0x1 ADD DUP7 MSTORE SWAP1 POP PUSH2 0x17D2 DUP7 DUP3 PUSH2 0x2715 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x17E0 JUMPI PUSH2 0x1181 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x174C JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x1827 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP1 PUSH2 0x4207 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0x185F JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xB DUP2 MSTORE PUSH32 0x322E302E312D616C706861000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP9 MLOAD GT PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x1901 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH2 0x190B DUP9 PUSH2 0x327B JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1920 JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1930 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1984 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x6E5 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x41F6 JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1992 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x19FA JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x19F0 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x0 SWAP7 POP PUSH2 0x2068 JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1A08 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1B10 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x1A68 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A78 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1A96 DUP9 PUSH1 0x1 PUSH2 0x3330 JUMP JUMPDEST SWAP4 POP PUSH2 0x1AA3 DUP9 PUSH1 0x21 PUSH2 0x3330 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP11 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1AC8 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4161 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1AEC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP12 DUP2 AND SWAP1 DUP3 AND EQ SWAP9 POP SWAP3 POP PUSH2 0x2068 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1B1E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1CCA JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x1B7E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B8E JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1BAC DUP9 PUSH1 0x1 PUSH2 0x3330 JUMP JUMPDEST SWAP4 POP PUSH2 0x1BB9 DUP9 PUSH1 0x21 PUSH2 0x3330 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1C26 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1C07 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP4 DUP5 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 SUB DUP2 MSTORE SWAP4 DUP3 ADD SWAP1 DUP2 SWAP1 MSTORE DUP4 MLOAD SWAP4 SWAP5 POP SWAP3 DUP4 SWAP3 POP SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1C86 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1C67 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x1AC8 SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x4161 JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1CD8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1D4A JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x1D36 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND CALLER EQ SWAP7 POP PUSH2 0x2068 JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1D58 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1DFE JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP11 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x1DA5 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x4141 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1DD3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1DF7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x3BC0 JUMP JUMPDEST SWAP7 POP PUSH2 0x2068 JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1E0C JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1E9F JUMPI PUSH2 0x1E1B DUP9 PUSH2 0x33C4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1E56 JUMPI PUSH1 0x0 SWAP7 POP PUSH2 0x2068 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x1DA5 SWAP1 DUP14 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x410B JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1EAD JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1EE0 JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0x2068 JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1EEE JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1FD9 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x1F4E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1F5E JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1F7C DUP9 PUSH1 0x1 PUSH2 0x3330 JUMP JUMPDEST SWAP4 POP PUSH2 0x1F89 DUP9 PUSH1 0x21 PUSH2 0x3330 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1B DUP1 DUP3 MSTORE PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A410000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE SWAP4 MLOAD SWAP5 SWAP8 POP PUSH1 0x1 SWAP5 SWAP3 SWAP4 DUP16 SWAP4 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH2 0x1C26 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1FE7 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x201A JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0x2068 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x6E5 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x41F6 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x209C JUMPI PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0x209E JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x20B6 DUP3 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0xA0 ADD MLOAD PUSH2 0x3468 JUMP JUMPDEST PUSH2 0x20C8 DUP4 PUSH1 0x80 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x3468 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x18 DUP2 MSTORE PUSH32 0x4E454741544956455F5350524541445F52455155495245440000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP2 GT ISZERO PUSH2 0x211F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x212C PUSH2 0x364C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x2140 DUP10 PUSH1 0xA0 ADD MLOAD DUP9 PUSH2 0x2703 JUMP JUMPDEST SWAP4 POP PUSH2 0x2150 DUP9 PUSH1 0xA0 ADD MLOAD DUP8 PUSH2 0x2703 JUMP JUMPDEST SWAP3 POP PUSH2 0x2160 DUP4 DUP10 PUSH1 0x80 ADD MLOAD PUSH2 0x3468 JUMP JUMPDEST PUSH2 0x216E DUP6 DUP11 PUSH1 0xA0 ADD MLOAD PUSH2 0x3468 JUMP JUMPDEST GT PUSH2 0x2190 JUMPI DUP4 SWAP2 POP PUSH2 0x2189 DUP9 PUSH1 0xA0 ADD MLOAD DUP10 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2777 JUMP JUMPDEST SWAP1 POP PUSH2 0x21A9 JUMP JUMPDEST DUP3 SWAP1 POP PUSH2 0x21A6 DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP4 PUSH2 0x2777 JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH2 0x21B3 DUP10 DUP4 PUSH2 0x27AC JUMP JUMPDEST DUP6 MSTORE PUSH2 0x21BF DUP9 DUP3 PUSH2 0x27AC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP8 ADD DUP3 SWAP1 MSTORE DUP7 MLOAD MLOAD SWAP2 ADD MLOAD PUSH2 0x21D7 SWAP2 SWAP1 PUSH2 0x2703 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MSTORE POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP5 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x2245 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54414B45525F414D4F554E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP4 ISZERO ISZERO PUSH2 0x229D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x2318 JUMPI PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2316 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x239F JUMPI DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP7 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xD DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x494E56414C49445F54414B455200000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x239D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD ISZERO ISZERO PUSH2 0x2416 JUMPI PUSH2 0x23BD DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP4 PUSH2 0x1899 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4F524445525F5349474E4154555245000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x2414 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP JUMPDEST PUSH2 0x2429 DUP3 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x348C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x524F554E44494E475F4552524F52000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x247F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2496 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x34E2 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE DUP7 DUP2 ADD MLOAD DUP8 MLOAD DUP5 MLOAD SWAP4 DUP6 ADD MLOAD DUP6 DUP5 ADD MLOAD PUSH1 0x60 DUP8 ADD MLOAD PUSH2 0x140 DUP13 ADD MLOAD PUSH2 0x160 DUP14 ADD MLOAD SWAP7 MLOAD DUP12 SWAP9 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP8 DUP9 AND SWAP9 SWAP8 SWAP1 SWAP7 AND SWAP7 PUSH32 0xDE19F18E1B56E6EADA7ED95CCA8398B602BE32F5864640537EE9A9A3532BB29D SWAP7 PUSH2 0x2518 SWAP7 DUP16 SWAP7 SWAP2 SWAP6 SWAP1 SWAP5 SWAP2 SWAP4 SWAP1 SWAP3 SWAP1 PUSH2 0x4088 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x253A DUP8 PUSH2 0x140 ADD MLOAD PUSH2 0x327B JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV SWAP3 POP PUSH2 0x2551 DUP7 PUSH2 0x140 ADD MLOAD PUSH2 0x327B JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 SWAP5 DIV SWAP6 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x25E0 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x25B5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x25E0 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x25C3 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2609 DUP8 PUSH2 0x140 ADD MLOAD DUP5 DUP10 PUSH1 0x0 ADD MLOAD DUP10 PUSH1 0x0 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x140 DUP7 ADD MLOAD DUP7 MLOAD DUP9 MLOAD DUP7 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x2627 SWAP4 SWAP3 DUP7 SWAP3 SWAP1 SWAP2 PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x2641 DUP8 PUSH2 0x140 ADD MLOAD DUP5 DUP10 PUSH1 0x0 ADD MLOAD DUP9 DUP9 PUSH1 0x40 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x265F DUP2 PUSH1 0x1 DUP10 PUSH1 0x0 ADD MLOAD DUP11 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x267D DUP2 PUSH1 0x1 DUP9 PUSH1 0x0 ADD MLOAD DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP8 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x26CF JUMPI PUSH2 0x26CA DUP2 PUSH1 0x1 DUP8 DUP11 PUSH1 0x40 ADD MLOAD PUSH2 0x26C5 DUP10 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP11 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x34E2 JUMP JUMPDEST PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x247F JUMP JUMPDEST PUSH2 0x26E9 DUP2 PUSH1 0x1 DUP8 DUP11 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x247F DUP2 PUSH1 0x1 DUP8 DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x270F JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x2723 SWAP2 SWAP1 PUSH2 0x34E2 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2739 SWAP2 SWAP1 PUSH2 0x34E2 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2752 SWAP2 SWAP1 PUSH2 0x34E2 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x276B SWAP2 SWAP1 PUSH2 0x34E2 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x278C PUSH2 0x2786 DUP6 DUP5 PUSH2 0x3468 JUMP JUMPDEST DUP5 PUSH2 0x3598 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x27A3 JUMPI DUP2 PUSH2 0x27A5 JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x27B4 PUSH2 0x369B JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH2 0x27D0 SWAP2 DUP5 SWAP2 PUSH2 0x2777 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xA0 DUP5 ADD MLOAD PUSH1 0xC0 DUP6 ADD MLOAD PUSH2 0x27EC SWAP3 SWAP2 SWAP1 PUSH2 0x2777 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xA0 DUP5 ADD MLOAD PUSH1 0xE0 DUP6 ADD MLOAD PUSH2 0x280B SWAP3 SWAP2 SWAP1 PUSH2 0x2777 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x2829 DUP7 PUSH2 0x140 ADD MLOAD PUSH2 0x327B JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV SWAP3 POP PUSH2 0x2840 DUP7 PUSH2 0x160 ADD MLOAD PUSH2 0x327B JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 SWAP5 DIV SWAP6 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x28CF JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x28A4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x28CF JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x28B2 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x28F0 DUP7 PUSH2 0x140 ADD MLOAD DUP5 DUP9 PUSH1 0x0 ADD MLOAD DUP9 DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x290A DUP7 PUSH2 0x160 ADD MLOAD DUP4 DUP8 DUP10 PUSH1 0x0 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x2924 DUP2 PUSH1 0x1 DUP9 PUSH1 0x0 ADD MLOAD DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x40 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x293A DUP2 PUSH1 0x1 DUP8 DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x446F6D61696E536570617261746F72286164647265737320636F6E7472616374 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x21 ADD SWAP1 POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x29D9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x29BA JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 ADDRESS PUSH13 0x1000000000000000000000000 MUL DUP4 DUP4 ADD MSTORE DUP5 MLOAD PUSH1 0x14 DUP2 DUP6 SUB ADD DUP2 MSTORE PUSH1 0x34 SWAP1 SWAP4 ADD SWAP5 DUP6 SWAP1 MSTORE DUP3 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2A58 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2A39 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 DUP4 DUP4 ADD MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP5 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP5 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP5 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP5 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP5 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP5 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP5 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP5 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP5 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP5 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP5 ADD MSTORE PUSH32 0x62797465732074616B65724173736574446174612C0000000000000000000000 PUSH2 0x116 DUP5 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12B DUP5 ADD MSTORE DUP5 MLOAD DUP1 DUP5 SUB PUSH2 0x10C ADD DUP2 MSTORE PUSH2 0x12C SWAP1 SWAP4 ADD SWAP5 DUP6 SWAP1 MSTORE DUP3 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2CDB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2CBC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP11 PUSH1 0xC0 ADD MLOAD DUP12 PUSH1 0xE0 ADD MLOAD DUP13 PUSH2 0x100 ADD MLOAD DUP14 PUSH2 0x120 ADD MLOAD DUP15 PUSH2 0x140 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2D74 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2D55 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2DD7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2DB8 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP16 PUSH2 0x160 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2E3C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2E1D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2E9F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2E80 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP14 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP13 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP12 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP11 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP13 POP POP POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2FFB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2FDC JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x0 NOT PUSH1 0x20 SWAP5 DUP6 SUB PUSH2 0x100 EXP ADD SWAP1 DUP2 AND SWAP1 NOT SWAP2 SWAP1 SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP5 SWAP1 SWAP3 ADD DUP5 SWAP1 SUB DUP5 KECCAK256 DUP5 DUP3 ADD SWAP10 SWAP1 SWAP10 MSTORE DUP4 DUP3 ADD SWAP8 SWAP1 SWAP8 MSTORE PUSH1 0x60 DUP4 ADD SWAP6 SWAP1 SWAP6 MSTORE POP PUSH1 0x80 DUP1 DUP3 ADD SWAP7 SWAP1 SWAP7 MSTORE DUP4 MLOAD DUP1 DUP3 SUB SWAP1 SWAP7 ADD DUP7 MSTORE PUSH1 0xA0 ADD SWAP3 DUP4 SWAP1 MSTORE POP POP DUP3 MLOAD SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3084 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3065 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x3115 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x3190 JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x318E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP JUMPDEST PUSH2 0x3198 PUSH2 0x2075 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F4D414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP2 AND EQ PUSH2 0x638 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0xB1AD640E9E79B6FDBC3C415DC2914AB54E753D2971F51EAB910F7AA317A3163A SWAP3 PUSH2 0x326F SWAP3 SWAP1 SWAP2 SWAP1 PUSH2 0x41C3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x3301 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP DUP2 MLOAD DUP3 SWAP1 PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x3314 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH1 0x0 NOT ADD SWAP1 SWAP3 MSTORE POP PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x33BA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x344C JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH2 0x345B DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x35AF JUMP JUMPDEST DUP3 MLOAD PUSH1 0x13 NOT ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MUL DUP4 ISZERO DUP1 PUSH2 0x3484 JUMPI POP DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x3481 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST ISZERO ISZERO PUSH2 0x27A5 JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x349B JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x34B0 JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x34D9 JUMP JUMPDEST PUSH2 0x34CF PUSH2 0x34C0 DUP4 PUSH3 0xF4240 PUSH2 0x3468 JUMP JUMPDEST PUSH2 0x34CA DUP9 DUP8 PUSH2 0x3468 JUMP JUMPDEST PUSH2 0x3598 JUMP JUMPDEST PUSH2 0x3E8 DUP2 GT SWAP4 POP SWAP1 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x27A5 JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 DUP3 GT ISZERO PUSH2 0x293A JUMPI POP PUSH1 0xFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 MLOAD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 DUP2 SWAP1 PUSH4 0xA85E59E4 SWAP1 PUSH2 0x355E SWAP1 DUP10 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x4196 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3578 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x358C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x35A6 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x3639 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP POP ADD PUSH1 0x14 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x3661 PUSH2 0x369B JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x366E PUSH2 0x369B JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27A5 DUP3 CALLDATALOAD PUSH2 0x42EC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x36E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x36F4 PUSH2 0x36EF DUP3 PUSH2 0x429F JUMP JUMPDEST PUSH2 0x4278 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3732 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x371C DUP9 DUP3 PUSH2 0x3876 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3706 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x374D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x375B PUSH2 0x36EF DUP3 PUSH2 0x429F JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3732 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3783 DUP9 DUP3 PUSH2 0x38C5 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x376D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x37AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x37B8 PUSH2 0x36EF DUP3 PUSH2 0x429F JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x37DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3732 JUMPI DUP2 PUSH2 0x37F3 DUP9 DUP3 PUSH2 0x3821 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x37E0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27A5 DUP3 CALLDATALOAD PUSH2 0x42F8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27A5 DUP3 MLOAD PUSH2 0x42F8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27A5 DUP3 CALLDATALOAD PUSH2 0x42FD JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x383F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3857 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x386F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3887 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3895 PUSH2 0x36EF DUP3 PUSH2 0x42C0 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x38B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x38BC DUP4 DUP3 DUP5 PUSH2 0x4311 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x38D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x38E3 PUSH2 0x180 PUSH2 0x4278 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x38F1 DUP5 DUP5 PUSH2 0x36C4 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x3902 DUP5 DUP5 DUP4 ADD PUSH2 0x36C4 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x3916 DUP5 DUP3 DUP6 ADD PUSH2 0x36C4 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x392A DUP5 DUP3 DUP6 ADD PUSH2 0x36C4 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x393E DUP5 DUP3 DUP6 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x3952 DUP5 DUP3 DUP6 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x3966 DUP5 DUP3 DUP6 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x397A DUP5 DUP3 DUP6 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x398F DUP5 DUP3 DUP6 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x39A5 DUP5 DUP3 DUP6 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x39C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x39D3 DUP5 DUP3 DUP6 ADD PUSH2 0x3876 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x39F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3A01 DUP5 DUP3 DUP6 ADD PUSH2 0x3876 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27A5 DUP3 CALLDATALOAD PUSH2 0x4300 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27A5 DUP3 MLOAD PUSH2 0x4300 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x278C DUP5 DUP5 PUSH2 0x36C4 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3A57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3A63 DUP6 DUP6 PUSH2 0x36C4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3A74 DUP6 DUP3 DUP7 ADD PUSH2 0x36C4 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3A91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3A9D DUP6 DUP6 PUSH2 0x36C4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3A74 DUP6 DUP3 DUP7 ADD PUSH2 0x3809 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3AC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3AD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x278C DUP5 DUP3 DUP6 ADD PUSH2 0x373C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3AF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B1B DUP7 DUP3 DUP8 ADD PUSH2 0x373C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B44 DUP7 DUP3 DUP8 ADD PUSH2 0x3799 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B6D DUP7 DUP3 DUP8 ADD PUSH2 0x36D0 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3B8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3BA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3BAF DUP7 DUP3 DUP8 ADD PUSH2 0x373C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3B44 DUP7 DUP3 DUP8 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3BD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x278C DUP5 DUP5 PUSH2 0x3815 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3BF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x278C DUP5 DUP5 PUSH2 0x3821 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3C0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3A63 DUP6 DUP6 PUSH2 0x3821 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3C31 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3C3D DUP8 DUP8 PUSH2 0x3821 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x3C4E DUP8 DUP3 DUP9 ADD PUSH2 0x36C4 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3C6B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3C77 DUP8 DUP3 DUP9 ADD PUSH2 0x382D JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3C95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3CAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x278C DUP5 DUP3 DUP6 ADD PUSH2 0x38C5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3CCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3CE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3CF1 DUP8 DUP3 DUP9 ADD PUSH2 0x38C5 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D0E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3D1A DUP8 DUP3 DUP9 ADD PUSH2 0x38C5 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3D43 DUP8 DUP3 DUP9 ADD PUSH2 0x3876 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D60 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3D6C DUP8 DUP3 DUP9 ADD PUSH2 0x3876 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3D8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3DA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DB0 DUP7 DUP3 DUP8 ADD PUSH2 0x38C5 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3DC1 DUP7 DUP3 DUP8 ADD PUSH2 0x3821 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3DDE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B6D DUP7 DUP3 DUP8 ADD PUSH2 0x3876 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x3E03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3E0F DUP10 DUP10 PUSH2 0x3821 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x3E20 DUP10 DUP3 DUP11 ADD PUSH2 0x36C4 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E49 DUP10 DUP3 DUP11 ADD PUSH2 0x382D JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E74 DUP10 DUP3 DUP11 ADD PUSH2 0x382D JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3E95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x278C DUP5 DUP5 PUSH2 0x3A0E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3EB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x278C DUP5 DUP5 PUSH2 0x3A1A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3ED4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3EE0 DUP7 DUP7 PUSH2 0x3A0E JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3EF1 DUP7 DUP3 DUP8 ADD PUSH2 0x36C4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x3B6D DUP7 DUP3 DUP8 ADD PUSH2 0x36C4 JUMP JUMPDEST PUSH2 0x3F0B DUP2 PUSH2 0x42EC JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3F0B DUP2 PUSH2 0x42F8 JUMP JUMPDEST PUSH2 0x3F0B DUP2 PUSH2 0x42FD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3F2E DUP3 PUSH2 0x42E8 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x3F42 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x431D JUMP JUMPDEST PUSH2 0x3F4B DUP2 PUSH2 0x4349 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x3F0B DUP2 PUSH2 0x4306 JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x3FC8 DUP5 DUP3 PUSH2 0x3F1A JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x3FDB PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x3F1A JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x3FEE PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x3F1A JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x638 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x3F1A JUMP JUMPDEST DUP1 MLOAD PUSH2 0x120 DUP4 ADD SWAP1 PUSH2 0x4013 DUP5 DUP3 PUSH2 0x3FB7 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4026 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x3FB7 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x638 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0x3F1A JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x404B DUP5 DUP3 PUSH2 0x4071 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x405E PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x3F1A JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x638 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x3F0B DUP2 PUSH2 0x4300 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x3F02 JUMP JUMPDEST PUSH1 0xE0 DUP2 ADD PUSH2 0x4096 DUP3 DUP11 PUSH2 0x3F02 JUMP JUMPDEST PUSH2 0x40A3 PUSH1 0x20 DUP4 ADD DUP10 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x40B0 PUSH1 0x40 DUP4 ADD DUP9 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x40BD PUSH1 0x60 DUP4 ADD DUP8 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x40CA PUSH1 0x80 DUP4 ADD DUP7 PUSH2 0x3F1A JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xA0 DUP4 ADD MSTORE PUSH2 0x40DC DUP2 DUP6 PUSH2 0x3F23 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x40F0 DUP2 DUP5 PUSH2 0x3F23 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x3F11 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4119 DUP3 DUP7 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x4126 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x3F02 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4138 DUP2 DUP5 PUSH2 0x3F23 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x414F DUP3 DUP6 PUSH2 0x3F1A JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x278C DUP2 DUP5 PUSH2 0x3F23 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x416F DUP3 DUP8 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x417C PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x4071 JUMP JUMPDEST PUSH2 0x4189 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x4138 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x3F1A JUMP JUMPDEST PUSH1 0x80 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x41A7 DUP2 DUP8 PUSH2 0x3F23 JUMP JUMPDEST SWAP1 POP PUSH2 0x41B6 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x3F02 JUMP JUMPDEST PUSH2 0x4189 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x3F02 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x41D4 DUP2 DUP6 PUSH2 0x3F23 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x278C DUP2 DUP5 PUSH2 0x3F23 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x3F58 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x27A5 DUP2 DUP5 PUSH2 0x3F23 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x209E DUP2 PUSH2 0x3F61 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x3FB7 JUMP JUMPDEST PUSH2 0x120 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x4001 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x403A JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x3F1A JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x425E DUP3 DUP7 PUSH2 0x4071 JUMP JUMPDEST PUSH2 0x426B PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x3F02 JUMP JUMPDEST PUSH2 0x278C PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x3F02 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x4297 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x42B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x42D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x209E DUP3 PUSH2 0x42EC JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4338 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x4320 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x638 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xbf 0xab 0xe0 SWAP14 REVERT MOD PC PUSH23 0x9E182630C7628D39DCD8D912F30804A9F51E90300F9E47 PUSH19 0x6C6578706572696D656E74616CF50037000000 ", + "object": "0x60806040523480156200001157600080fd5b50604051620046263803806200462683398101806040526200003791908101906200016a565b60008054600160a060020a03191633179055805181906200006090600490602084019062000069565b5050506200022c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000ac57805160ff1916838001178555620000dc565b82800160010185558215620000dc579182015b82811115620000dc578251825591602001919060010190620000bf565b50620000ea929150620000ee565b5090565b6200010b91905b80821115620000ea5760008155600101620000f5565b90565b6000601f820183136200012057600080fd5b8151620001376200013182620001d1565b620001aa565b915080825260208301602083018583830111156200015457600080fd5b62000161838284620001f9565b50505092915050565b6000602082840312156200017d57600080fd5b81516001604060020a038111156200019457600080fd5b620001a2848285016200010e565b949350505050565b6040518181016001604060020a0381118282101715620001c957600080fd5b604052919050565b60006001604060020a03821115620001e857600080fd5b506020601f91909101601f19160190565b60005b8381101562000216578181015183820152602001620001fc565b8381111562000226576000848401525b50505050565b6143ea806200023c6000396000f3006080604052600436106101955763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663288cdc91811461019a578063297bb70b146101d05780632ac12622146101f25780633683ef8e1461021f578063380771641461023f5780633c28d8611461026c5780633e228bae146102995780634ac14782146102c65780634d0ae546146102e65780634f9559b11461030657806350dde190146103265780635c78d0c714610346578063642f2eaf1461036657806364a3bc15146103865780636f3627f8146103a657806377fcce68146103c65780637b8e3514146103e65780637e1d98081461040657806382c174d0146104265780638da5cb5b1461044657806392c1421e146104685780639363470214610488578063a3e20380146104a8578063b4be83d5146104c8578063bfc8bfce146104e8578063c75e0a8114610508578063d46b02c314610535578063dd1c7d1814610555578063e5fa431b14610575578063eea086ba14610595578063f2fde38b146105aa578063ffa1ad74146105ca575b600080fd5b3480156101a657600080fd5b506101ba6101b5366004613c09565b6105ec565b6040516101c7919061429f565b60405180910390f35b3480156101dc57600080fd5b506101f06101eb366004613b0e565b6105fe565b005b3480156101fe57600080fd5b5061021261020d366004613c09565b610669565b6040516101c7919061415a565b34801561022b57600080fd5b506101f061023a366004613c46565b61067e565b34801561024b57600080fd5b5061025f61025a366004613ee0565b61074c565b6040516101c79190614245565b34801561027857600080fd5b5061028c610287366004613d3e565b610767565b6040516101c79190614282565b3480156102a557600080fd5b506102b96102b4366004613dfe565b610853565b6040516101c79190614274565b3480156102d257600080fd5b506101f06102e1366004613ad9565b610a63565b3480156102f257600080fd5b506101f0610301366004613b0e565b610a9b565b34801561031257600080fd5b506101f0610321366004613c09565b610b00565b34801561033257600080fd5b506101f0610341366004613b0e565b610be7565b34801561035257600080fd5b506101f0610361366004613f1c565b610c4c565b34801561037257600080fd5b50610212610381366004613c09565b610e7a565b34801561039257600080fd5b506102b96103a1366004613dfe565b610e8f565b3480156103b257600080fd5b506101ba6103c1366004613a51565b610f0c565b3480156103d257600080fd5b506101f06103e1366004613aa9565b610f1e565b3480156103f257600080fd5b50610212610401366004613a6f565b610f63565b34801561041257600080fd5b506102b9610421366004613ba2565b610f83565b34801561043257600080fd5b50610212610441366004613c27565b61105b565b34801561045257600080fd5b5061045b61107b565b6040516101c791906140d7565b34801561047457600080fd5b5061045b610483366004613ee0565b61108a565b34801561049457600080fd5b506102126104a3366004613cae565b6110a8565b3480156104b457600080fd5b506102b96104c3366004613ba2565b611884565b3480156104d457600080fd5b506102b96104e3366004613dfe565b611994565b3480156104f457600080fd5b506101f0610503366004613e47565b611a18565b34801561051457600080fd5b50610528610523366004613d09565b611d4a565b6040516101c79190614291565b34801561054157600080fd5b506101f0610550366004613d09565b611e26565b34801561056157600080fd5b506102b9610570366004613ba2565b611e51565b34801561058157600080fd5b506102b9610590366004613ba2565b611f17565b3480156105a157600080fd5b5061045b611ff2565b3480156105b657600080fd5b506101f06105c5366004613a51565b612001565b3480156105d657600080fd5b506105df612069565b6040516101c79190614253565b60016020526000908152604090205481565b60005b83518110156106635761065a848281518110151561061b57fe5b90602001906020020151848381518110151561063357fe5b90602001906020020151848481518110151561064b57fe5b90602001906020020151611994565b50600101610601565b50505050565b60026020526000908152604090205460ff1681565b6106b9848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437506110a8945050505050565b60408051808201909152601181527f494e56414c49445f5349474e415455524500000000000000000000000000000060208201529015156107195760405160e560020a62461bcd0281526004016107109190614253565b60405180910390fd5b5050506000918252600560209081526040808420600160a060020a0390931684529190529020805460ff19166001179055565b600960205260009081526040902054600160a060020a031681565b61076f613677565b6107776136a6565b61077f6136a6565b61016080880151610140808901919091528801519087015260006107a288611d4a565b92506107ad87611d4a565b91506107b76120a0565b90506107c388886120cf565b6107d788888560400151856040015161214f565b8051602001519094506107f190899085908490808b612213565b602080850151015161080a90889084908490808a612213565b61082388828560200151866040015188600001516124b3565b61083c87828460200151856040015188602001516124b3565b61084888888387612552565b505050949350505050565b61085b6136c6565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000008082526060600483018181528851606485019081526020808b01516084870152958a015160a48601529189015160c4850152608089015160e485015260a089015161010485015260c089015161012485015260e0890151610144850152610100890151610164850152610120890151610184850152610140890180516101a486019081526101608b01516101c487015261018090525180516101e48601819052939591938493926024870192849261020489019291820191601f82010460005b8181101561095e578351855260209485019490930192600101610940565b50505050818103610160808401919091528c0151805180835260209283019291820191601f82010460005b818110156109a7578351855260209485019490930192600101610989565b5050508b84525084810360209384019081528a518083529093918201918b81019190601f82010460005b818110156109ef5783518552602094850194909301926001016109d1565b5060808a8b86038c305af4808015610a0e5760018114610a2c57610a4f565b60008e52600060208f0152600060408f0152600060608f0152610a4f565b8b518e5260208c015160208f015260408c015160408f015260608c015160608f01525b505050505050505050505050509392505050565b60005b8151811015610a9757610a8f8282815181101515610a8057fe5b90602001906020020151611e26565b600101610a66565b5050565b60005b835181101561066357610af78482815181101515610ab857fe5b906020019060200201518483815181101515610ad057fe5b906020019060200201518484815181101515610ae857fe5b90602001906020020151610e8f565b50600101610a9e565b6000806000610b0d6120a0565b600160a060020a038116600090815260036020908152604091829020548251808401909352601783527f494e56414c49445f4e45575f4d414b45525f45504f434800000000000000000091830191909152919450600186019350909150818311610b8d5760405160e560020a62461bcd0281526004016107109190614253565b50600160a060020a03831660008181526003602052604090819020849055517f666a5047451d0c744e58819166260f8048fe2786e33b3c1115af94887a451ca790610bd990859061429f565b60405180910390a250505050565b60005b835181101561066357610c438482815181101515610c0457fe5b906020019060200201518483815181101515610c1c57fe5b906020019060200201518484815181101515610c3457fe5b90602001906020020151610853565b50600101610bea565b6000805481908190600160a060020a03163314610c7e5760405160e560020a62461bcd02815260040161071090614264565b60ff8616600090815260096020908152604091829020548251808401909352601483527f41535345545f50524f58595f4d49534d4154434800000000000000000000000091830191909152600160a060020a03908116945085168414610cfa5760405160e560020a62461bcd0281526004016107109190614253565b50849150600160a060020a03821615610dfe5781600160a060020a031663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610d6457600080fd5b505af1158015610d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d9c9190810190613efe565b60408051808201909152601781527f41535345545f50524f58595f49445f4d49534d41544348000000000000000000602082015290915060ff80831690881614610dfc5760405160e560020a62461bcd0281526004016107109190614253565b505b60ff861660009081526009602052604090819020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038516179055517f27ef5f484e50f2daf7c2d82c60fe4ce409009541176eb64095beac369db1d26090610e6a908890889088906142ad565b60405180910390a1505050505050565b60076020526000908152604090205460ff1681565b610e976136c6565b610ea2848484611994565b9050828160200151146040805190810160405280601481526020017f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000815250901515610f045760405160e560020a62461bcd0281526004016107109190614253565b509392505050565b60036020526000908152604090205481565b6000610f286120a0565b600160a060020a03908116600090815260066020908152604080832096909316825294909452909220805460ff191691151591909117905550565b600660209081526000928352604080842090915290825290205460ff1681565b610f8b6136c6565b6060600080610f986136c6565b876000815181101515610fa757fe5b9060200190602002015161016001519350600092505b875183101561105057838884815181101515610fd557fe5b906020019060200201516101600181905250610ff587866020015161272e565b9150611021888481518110151561100857fe5b9060200190602002015183888681518110151561064b57fe5b8451600101855290506110348582612740565b868560200151141561104557611050565b600190920191610fbd565b505050509392505050565b600560209081526000928352604080842090915290825290205460ff1681565b600054600160a060020a031681565b60ff16600090815260096020526040902054600160a060020a031690565b6000806000806000806000808851116040805190810160405280601e81526020017f4c454e4754485f475245415445525f5448414e5f305f524551554952454400008152509015156111105760405160e560020a62461bcd0281526004016107109190614253565b5061111a886127a2565b60f860020a900460ff16600881111561112f57fe5b9550600086600881111561113f57fe5b141561119357604080518082018252601181527f5349474e41545552455f494c4c4547414c0000000000000000000000000000006020820152905160e560020a62461bcd0281526107109190600401614253565b60018660088111156111a157fe5b141561120957875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156111ff5760405160e560020a62461bcd0281526004016107109190614253565b5060009650611877565b600286600881111561121757fe5b141561131f57875160408051808201909152601281527f4c454e4754485f36365f524551554952454400000000000000000000000000006020820152906041146112775760405160e560020a62461bcd0281526004016107109190614253565b5087600081518110151561128757fe5b016020015160f860020a9081900481020494506112a5886001612857565b93506112b2886021612857565b925060018a868686604051600081526020016040526040516112d794939291906141be565b60206040516020810390808403906000865af11580156112fb573d6000803e3d6000fd5b5050604051601f190151600160a060020a038b811690821614985092506118779050565b600386600881111561132d57fe5b14156114d957875160408051808201909152601281527f4c454e4754485f36365f5245515549524544000000000000000000000000000060208201529060411461138d5760405160e560020a62461bcd0281526004016107109190614253565b5087600081518110151561139d57fe5b016020015160f860020a9081900481020494506113bb886001612857565b93506113c8886021612857565b925060016040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152508b6040516020018083805190602001908083835b602083106114355780518252601f199092019160209182019101611416565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b602083106114955780518252601f199092019160209182019101611476565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600083529101928390526112d794509250899189915088906141be565b60048660088111156114e757fe5b141561155957875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156115455760405160e560020a62461bcd0281526004016107109190614253565b50600160a060020a03891633149650611877565b600586600881111561156757fe5b141561160d576040517f1626ba7e000000000000000000000000000000000000000000000000000000008152600160a060020a038a1690631626ba7e906115b4908d908c9060040161419e565b602060405180830381600087803b1580156115ce57600080fd5b505af11580156115e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116069190810190613beb565b9650611877565b600686600881111561161b57fe5b14156116ae5761162a886128eb565b600160a060020a03808b1660009081526006602090815260408083209385168352929052205490915060ff1615156116655760009650611877565b6040517f93634702000000000000000000000000000000000000000000000000000000008152600160a060020a038216906393634702906115b4908d908d908d90600401614168565b60078660088111156116bc57fe5b14156116ef5760008a8152600560209081526040808320600160a060020a038d16845290915290205460ff169650611877565b60088660088111156116fd57fe5b14156117e857875160408051808201909152601281527f4c454e4754485f36365f5245515549524544000000000000000000000000000060208201529060411461175d5760405160e560020a62461bcd0281526004016107109190614253565b5087600081518110151561176d57fe5b016020015160f860020a90819004810204945061178b886001612857565b9350611798886021612857565b604080518082018252601b8082527f19457468657265756d205369676e6564204d6573736167653a0a4100000000006020808401918252935194975060019492938f930191829190808383611435565b60078660088111156117f657fe5b14156118295760008a8152600560209081526040808320600160a060020a038d16845290915290205460ff169650611877565b604080518082018252601581527f5349474e41545552455f554e535550504f5254454400000000000000000000006020820152905160e560020a62461bcd0281526107109190600401614253565b5050505050509392505050565b61188c6136c6565b6060600080600061189b6136c6565b8860008151811015156118aa57fe5b9060200190602002015161014001519450600093505b8851841015611988578489858151811015156118d857fe5b60209081029091010151610140015285516118f490899061272e565b9250611937898581518110151561190757fe5b9060200190602002015160a001518a8681518110151561192357fe5b90602001906020020151608001518561298f565b9150611963898581518110151561194a57fe5b90602001906020020151838987815181101515610c3457fe5b905061196f8682612740565b855188141561197d57611988565b6001909301926118c0565b50505050509392505050565b61199c6136c6565b6119a46136a6565b60008060006119b288611d4a565b93506119bc6120a0565b92506119d08860a00151856040015161272e565b91506119dc87836129ac565b90506119ec8885858a858b612213565b6119f688826129c4565b9450611a0d888486602001518760400151896124b3565b611050888487612a2e565b60085460408051808201909152601281527f5245454e5452414e43595f494c4c4547414c00000000000000000000000000006020820152600091600160a060020a031615611a7c5760405160e560020a62461bcd0281526004016107109190614253565b5030868887876040516020018086600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018481526020018383808284378201915050955050505050506040516020818303038152906040526040518082805190602001908083835b60208310611b2d5780518252601f199092019160209182019101611b0e565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008181526007835285902054838601909552600f83527f494e56414c49445f54585f48415348000000000000000000000000000000000091830191909152955093505060ff16159050611bbe5760405160e560020a62461bcd0281526004016107109190614253565b50600160a060020a0386163314611c8b57611c0a818785858080601f016020809104026020016040519081016040528093929190818152602001838380828437506110a8945050505050565b60408051808201909152601481527f494e56414c49445f54585f5349474e41545552450000000000000000000000006020820152901515611c615760405160e560020a62461bcd0281526004016107109190614253565b506008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161790555b60008181526007602052604090819020805460ff191660011790555130908690869080838380828437820191505092505050600060405180830381855af460408051808201909152601081527f4641494c45445f455845435554494f4e000000000000000000000000000000006020820152925015159050611d235760405160e560020a62461bcd0281526004016107109190614253565b50506008805473ffffffffffffffffffffffffffffffffffffffff19169055505050505050565b611d526136a6565b611d5b82612b5a565b602082015260808201511515611d785760015b60ff168152611e21565b60a08201511515611d8a576002611d6e565b6101008201514210611d9d576004611d6e565b60208082015160009081526002909152604090205460ff1615611dc1576006611d6e565b6101208201518251600160a060020a03166000908152600360205260409020541115611dee576006611d6e565b602080820151600090815260019091526040908190205490820181905260a083015111611e1c576005611d6e565b600381525b919050565b611e2e6136a6565b611e3782611d4a565b9050611e4382826132ce565b610a97828260200151613417565b611e596136c6565b6060600080611e666136c6565b876000815181101515611e7557fe5b9060200190602002015161016001519350600092505b875183101561105057838884815181101515611ea357fe5b906020019060200201516101600181905250611ec387866020015161272e565b9150611eef8884815181101515611ed657fe5b90602001906020020151838886815181101515610c3457fe5b9050611efb8582612740565b8685602001511415611f0c57611050565b600190920191611e8b565b611f1f6136c6565b60606000806000611f2e6136c6565b886000815181101515611f3d57fe5b9060200190602002015161014001519450600093505b885184101561198857848985815181101515611f6b57fe5b6020908102909101015161014001528551611f8790899061272e565b9250611f9a898581518110151561190757fe5b9150611fc68985815181101515611fad57fe5b9060200190602002015183898781518110151561064b57fe5b855160010186529050611fd98682612740565b8551881415611fe757611988565b600190930192611f53565b600854600160a060020a031681565b600054600160a060020a0316331461202e5760405160e560020a62461bcd02815260040161071090614264565b600160a060020a03811615612066576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60408051808201909152600b81527f322e302e312d616c706861000000000000000000000000000000000000000000602082015281565b6008546000908190600160a060020a0316156120c757600854600160a060020a03166120c9565b335b92915050565b6120e18260a001518260a00151613493565b6120f383608001518360800151613493565b60408051808201909152601881527f4e454741544956455f5350524541445f52455155495245440000000000000000602082015291111561214a5760405160e560020a62461bcd0281526004016107109190614253565b505050565b612157613677565b60008060008061216b8960a001518861272e565b935061217b8860a001518761272e565b925061218b838960800151613493565b612199858a60a00151613493565b116121bb578391506121b48860a0015189608001518461298f565b90506121d4565b8290506121d188608001518960a001518361298f565b91505b6121de89836129c4565b85526121ea88826129c4565b6020808701829052865151910151612202919061272e565b604086015250505050949350505050565b845160408051808201909152601081527f4f524445525f554e46494c4c41424c450000000000000000000000000000000060208201529060ff166003146122705760405160e560020a62461bcd0281526004016107109190614253565b5060408051808201909152601481527f494e56414c49445f54414b45525f414d4f554e5400000000000000000000000060208201528315156122c85760405160e560020a62461bcd0281526004016107109190614253565b506060860151600160a060020a03161561234357606086015160408051808201909152600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015290600160a060020a031633146123415760405160e560020a62461bcd0281526004016107109190614253565b505b6020860151600160a060020a0316156123ca5783600160a060020a03168660200151600160a060020a0316146040805190810160405280600d81526020017f494e56414c49445f54414b4552000000000000000000000000000000000000008152509015156123c85760405160e560020a62461bcd0281526004016107109190614253565b505b60408501511515612441576123e885602001518760000151836110a8565b60408051808201909152601781527f494e56414c49445f4f524445525f5349474e4154555245000000000000000000602082015290151561243f5760405160e560020a62461bcd0281526004016107109190614253565b505b612454828760a0015188608001516134b7565b60408051808201909152600e81527f524f554e44494e475f4552524f52000000000000000000000000000000000000602082015290156124aa5760405160e560020a62461bcd0281526004016107109190614253565b50505050505050565b6124c182826020015161350d565b600084815260016020908152604091829020929092558681015187518451938501518584015160608701516101408c01516101608d015196518b98600160a060020a039788169897909616967fde19f18e1b56e6eada7ed95cca8398b602be32f5864640537ee9a9a3532bb29d96612543968f969195909491939092906140e5565b60405180910390a45050505050565b60008060606125658761014001516127a2565b60f860020a9004925061257c8661014001516127a2565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260f860020a909404955083018282801561260b5780601f106125e05761010080835404028352916020019161260b565b820191906000526020600020905b8154815290600101906020018083116125ee57829003601f168201915b50505050509050612634876101400151848960000151896000015188602001516020015161351c565b6101408601518651885186516020015161265293928692909161351c565b61266c87610140015184896000015188886040015161351c565b61268a81600189600001518a6040015188600001516040015161351c565b6126a88160018860000151896040015188602001516040015161351c565b8560400151600160a060020a03168760400151600160a060020a031614156126fa576126f5816001878a604001516126f08960000151606001518a602001516060015161350d565b61351c565b6124aa565b612714816001878a6040015188600001516060015161351c565b6124aa81600187896040015188602001516060015161351c565b60008282111561273a57fe5b50900390565b8151815161274e919061350d565b825260208083015190820151612764919061350d565b60208301526040808301519082015161277d919061350d565b604083015260608083015190820151612796919061350d565b60609092019190915250565b600080825111606060405190810160405280602181526020017f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524581526020017f44000000000000000000000000000000000000000000000000000000000000008152509015156128285760405160e560020a62461bcd0281526004016107109190614253565b5081518290600019810190811061283b57fe5b01602001518251600019019092525060f860020a908190040290565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f51554952454400000000000000000000000000000000000000000000000000008152509015156128e15760405160e560020a62461bcd0281526004016107109190614253565b5050016020015190565b6000601482511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f51554952454400000000000000000000000000000000000000000000000000008152509015156129735760405160e560020a62461bcd0281526004016107109190614253565b506129828260148451036135c3565b8251601319019092525090565b60006129a461299e8584613493565b84613660565b949350505050565b60008183106129bb57816129bd565b825b9392505050565b6129cc6136c6565b6020810182905260a083015160808401516129e891849161298f565b8152602081015160a084015160c0850151612a0492919061298f565b6040820152602081015160a084015160e0850151612a2392919061298f565b606082015292915050565b6000806060612a418661014001516127a2565b60f860020a90049250612a588661016001516127a2565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260f860020a9094049550830182828015612ae75780601f10612abc57610100808354040283529160200191612ae7565b820191906000526020600020905b815481529060010190602001808311612aca57829003601f168201915b50505050509050612b0886610140015184886000015188886000015161351c565b612b2286610160015183878960000151886020015161351c565b612b3c81600188600001518960400151886040015161351c565b612b52816001878960400151886060015161351c565b505050505050565b600060405160200180807f446f6d61696e536570617261746f72286164647265737320636f6e747261637481526020017f290000000000000000000000000000000000000000000000000000000000000081525060210190506040516020818303038152906040526040518082805190602001908083835b60208310612bf15780518252601f199092019160209182019101612bd2565b51815160209384036101000a600019018019909216911617905260408051929094018290038220306c0100000000000000000000000002838301528451601481850301815260349093019485905282519096509194508392508401908083835b60208310612c705780518252601f199092019160209182019101612c51565b51815160209384036101000a6000190180199092169116179052604080519290940182900382207f4f72646572280000000000000000000000000000000000000000000000000000838301527f61646472657373206d616b6572416464726573732c000000000000000000000060268401527f616464726573732074616b6572416464726573732c0000000000000000000000603b8401527f6164647265737320666565526563697069656e74416464726573732c0000000060508401527f616464726573732073656e646572416464726573732c00000000000000000000606c8401527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828401527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8401527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48401527f75696e743235362074616b65724665652c00000000000000000000000000000060c58401527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68401527f75696e743235362073616c742c0000000000000000000000000000000000000060f48401527f6279746573206d616b65724173736574446174612c00000000000000000000006101018401527f62797465732074616b65724173736574446174612c00000000000000000000006101168401527f290000000000000000000000000000000000000000000000000000000000000061012b840152845180840361010c01815261012c9093019485905282519096509194508392508401908083835b60208310612ef35780518252601f199092019160209182019101612ed4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020846000015185602001518660400151876060015188608001518960a001518a60c001518b60e001518c61010001518d61012001518e61014001516040516020018082805190602001908083835b60208310612f8c5780518252601f199092019160209182019101612f6d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310612fef5780518252601f199092019160209182019101612fd0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208f61016001516040516020018082805190602001908083835b602083106130545780518252601f199092019160209182019101613035565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106130b75780518252601f199092019160209182019101613098565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020604051602001808d600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018c600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018b600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018a600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401898152602001888152602001878152602001868152602001858152602001848152602001836000191660001916815260200182600019166000191681526020019c505050505050505050505050506040516020818303038152906040526040518082805190602001908083835b602083106132135780518252601f1990920191602091820191016131f4565b51815160001960209485036101000a019081169019919091161790526040805194909201849003842084820199909952838201979097526060830195909552506080808201969096528351808203909601865260a001928390525050825190918291908401908083835b6020831061329c5780518252601f19909201916020918201910161327d565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b805160408051808201909152601081527f4f524445525f554e46494c4c41424c4500000000000000000000000000000000602082015260009160ff1660031461332d5760405160e560020a62461bcd0281526004016107109190614253565b506060830151600160a060020a0316156133a857606083015160408051808201909152600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015290600160a060020a031633146133a65760405160e560020a62461bcd0281526004016107109190614253565b505b6133b06120a0565b835160408051808201909152600d81527f494e56414c49445f4d414b4552000000000000000000000000000000000000006020820152919250600160a060020a038084169116146106635760405160e560020a62461bcd0281526004016107109190614253565b60008181526002602052604090819020805460ff1916600117905582810151835161014085015161016086015193518594600160a060020a039485169493909316927fb1ad640e9e79b6fdbc3c415dc2914ab54e753d2971f51eab910f7aa317a3163a9261348792909190614220565b60405180910390a45050565b60008282028315806134af57508284828115156134ac57fe5b04145b15156129bd57fe5b6000806000848015156134c657fe5b86850991508115156134db5760009250613504565b6134fa6134eb83620f4240613493565b6134f58887613493565b613660565b6103e88111935090505b50509392505050565b6000828201838110156129bd57fe5b600080821115612b52575060ff8416600090815260096020526040908190205490517fa85e59e4000000000000000000000000000000000000000000000000000000008152600160a060020a0390911690819063a85e59e4906135899089908890889088906004016141f3565b600060405180830381600087803b1580156135a357600080fd5b505af11580156135b7573d6000803e3d6000fd5b50505050505050505050565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f515549524544000000000000000000000000000000000000000000000000000081525090151561364d5760405160e560020a62461bcd0281526004016107109190614253565b50500160140151600160a060020a031690565b600080828481151561366e57fe5b04949350505050565b6101206040519081016040528061368c6136c6565b81526020016136996136c6565b8152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b60006129bd8235614349565b6000601f8201831361370c57600080fd5b813561371f61371a826142fc565b6142d5565b81815260209384019390925082018360005b8381101561375d578135860161374788826138a1565b8452506020928301929190910190600101613731565b5050505092915050565b6000601f8201831361377857600080fd5b813561378661371a826142fc565b81815260209384019390925082018360005b8381101561375d57813586016137ae88826138f0565b8452506020928301929190910190600101613798565b6000601f820183136137d557600080fd5b81356137e361371a826142fc565b9150818183526020840193506020810190508385602084028201111561380857600080fd5b60005b8381101561375d578161381e888261384c565b845250602092830192919091019060010161380b565b60006129bd8235614355565b60006129bd8251614355565b60006129bd823561435a565b600080601f8301841361386a57600080fd5b50813567ffffffffffffffff81111561388257600080fd5b60208301915083600182028301111561389a57600080fd5b9250929050565b6000601f820183136138b257600080fd5b81356138c061371a8261431d565b915080825260208301602083018583830111156138dc57600080fd5b6138e783828461436e565b50505092915050565b6000610180828403121561390357600080fd5b61390e6101806142d5565b9050600061391c84846136ef565b825250602061392d848483016136ef565b6020830152506040613941848285016136ef565b6040830152506060613955848285016136ef565b60608301525060806139698482850161384c565b60808301525060a061397d8482850161384c565b60a08301525060c06139918482850161384c565b60c08301525060e06139a58482850161384c565b60e0830152506101006139ba8482850161384c565b610100830152506101206139d08482850161384c565b6101208301525061014082013567ffffffffffffffff8111156139f257600080fd5b6139fe848285016138a1565b6101408301525061016082013567ffffffffffffffff811115613a2057600080fd5b613a2c848285016138a1565b6101608301525092915050565b60006129bd823561435d565b60006129bd825161435d565b600060208284031215613a6357600080fd5b60006129a484846136ef565b60008060408385031215613a8257600080fd5b6000613a8e85856136ef565b9250506020613a9f858286016136ef565b9150509250929050565b60008060408385031215613abc57600080fd5b6000613ac885856136ef565b9250506020613a9f85828601613834565b600060208284031215613aeb57600080fd5b813567ffffffffffffffff811115613b0257600080fd5b6129a484828501613767565b600080600060608486031215613b2357600080fd5b833567ffffffffffffffff811115613b3a57600080fd5b613b4686828701613767565b935050602084013567ffffffffffffffff811115613b6357600080fd5b613b6f868287016137c4565b925050604084013567ffffffffffffffff811115613b8c57600080fd5b613b98868287016136fb565b9150509250925092565b600080600060608486031215613bb757600080fd5b833567ffffffffffffffff811115613bce57600080fd5b613bda86828701613767565b9350506020613b6f8682870161384c565b600060208284031215613bfd57600080fd5b60006129a48484613840565b600060208284031215613c1b57600080fd5b60006129a4848461384c565b60008060408385031215613c3a57600080fd5b6000613a8e858561384c565b60008060008060608587031215613c5c57600080fd5b6000613c68878761384c565b9450506020613c79878288016136ef565b935050604085013567ffffffffffffffff811115613c9657600080fd5b613ca287828801613858565b95989497509550505050565b600080600060608486031215613cc357600080fd5b6000613ccf868661384c565b9350506020613ce0868287016136ef565b925050604084013567ffffffffffffffff811115613cfd57600080fd5b613b98868287016138a1565b600060208284031215613d1b57600080fd5b813567ffffffffffffffff811115613d3257600080fd5b6129a4848285016138f0565b60008060008060808587031215613d5457600080fd5b843567ffffffffffffffff811115613d6b57600080fd5b613d77878288016138f0565b945050602085013567ffffffffffffffff811115613d9457600080fd5b613da0878288016138f0565b935050604085013567ffffffffffffffff811115613dbd57600080fd5b613dc9878288016138a1565b925050606085013567ffffffffffffffff811115613de657600080fd5b613df2878288016138a1565b91505092959194509250565b600080600060608486031215613e1357600080fd5b833567ffffffffffffffff811115613e2a57600080fd5b613e36868287016138f0565b9350506020613ce08682870161384c565b60008060008060008060808789031215613e6057600080fd5b6000613e6c898961384c565b9650506020613e7d89828a016136ef565b955050604087013567ffffffffffffffff811115613e9a57600080fd5b613ea689828a01613858565b9450945050606087013567ffffffffffffffff811115613ec557600080fd5b613ed189828a01613858565b92509250509295509295509295565b600060208284031215613ef257600080fd5b60006129a48484613a39565b600060208284031215613f1057600080fd5b60006129a48484613a45565b600080600060608486031215613f3157600080fd5b6000613f3d8686613a39565b9350506020613f4e868287016136ef565b9250506040613b98868287016136ef565b613f6881614349565b82525050565b613f6881614355565b613f688161435a565b6000613f8b82614345565b808452613f9f81602086016020860161437a565b613fa8816143a6565b9093016020019392505050565b613f6881614363565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b805160808301906140258482613f77565b5060208201516140386020850182613f77565b50604082015161404b6040850182613f77565b5060608201516106636060850182613f77565b80516101208301906140708482614014565b5060208201516140836080850182614014565b506040820151610663610100850182613f77565b805160608301906140a884826140ce565b5060208201516140bb6020850182613f77565b5060408201516106636040850182613f77565b613f688161435d565b602081016120c98284613f5f565b60e081016140f3828a613f5f565b6141006020830189613f77565b61410d6040830188613f77565b61411a6060830187613f77565b6141276080830186613f77565b81810360a08301526141398185613f80565b905081810360c083015261414d8184613f80565b9998505050505050505050565b602081016120c98284613f6e565b606081016141768286613f77565b6141836020830185613f5f565b81810360408301526141958184613f80565b95945050505050565b604081016141ac8285613f77565b81810360208301526129a48184613f80565b608081016141cc8287613f77565b6141d960208301866140ce565b6141e66040830185613f77565b6141956060830184613f77565b608080825281016142048187613f80565b90506142136020830186613f5f565b6141e66040830185613f5f565b604080825281016142318185613f80565b905081810360208301526129a48184613f80565b602081016120c98284613fb5565b602080825281016129bd8184613f80565b602080825281016120c981613fbe565b608081016120c98284614014565b61012081016120c9828461405e565b606081016120c98284614097565b602081016120c98284613f77565b606081016142bb82866140ce565b6142c86020830185613f5f565b6129a46040830184613f5f565b60405181810167ffffffffffffffff811182821017156142f457600080fd5b604052919050565b600067ffffffffffffffff82111561431357600080fd5b5060209081020190565b600067ffffffffffffffff82111561433457600080fd5b506020601f91909101601f19160190565b5190565b600160a060020a031690565b151590565b90565b60ff1690565b60006120c982614349565b82818337506000910152565b60005b8381101561439557818101518382015260200161437d565b838111156106635750506000910152565b601f01601f1916905600a265627a7a723058200cdc1a8df8fcf3068c1c2c9499b0494875a807cfdd1d5f3d94484c3a4496b04e6c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x4626 CODESIZE SUB DUP1 PUSH3 0x4626 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x16A JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE DUP1 MLOAD DUP2 SWAP1 PUSH3 0x60 SWAP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x69 JUMP JUMPDEST POP POP POP PUSH3 0x22C JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0xAC JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0xDC JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0xDC JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0xDC JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0xBF JUMP JUMPDEST POP PUSH3 0xEA SWAP3 SWAP2 POP PUSH3 0xEE JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x10B SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0xEA JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0xF5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x120 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x137 PUSH3 0x131 DUP3 PUSH3 0x1D1 JUMP JUMPDEST PUSH3 0x1AA JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x161 DUP4 DUP3 DUP5 PUSH3 0x1F9 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x17D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x194 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x1A2 DUP5 DUP3 DUP6 ADD PUSH3 0x10E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x1C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x1E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x216 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x1FC JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x226 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x43EA DUP1 PUSH3 0x23C PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x195 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x288CDC91 DUP2 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0x297BB70B EQ PUSH2 0x1D0 JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x1F2 JUMPI DUP1 PUSH4 0x3683EF8E EQ PUSH2 0x21F JUMPI DUP1 PUSH4 0x38077164 EQ PUSH2 0x23F JUMPI DUP1 PUSH4 0x3C28D861 EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0x3E228BAE EQ PUSH2 0x299 JUMPI DUP1 PUSH4 0x4AC14782 EQ PUSH2 0x2C6 JUMPI DUP1 PUSH4 0x4D0AE546 EQ PUSH2 0x2E6 JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x306 JUMPI DUP1 PUSH4 0x50DDE190 EQ PUSH2 0x326 JUMPI DUP1 PUSH4 0x5C78D0C7 EQ PUSH2 0x346 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0x64A3BC15 EQ PUSH2 0x386 JUMPI DUP1 PUSH4 0x6F3627F8 EQ PUSH2 0x3A6 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x3C6 JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x3E6 JUMPI DUP1 PUSH4 0x7E1D9808 EQ PUSH2 0x406 JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x426 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x446 JUMPI DUP1 PUSH4 0x92C1421E EQ PUSH2 0x468 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x488 JUMPI DUP1 PUSH4 0xA3E20380 EQ PUSH2 0x4A8 JUMPI DUP1 PUSH4 0xB4BE83D5 EQ PUSH2 0x4C8 JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x4E8 JUMPI DUP1 PUSH4 0xC75E0A81 EQ PUSH2 0x508 JUMPI DUP1 PUSH4 0xD46B02C3 EQ PUSH2 0x535 JUMPI DUP1 PUSH4 0xDD1C7D18 EQ PUSH2 0x555 JUMPI DUP1 PUSH4 0xE5FA431B EQ PUSH2 0x575 JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x595 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x5AA JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x5CA JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C09 JUMP JUMPDEST PUSH2 0x5EC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x429F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0x3B0E JUMP JUMPDEST PUSH2 0x5FE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x20D CALLDATASIZE PUSH1 0x4 PUSH2 0x3C09 JUMP JUMPDEST PUSH2 0x669 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x415A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x23A CALLDATASIZE PUSH1 0x4 PUSH2 0x3C46 JUMP JUMPDEST PUSH2 0x67E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x24B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25F PUSH2 0x25A CALLDATASIZE PUSH1 0x4 PUSH2 0x3EE0 JUMP JUMPDEST PUSH2 0x74C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x4245 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x287 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D3E JUMP JUMPDEST PUSH2 0x767 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x4282 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x2B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x3DFE JUMP JUMPDEST PUSH2 0x853 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x4274 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x2E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AD9 JUMP JUMPDEST PUSH2 0xA63 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x301 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B0E JUMP JUMPDEST PUSH2 0xA9B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x312 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x321 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C09 JUMP JUMPDEST PUSH2 0xB00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x332 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x341 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B0E JUMP JUMPDEST PUSH2 0xBE7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x352 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x361 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F1C JUMP JUMPDEST PUSH2 0xC4C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x381 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C09 JUMP JUMPDEST PUSH2 0xE7A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x392 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x3A1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3DFE JUMP JUMPDEST PUSH2 0xE8F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH2 0x3C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A51 JUMP JUMPDEST PUSH2 0xF0C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x3E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AA9 JUMP JUMPDEST PUSH2 0xF1E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x401 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A6F JUMP JUMPDEST PUSH2 0xF63 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x412 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x421 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BA2 JUMP JUMPDEST PUSH2 0xF83 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x432 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x441 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C27 JUMP JUMPDEST PUSH2 0x105B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x452 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45B PUSH2 0x107B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x40D7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x474 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45B PUSH2 0x483 CALLDATASIZE PUSH1 0x4 PUSH2 0x3EE0 JUMP JUMPDEST PUSH2 0x108A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x494 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x4A3 CALLDATASIZE PUSH1 0x4 PUSH2 0x3CAE JUMP JUMPDEST PUSH2 0x10A8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x4C3 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BA2 JUMP JUMPDEST PUSH2 0x1884 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x4E3 CALLDATASIZE PUSH1 0x4 PUSH2 0x3DFE JUMP JUMPDEST PUSH2 0x1994 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x503 CALLDATASIZE PUSH1 0x4 PUSH2 0x3E47 JUMP JUMPDEST PUSH2 0x1A18 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x514 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x528 PUSH2 0x523 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D09 JUMP JUMPDEST PUSH2 0x1D4A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x4291 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x541 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x550 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D09 JUMP JUMPDEST PUSH2 0x1E26 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x561 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x570 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BA2 JUMP JUMPDEST PUSH2 0x1E51 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x590 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BA2 JUMP JUMPDEST PUSH2 0x1F17 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45B PUSH2 0x1FF2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x5C5 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A51 JUMP JUMPDEST PUSH2 0x2001 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5DF PUSH2 0x2069 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x663 JUMPI PUSH2 0x65A DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x61B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x633 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x64B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1994 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x601 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x6B9 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x10A8 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x719 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH2 0x76F PUSH2 0x3677 JUMP JUMPDEST PUSH2 0x777 PUSH2 0x36A6 JUMP JUMPDEST PUSH2 0x77F PUSH2 0x36A6 JUMP JUMPDEST PUSH2 0x160 DUP1 DUP9 ADD MLOAD PUSH2 0x140 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x0 PUSH2 0x7A2 DUP9 PUSH2 0x1D4A JUMP JUMPDEST SWAP3 POP PUSH2 0x7AD DUP8 PUSH2 0x1D4A JUMP JUMPDEST SWAP2 POP PUSH2 0x7B7 PUSH2 0x20A0 JUMP JUMPDEST SWAP1 POP PUSH2 0x7C3 DUP9 DUP9 PUSH2 0x20CF JUMP JUMPDEST PUSH2 0x7D7 DUP9 DUP9 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x214F JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0x7F1 SWAP1 DUP10 SWAP1 DUP6 SWAP1 DUP5 SWAP1 DUP1 DUP12 PUSH2 0x2213 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD MLOAD ADD MLOAD PUSH2 0x80A SWAP1 DUP9 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP1 DUP11 PUSH2 0x2213 JUMP JUMPDEST PUSH2 0x823 DUP9 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x83C DUP8 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x848 DUP9 DUP9 DUP4 DUP8 PUSH2 0x2552 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x85B PUSH2 0x36C6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 DUP1 DUP3 MSTORE PUSH1 0x60 PUSH1 0x4 DUP4 ADD DUP2 DUP2 MSTORE DUP9 MLOAD PUSH1 0x64 DUP6 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 DUP1 DUP12 ADD MLOAD PUSH1 0x84 DUP8 ADD MSTORE SWAP6 DUP11 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP2 DUP10 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE PUSH1 0x80 DUP10 ADD MLOAD PUSH1 0xE4 DUP6 ADD MSTORE PUSH1 0xA0 DUP10 ADD MLOAD PUSH2 0x104 DUP6 ADD MSTORE PUSH1 0xC0 DUP10 ADD MLOAD PUSH2 0x124 DUP6 ADD MSTORE PUSH1 0xE0 DUP10 ADD MLOAD PUSH2 0x144 DUP6 ADD MSTORE PUSH2 0x100 DUP10 ADD MLOAD PUSH2 0x164 DUP6 ADD MSTORE PUSH2 0x120 DUP10 ADD MLOAD PUSH2 0x184 DUP6 ADD MSTORE PUSH2 0x140 DUP10 ADD DUP1 MLOAD PUSH2 0x1A4 DUP7 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP12 ADD MLOAD PUSH2 0x1C4 DUP8 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x1E4 DUP7 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP6 SWAP2 SWAP4 DUP5 SWAP4 SWAP3 PUSH1 0x24 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x204 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x95E JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x940 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP13 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x9A7 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x989 JUMP JUMPDEST POP POP POP DUP12 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP11 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP12 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x9EF JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x9D1 JUMP JUMPDEST POP PUSH1 0x80 DUP11 DUP12 DUP7 SUB DUP13 ADDRESS GAS DELEGATECALL DUP1 DUP1 ISZERO PUSH2 0xA0E JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0xA2C JUMPI PUSH2 0xA4F JUMP JUMPDEST PUSH1 0x0 DUP15 MSTORE PUSH1 0x0 PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP16 ADD MSTORE PUSH2 0xA4F JUMP JUMPDEST DUP12 MLOAD DUP15 MSTORE PUSH1 0x20 DUP13 ADD MLOAD PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x40 DUP13 ADD MLOAD PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x60 DUP13 ADD MLOAD PUSH1 0x60 DUP16 ADD MSTORE JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0xA97 JUMPI PUSH2 0xA8F DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA80 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1E26 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xA66 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x663 JUMPI PUSH2 0xAF7 DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAB8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAD0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAE8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xE8F JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xA9E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xB0D PUSH2 0x20A0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x17 DUP4 MSTORE PUSH32 0x494E56414C49445F4E45575F4D414B45525F45504F4348000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 SWAP5 POP PUSH1 0x1 DUP7 ADD SWAP4 POP SWAP1 SWAP2 POP DUP2 DUP4 GT PUSH2 0xB8D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP5 SWAP1 SSTORE MLOAD PUSH32 0x666A5047451D0C744E58819166260F8048FE2786E33B3C1115AF94887A451CA7 SWAP1 PUSH2 0xBD9 SWAP1 DUP6 SWAP1 PUSH2 0x429F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x663 JUMPI PUSH2 0xC43 DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC04 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC1C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC34 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x853 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xBEA JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP2 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xC7E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP1 PUSH2 0x4264 JUMP JUMPDEST PUSH1 0xFF DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x14 DUP4 MSTORE PUSH32 0x41535345545F50524F58595F4D49534D41544348000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND SWAP5 POP DUP6 AND DUP5 EQ PUSH2 0xCFA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP DUP5 SWAP2 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND ISZERO PUSH2 0xDFE JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD78 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xD9C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x3EFE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH32 0x41535345545F50524F58595F49445F4D49534D41544348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0xFF DUP1 DUP4 AND SWAP1 DUP9 AND EQ PUSH2 0xDFC JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP JUMPDEST PUSH1 0xFF DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP6 AND OR SWAP1 SSTORE MLOAD PUSH32 0x27EF5F484E50F2DAF7C2D82C60FE4CE409009541176EB64095BEAC369DB1D260 SWAP1 PUSH2 0xE6A SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x42AD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xE97 PUSH2 0x36C6 JUMP JUMPDEST PUSH2 0xEA2 DUP5 DUP5 DUP5 PUSH2 0x1994 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 PUSH1 0x20 ADD MLOAD EQ PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x14 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xF04 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF28 PUSH2 0x20A0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP7 SWAP1 SWAP4 AND DUP3 MSTORE SWAP5 SWAP1 SWAP5 MSTORE SWAP1 SWAP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xF8B PUSH2 0x36C6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0xF98 PUSH2 0x36C6 JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xFA7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x1050 JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xFD5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0xFF5 DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x272E JUMP JUMPDEST SWAP2 POP PUSH2 0x1021 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1008 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x64B JUMPI INVALID JUMPDEST DUP5 MLOAD PUSH1 0x1 ADD DUP6 MSTORE SWAP1 POP PUSH2 0x1034 DUP6 DUP3 PUSH2 0x2740 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x1045 JUMPI PUSH2 0x1050 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xFBD JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0xFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP9 MLOAD GT PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x1110 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH2 0x111A DUP9 PUSH2 0x27A2 JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x112F JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x113F JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1193 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x710 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x4253 JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x11A1 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1209 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x11FF JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x0 SWAP7 POP PUSH2 0x1877 JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1217 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x131F JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x1277 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1287 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x12A5 DUP9 PUSH1 0x1 PUSH2 0x2857 JUMP JUMPDEST SWAP4 POP PUSH2 0x12B2 DUP9 PUSH1 0x21 PUSH2 0x2857 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP11 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x12D7 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x41BE JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x12FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP12 DUP2 AND SWAP1 DUP3 AND EQ SWAP9 POP SWAP3 POP PUSH2 0x1877 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x132D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x14D9 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x138D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x139D JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x13BB DUP9 PUSH1 0x1 PUSH2 0x2857 JUMP JUMPDEST SWAP4 POP PUSH2 0x13C8 DUP9 PUSH1 0x21 PUSH2 0x2857 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1435 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1416 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP4 DUP5 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 SUB DUP2 MSTORE SWAP4 DUP3 ADD SWAP1 DUP2 SWAP1 MSTORE DUP4 MLOAD SWAP4 SWAP5 POP SWAP3 DUP4 SWAP3 POP SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1495 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1476 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x12D7 SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x41BE JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x14E7 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1559 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x1545 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND CALLER EQ SWAP7 POP PUSH2 0x1877 JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1567 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x160D JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP11 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x15B4 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x419E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x15CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x15E2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1606 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x3BEB JUMP JUMPDEST SWAP7 POP PUSH2 0x1877 JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x161B JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x16AE JUMPI PUSH2 0x162A DUP9 PUSH2 0x28EB JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1665 JUMPI PUSH1 0x0 SWAP7 POP PUSH2 0x1877 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x15B4 SWAP1 DUP14 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x4168 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x16BC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x16EF JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0x1877 JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x16FD JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x17E8 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x175D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x176D JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x178B DUP9 PUSH1 0x1 PUSH2 0x2857 JUMP JUMPDEST SWAP4 POP PUSH2 0x1798 DUP9 PUSH1 0x21 PUSH2 0x2857 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1B DUP1 DUP3 MSTORE PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A410000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE SWAP4 MLOAD SWAP5 SWAP8 POP PUSH1 0x1 SWAP5 SWAP3 SWAP4 DUP16 SWAP4 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH2 0x1435 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x17F6 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1829 JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0x1877 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x710 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x4253 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x188C PUSH2 0x36C6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x189B PUSH2 0x36C6 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18AA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1988 JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18D8 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x18F4 SWAP1 DUP10 SWAP1 PUSH2 0x272E JUMP JUMPDEST SWAP3 POP PUSH2 0x1937 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1907 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP11 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1923 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x298F JUMP JUMPDEST SWAP2 POP PUSH2 0x1963 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x194A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC34 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x196F DUP7 DUP3 PUSH2 0x2740 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x197D JUMPI PUSH2 0x1988 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x18C0 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x199C PUSH2 0x36C6 JUMP JUMPDEST PUSH2 0x19A4 PUSH2 0x36A6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x19B2 DUP9 PUSH2 0x1D4A JUMP JUMPDEST SWAP4 POP PUSH2 0x19BC PUSH2 0x20A0 JUMP JUMPDEST SWAP3 POP PUSH2 0x19D0 DUP9 PUSH1 0xA0 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x272E JUMP JUMPDEST SWAP2 POP PUSH2 0x19DC DUP8 DUP4 PUSH2 0x29AC JUMP JUMPDEST SWAP1 POP PUSH2 0x19EC DUP9 DUP6 DUP6 DUP11 DUP6 DUP12 PUSH2 0x2213 JUMP JUMPDEST PUSH2 0x19F6 DUP9 DUP3 PUSH2 0x29C4 JUMP JUMPDEST SWAP5 POP PUSH2 0x1A0D DUP9 DUP5 DUP7 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP10 PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x1050 DUP9 DUP5 DUP8 PUSH2 0x2A2E JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x1A7C JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP ADDRESS DUP7 DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1B2D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1B0E JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE DUP6 SWAP1 KECCAK256 SLOAD DUP4 DUP7 ADD SWAP1 SWAP6 MSTORE PUSH1 0xF DUP4 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP6 POP SWAP4 POP POP PUSH1 0xFF AND ISZERO SWAP1 POP PUSH2 0x1BBE JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND CALLER EQ PUSH2 0x1C8B JUMPI PUSH2 0x1C0A DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x10A8 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x1C61 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x8 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP3 POP ISZERO ISZERO SWAP1 POP PUSH2 0x1D23 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP POP PUSH1 0x8 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1D52 PUSH2 0x36A6 JUMP JUMPDEST PUSH2 0x1D5B DUP3 PUSH2 0x2B5A JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1D78 JUMPI PUSH1 0x1 JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH2 0x1E21 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1D8A JUMPI PUSH1 0x2 PUSH2 0x1D6E JUMP JUMPDEST PUSH2 0x100 DUP3 ADD MLOAD TIMESTAMP LT PUSH2 0x1D9D JUMPI PUSH1 0x4 PUSH2 0x1D6E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1DC1 JUMPI PUSH1 0x6 PUSH2 0x1D6E JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD GT ISZERO PUSH2 0x1DEE JUMPI PUSH1 0x6 PUSH2 0x1D6E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD GT PUSH2 0x1E1C JUMPI PUSH1 0x5 PUSH2 0x1D6E JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1E2E PUSH2 0x36A6 JUMP JUMPDEST PUSH2 0x1E37 DUP3 PUSH2 0x1D4A JUMP JUMPDEST SWAP1 POP PUSH2 0x1E43 DUP3 DUP3 PUSH2 0x32CE JUMP JUMPDEST PUSH2 0xA97 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x3417 JUMP JUMPDEST PUSH2 0x1E59 PUSH2 0x36C6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x1E66 PUSH2 0x36C6 JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1E75 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x1050 JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1EA3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x1EC3 DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x272E JUMP JUMPDEST SWAP2 POP PUSH2 0x1EEF DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1ED6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC34 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1EFB DUP6 DUP3 PUSH2 0x2740 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x1F0C JUMPI PUSH2 0x1050 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1E8B JUMP JUMPDEST PUSH2 0x1F1F PUSH2 0x36C6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1F2E PUSH2 0x36C6 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1F3D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1988 JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1F6B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x1F87 SWAP1 DUP10 SWAP1 PUSH2 0x272E JUMP JUMPDEST SWAP3 POP PUSH2 0x1F9A DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1907 JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0x1FC6 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1FAD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x64B JUMPI INVALID JUMPDEST DUP6 MLOAD PUSH1 0x1 ADD DUP7 MSTORE SWAP1 POP PUSH2 0x1FD9 DUP7 DUP3 PUSH2 0x2740 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x1FE7 JUMPI PUSH2 0x1988 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1F53 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x202E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP1 PUSH2 0x4264 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0x2066 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xB DUP2 MSTORE PUSH32 0x322E302E312D616C706861000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x20C7 JUMPI PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0x20C9 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x20E1 DUP3 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0xA0 ADD MLOAD PUSH2 0x3493 JUMP JUMPDEST PUSH2 0x20F3 DUP4 PUSH1 0x80 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x3493 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x18 DUP2 MSTORE PUSH32 0x4E454741544956455F5350524541445F52455155495245440000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP2 GT ISZERO PUSH2 0x214A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x2157 PUSH2 0x3677 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x216B DUP10 PUSH1 0xA0 ADD MLOAD DUP9 PUSH2 0x272E JUMP JUMPDEST SWAP4 POP PUSH2 0x217B DUP9 PUSH1 0xA0 ADD MLOAD DUP8 PUSH2 0x272E JUMP JUMPDEST SWAP3 POP PUSH2 0x218B DUP4 DUP10 PUSH1 0x80 ADD MLOAD PUSH2 0x3493 JUMP JUMPDEST PUSH2 0x2199 DUP6 DUP11 PUSH1 0xA0 ADD MLOAD PUSH2 0x3493 JUMP JUMPDEST GT PUSH2 0x21BB JUMPI DUP4 SWAP2 POP PUSH2 0x21B4 DUP9 PUSH1 0xA0 ADD MLOAD DUP10 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x298F JUMP JUMPDEST SWAP1 POP PUSH2 0x21D4 JUMP JUMPDEST DUP3 SWAP1 POP PUSH2 0x21D1 DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP4 PUSH2 0x298F JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH2 0x21DE DUP10 DUP4 PUSH2 0x29C4 JUMP JUMPDEST DUP6 MSTORE PUSH2 0x21EA DUP9 DUP3 PUSH2 0x29C4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP8 ADD DUP3 SWAP1 MSTORE DUP7 MLOAD MLOAD SWAP2 ADD MLOAD PUSH2 0x2202 SWAP2 SWAP1 PUSH2 0x272E JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MSTORE POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP5 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x2270 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54414B45525F414D4F554E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP4 ISZERO ISZERO PUSH2 0x22C8 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x2343 JUMPI PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2341 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x23CA JUMPI DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP7 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xD DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x494E56414C49445F54414B455200000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x23C8 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD ISZERO ISZERO PUSH2 0x2441 JUMPI PUSH2 0x23E8 DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP4 PUSH2 0x10A8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4F524445525F5349474E4154555245000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x243F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP JUMPDEST PUSH2 0x2454 DUP3 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x34B7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x524F554E44494E475F4552524F52000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x24AA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x24C1 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x350D JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE DUP7 DUP2 ADD MLOAD DUP8 MLOAD DUP5 MLOAD SWAP4 DUP6 ADD MLOAD DUP6 DUP5 ADD MLOAD PUSH1 0x60 DUP8 ADD MLOAD PUSH2 0x140 DUP13 ADD MLOAD PUSH2 0x160 DUP14 ADD MLOAD SWAP7 MLOAD DUP12 SWAP9 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP8 DUP9 AND SWAP9 SWAP8 SWAP1 SWAP7 AND SWAP7 PUSH32 0xDE19F18E1B56E6EADA7ED95CCA8398B602BE32F5864640537EE9A9A3532BB29D SWAP7 PUSH2 0x2543 SWAP7 DUP16 SWAP7 SWAP2 SWAP6 SWAP1 SWAP5 SWAP2 SWAP4 SWAP1 SWAP3 SWAP1 PUSH2 0x40E5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x2565 DUP8 PUSH2 0x140 ADD MLOAD PUSH2 0x27A2 JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV SWAP3 POP PUSH2 0x257C DUP7 PUSH2 0x140 ADD MLOAD PUSH2 0x27A2 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 SWAP5 DIV SWAP6 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x260B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x25E0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x260B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x25EE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2634 DUP8 PUSH2 0x140 ADD MLOAD DUP5 DUP10 PUSH1 0x0 ADD MLOAD DUP10 PUSH1 0x0 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x140 DUP7 ADD MLOAD DUP7 MLOAD DUP9 MLOAD DUP7 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x2652 SWAP4 SWAP3 DUP7 SWAP3 SWAP1 SWAP2 PUSH2 0x351C JUMP JUMPDEST PUSH2 0x266C DUP8 PUSH2 0x140 ADD MLOAD DUP5 DUP10 PUSH1 0x0 ADD MLOAD DUP9 DUP9 PUSH1 0x40 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x268A DUP2 PUSH1 0x1 DUP10 PUSH1 0x0 ADD MLOAD DUP11 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x26A8 DUP2 PUSH1 0x1 DUP9 PUSH1 0x0 ADD MLOAD DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP8 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x26FA JUMPI PUSH2 0x26F5 DUP2 PUSH1 0x1 DUP8 DUP11 PUSH1 0x40 ADD MLOAD PUSH2 0x26F0 DUP10 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP11 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x350D JUMP JUMPDEST PUSH2 0x351C JUMP JUMPDEST PUSH2 0x24AA JUMP JUMPDEST PUSH2 0x2714 DUP2 PUSH1 0x1 DUP8 DUP11 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x24AA DUP2 PUSH1 0x1 DUP8 DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x273A JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x274E SWAP2 SWAP1 PUSH2 0x350D JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2764 SWAP2 SWAP1 PUSH2 0x350D JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x277D SWAP2 SWAP1 PUSH2 0x350D JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2796 SWAP2 SWAP1 PUSH2 0x350D JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x2828 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP DUP2 MLOAD DUP3 SWAP1 PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x283B JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH1 0x0 NOT ADD SWAP1 SWAP3 MSTORE POP PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x28E1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x2973 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH2 0x2982 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x35C3 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x13 NOT ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29A4 PUSH2 0x299E DUP6 DUP5 PUSH2 0x3493 JUMP JUMPDEST DUP5 PUSH2 0x3660 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x29BB JUMPI DUP2 PUSH2 0x29BD JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x29CC PUSH2 0x36C6 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH2 0x29E8 SWAP2 DUP5 SWAP2 PUSH2 0x298F JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xA0 DUP5 ADD MLOAD PUSH1 0xC0 DUP6 ADD MLOAD PUSH2 0x2A04 SWAP3 SWAP2 SWAP1 PUSH2 0x298F JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xA0 DUP5 ADD MLOAD PUSH1 0xE0 DUP6 ADD MLOAD PUSH2 0x2A23 SWAP3 SWAP2 SWAP1 PUSH2 0x298F JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x2A41 DUP7 PUSH2 0x140 ADD MLOAD PUSH2 0x27A2 JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV SWAP3 POP PUSH2 0x2A58 DUP7 PUSH2 0x160 ADD MLOAD PUSH2 0x27A2 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 SWAP5 DIV SWAP6 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2AE7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2ABC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2AE7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2ACA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2B08 DUP7 PUSH2 0x140 ADD MLOAD DUP5 DUP9 PUSH1 0x0 ADD MLOAD DUP9 DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x2B22 DUP7 PUSH2 0x160 ADD MLOAD DUP4 DUP8 DUP10 PUSH1 0x0 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x2B3C DUP2 PUSH1 0x1 DUP9 PUSH1 0x0 ADD MLOAD DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x40 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x2B52 DUP2 PUSH1 0x1 DUP8 DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x446F6D61696E536570617261746F72286164647265737320636F6E7472616374 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x21 ADD SWAP1 POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2BF1 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2BD2 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 ADDRESS PUSH13 0x1000000000000000000000000 MUL DUP4 DUP4 ADD MSTORE DUP5 MLOAD PUSH1 0x14 DUP2 DUP6 SUB ADD DUP2 MSTORE PUSH1 0x34 SWAP1 SWAP4 ADD SWAP5 DUP6 SWAP1 MSTORE DUP3 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2C70 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2C51 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 DUP4 DUP4 ADD MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP5 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP5 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP5 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP5 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP5 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP5 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP5 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP5 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP5 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP5 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP5 ADD MSTORE PUSH32 0x62797465732074616B65724173736574446174612C0000000000000000000000 PUSH2 0x116 DUP5 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12B DUP5 ADD MSTORE DUP5 MLOAD DUP1 DUP5 SUB PUSH2 0x10C ADD DUP2 MSTORE PUSH2 0x12C SWAP1 SWAP4 ADD SWAP5 DUP6 SWAP1 MSTORE DUP3 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2EF3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2ED4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP11 PUSH1 0xC0 ADD MLOAD DUP12 PUSH1 0xE0 ADD MLOAD DUP13 PUSH2 0x100 ADD MLOAD DUP14 PUSH2 0x120 ADD MLOAD DUP15 PUSH2 0x140 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2F8C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2F6D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2FEF JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2FD0 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP16 PUSH2 0x160 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3054 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3035 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x30B7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3098 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP14 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP13 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP12 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP11 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP13 POP POP POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3213 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x31F4 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x0 NOT PUSH1 0x20 SWAP5 DUP6 SUB PUSH2 0x100 EXP ADD SWAP1 DUP2 AND SWAP1 NOT SWAP2 SWAP1 SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP5 SWAP1 SWAP3 ADD DUP5 SWAP1 SUB DUP5 KECCAK256 DUP5 DUP3 ADD SWAP10 SWAP1 SWAP10 MSTORE DUP4 DUP3 ADD SWAP8 SWAP1 SWAP8 MSTORE PUSH1 0x60 DUP4 ADD SWAP6 SWAP1 SWAP6 MSTORE POP PUSH1 0x80 DUP1 DUP3 ADD SWAP7 SWAP1 SWAP7 MSTORE DUP4 MLOAD DUP1 DUP3 SUB SWAP1 SWAP7 ADD DUP7 MSTORE PUSH1 0xA0 ADD SWAP3 DUP4 SWAP1 MSTORE POP POP DUP3 MLOAD SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x329C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x327D JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x332D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x33A8 JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x33A6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP JUMPDEST PUSH2 0x33B0 PUSH2 0x20A0 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F4D414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP2 AND EQ PUSH2 0x663 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0xB1AD640E9E79B6FDBC3C415DC2914AB54E753D2971F51EAB910F7AA317A3163A SWAP3 PUSH2 0x3487 SWAP3 SWAP1 SWAP2 SWAP1 PUSH2 0x4220 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MUL DUP4 ISZERO DUP1 PUSH2 0x34AF JUMPI POP DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x34AC JUMPI INVALID JUMPDEST DIV EQ JUMPDEST ISZERO ISZERO PUSH2 0x29BD JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x34C6 JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x34DB JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x3504 JUMP JUMPDEST PUSH2 0x34FA PUSH2 0x34EB DUP4 PUSH3 0xF4240 PUSH2 0x3493 JUMP JUMPDEST PUSH2 0x34F5 DUP9 DUP8 PUSH2 0x3493 JUMP JUMPDEST PUSH2 0x3660 JUMP JUMPDEST PUSH2 0x3E8 DUP2 GT SWAP4 POP SWAP1 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x29BD JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 DUP3 GT ISZERO PUSH2 0x2B52 JUMPI POP PUSH1 0xFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 MLOAD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 DUP2 SWAP1 PUSH4 0xA85E59E4 SWAP1 PUSH2 0x3589 SWAP1 DUP10 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x41F3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x35A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x35B7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x364D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP POP ADD PUSH1 0x14 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x366E JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x368C PUSH2 0x36C6 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3699 PUSH2 0x36C6 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29BD DUP3 CALLDATALOAD PUSH2 0x4349 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x370C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x371F PUSH2 0x371A DUP3 PUSH2 0x42FC JUMP JUMPDEST PUSH2 0x42D5 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x375D JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3747 DUP9 DUP3 PUSH2 0x38A1 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3731 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3778 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3786 PUSH2 0x371A DUP3 PUSH2 0x42FC JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x375D JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x37AE DUP9 DUP3 PUSH2 0x38F0 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3798 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x37D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x37E3 PUSH2 0x371A DUP3 PUSH2 0x42FC JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x3808 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x375D JUMPI DUP2 PUSH2 0x381E DUP9 DUP3 PUSH2 0x384C JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x380B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29BD DUP3 CALLDATALOAD PUSH2 0x4355 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29BD DUP3 MLOAD PUSH2 0x4355 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29BD DUP3 CALLDATALOAD PUSH2 0x435A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x386A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3882 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x389A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x38B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x38C0 PUSH2 0x371A DUP3 PUSH2 0x431D JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x38DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x38E7 DUP4 DUP3 DUP5 PUSH2 0x436E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3903 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x390E PUSH2 0x180 PUSH2 0x42D5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x391C DUP5 DUP5 PUSH2 0x36EF JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x392D DUP5 DUP5 DUP4 ADD PUSH2 0x36EF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x3941 DUP5 DUP3 DUP6 ADD PUSH2 0x36EF JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x3955 DUP5 DUP3 DUP6 ADD PUSH2 0x36EF JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x3969 DUP5 DUP3 DUP6 ADD PUSH2 0x384C JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x397D DUP5 DUP3 DUP6 ADD PUSH2 0x384C JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x3991 DUP5 DUP3 DUP6 ADD PUSH2 0x384C JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x39A5 DUP5 DUP3 DUP6 ADD PUSH2 0x384C JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x39BA DUP5 DUP3 DUP6 ADD PUSH2 0x384C JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x39D0 DUP5 DUP3 DUP6 ADD PUSH2 0x384C JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x39F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x39FE DUP5 DUP3 DUP6 ADD PUSH2 0x38A1 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3A20 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3A2C DUP5 DUP3 DUP6 ADD PUSH2 0x38A1 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29BD DUP3 CALLDATALOAD PUSH2 0x435D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29BD DUP3 MLOAD PUSH2 0x435D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x29A4 DUP5 DUP5 PUSH2 0x36EF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3A82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3A8E DUP6 DUP6 PUSH2 0x36EF JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3A9F DUP6 DUP3 DUP7 ADD PUSH2 0x36EF JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3ABC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3AC8 DUP6 DUP6 PUSH2 0x36EF JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3A9F DUP6 DUP3 DUP7 ADD PUSH2 0x3834 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3AEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B02 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x29A4 DUP5 DUP3 DUP6 ADD PUSH2 0x3767 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3B23 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B46 DUP7 DUP3 DUP8 ADD PUSH2 0x3767 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B6F DUP7 DUP3 DUP8 ADD PUSH2 0x37C4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B98 DUP7 DUP3 DUP8 ADD PUSH2 0x36FB JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3BB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3BCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3BDA DUP7 DUP3 DUP8 ADD PUSH2 0x3767 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3B6F DUP7 DUP3 DUP8 ADD PUSH2 0x384C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3BFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x29A4 DUP5 DUP5 PUSH2 0x3840 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3C1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x29A4 DUP5 DUP5 PUSH2 0x384C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3C3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3A8E DUP6 DUP6 PUSH2 0x384C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3C5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3C68 DUP8 DUP8 PUSH2 0x384C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x3C79 DUP8 DUP3 DUP9 ADD PUSH2 0x36EF JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3C96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3CA2 DUP8 DUP3 DUP9 ADD PUSH2 0x3858 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3CC3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3CCF DUP7 DUP7 PUSH2 0x384C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3CE0 DUP7 DUP3 DUP8 ADD PUSH2 0x36EF JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3CFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B98 DUP7 DUP3 DUP8 ADD PUSH2 0x38A1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3D1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x29A4 DUP5 DUP3 DUP6 ADD PUSH2 0x38F0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3D54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D6B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3D77 DUP8 DUP3 DUP9 ADD PUSH2 0x38F0 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D94 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DA0 DUP8 DUP3 DUP9 ADD PUSH2 0x38F0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3DBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DC9 DUP8 DUP3 DUP9 ADD PUSH2 0x38A1 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3DE6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DF2 DUP8 DUP3 DUP9 ADD PUSH2 0x38A1 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3E13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E36 DUP7 DUP3 DUP8 ADD PUSH2 0x38F0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3CE0 DUP7 DUP3 DUP8 ADD PUSH2 0x384C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x3E60 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3E6C DUP10 DUP10 PUSH2 0x384C JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x3E7D DUP10 DUP3 DUP11 ADD PUSH2 0x36EF JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EA6 DUP10 DUP3 DUP11 ADD PUSH2 0x3858 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3EC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3ED1 DUP10 DUP3 DUP11 ADD PUSH2 0x3858 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3EF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x29A4 DUP5 DUP5 PUSH2 0x3A39 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x29A4 DUP5 DUP5 PUSH2 0x3A45 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3F31 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3F3D DUP7 DUP7 PUSH2 0x3A39 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3F4E DUP7 DUP3 DUP8 ADD PUSH2 0x36EF JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x3B98 DUP7 DUP3 DUP8 ADD PUSH2 0x36EF JUMP JUMPDEST PUSH2 0x3F68 DUP2 PUSH2 0x4349 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3F68 DUP2 PUSH2 0x4355 JUMP JUMPDEST PUSH2 0x3F68 DUP2 PUSH2 0x435A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3F8B DUP3 PUSH2 0x4345 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x3F9F DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x437A JUMP JUMPDEST PUSH2 0x3FA8 DUP2 PUSH2 0x43A6 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x3F68 DUP2 PUSH2 0x4363 JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x4025 DUP5 DUP3 PUSH2 0x3F77 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4038 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x3F77 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x404B PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x3F77 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x663 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x3F77 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x120 DUP4 ADD SWAP1 PUSH2 0x4070 DUP5 DUP3 PUSH2 0x4014 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4083 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x4014 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x663 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0x3F77 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x40A8 DUP5 DUP3 PUSH2 0x40CE JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x40BB PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x3F77 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x663 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x3F68 DUP2 PUSH2 0x435D JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x3F5F JUMP JUMPDEST PUSH1 0xE0 DUP2 ADD PUSH2 0x40F3 DUP3 DUP11 PUSH2 0x3F5F JUMP JUMPDEST PUSH2 0x4100 PUSH1 0x20 DUP4 ADD DUP10 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x410D PUSH1 0x40 DUP4 ADD DUP9 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x411A PUSH1 0x60 DUP4 ADD DUP8 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x4127 PUSH1 0x80 DUP4 ADD DUP7 PUSH2 0x3F77 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xA0 DUP4 ADD MSTORE PUSH2 0x4139 DUP2 DUP6 PUSH2 0x3F80 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x414D DUP2 DUP5 PUSH2 0x3F80 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x3F6E JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4176 DUP3 DUP7 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x4183 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x3F5F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4195 DUP2 DUP5 PUSH2 0x3F80 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x41AC DUP3 DUP6 PUSH2 0x3F77 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x29A4 DUP2 DUP5 PUSH2 0x3F80 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x41CC DUP3 DUP8 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x41D9 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x40CE JUMP JUMPDEST PUSH2 0x41E6 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x4195 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x3F77 JUMP JUMPDEST PUSH1 0x80 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4204 DUP2 DUP8 PUSH2 0x3F80 JUMP JUMPDEST SWAP1 POP PUSH2 0x4213 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x3F5F JUMP JUMPDEST PUSH2 0x41E6 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x3F5F JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4231 DUP2 DUP6 PUSH2 0x3F80 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x29A4 DUP2 DUP5 PUSH2 0x3F80 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x3FB5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x29BD DUP2 DUP5 PUSH2 0x3F80 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x20C9 DUP2 PUSH2 0x3FBE JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x4014 JUMP JUMPDEST PUSH2 0x120 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x405E JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x4097 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x3F77 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x42BB DUP3 DUP7 PUSH2 0x40CE JUMP JUMPDEST PUSH2 0x42C8 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x3F5F JUMP JUMPDEST PUSH2 0x29A4 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x3F5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x42F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x20C9 DUP3 PUSH2 0x4349 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4395 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x437D JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x663 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xc 0xdc BYTE DUP14 0xf8 0xfc RETURN MOD DUP13 SHR 0x2c SWAP5 SWAP10 0xb0 0x49 0x48 PUSH22 0xA807CFDD1D5F3D94484C3A4496B04E6C657870657269 PUSH14 0x656E74616CF50037000000000000 ", "sourceMap": "894:607:2:-;;;1213:286;8:9:-1;5:2;;;30:1;27;20:12;5:2;1213:286:2;;;;;;;;;;;;;;;;;;;;;;;;363:5:30;:18;;-1:-1:-1;;;;;;363:18:30;371:10;363:18;;;1658:30:6;;1348:13:2;;1658:30:6;;:14;;:30;;;;;:::i;:::-;;1588:107;1213:286:2;894:607;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;894:607:2;;;-1:-1:-1;894:607:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;6:442:-1:-;;111:4;99:17;;95:27;-1:-1;85:2;;136:1;133;126:12;85:2;166:6;160:13;188:64;203:48;244:6;203:48;;;188:64;;;179:73;;272:6;265:5;258:21;308:4;300:6;296:17;341:4;334:5;330:16;376:3;367:6;362:3;358:16;355:25;352:2;;;393:1;390;383:12;352:2;403:39;435:6;430:3;425;403:39;;;78:370;;;;;;;;456:360;;580:2;568:9;559:7;555:23;551:32;548:2;;;596:1;593;586:12;548:2;631:24;;-1:-1;;;;;664:30;;661:2;;;707:1;704;697:12;661:2;727:73;792:7;783:6;772:9;768:22;727:73;;;717:83;542:274;-1:-1;;;;542:274;823:256;885:2;879:9;911:17;;;-1:-1;;;;;971:34;;1007:22;;;968:62;965:2;;;1043:1;1040;1033:12;965:2;1059;1052:22;863:216;;-1:-1;863:216;1086:258;;-1:-1;;;;;1221:6;1218:30;1215:2;;;1261:1;1258;1251:12;1215:2;-1:-1;1334:4;1305;1282:17;;;;-1:-1;;1278:33;1324:15;;1152:192;1352:268;1417:1;1424:101;1438:6;1435:1;1432:13;1424:101;;;1505:11;;;1499:18;1486:11;;;1479:39;1460:2;1453:10;1424:101;;;1540:6;1537:1;1534:13;1531:2;;;1605:1;1596:6;1591:3;1587:16;1580:27;1531:2;1401:219;;;;;;894:607:2;;;;;;" }, "deployedBytecode": { "linkReferences": {}, - "object": "0x60806040526004361061018a5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663288cdc91811461018f578063297bb70b146101c55780632ac12622146101e75780633683ef8e1461021457806338077164146102345780633c28d861146102615780633e228bae1461028e5780634ac14782146102bb5780634d0ae546146102db5780634f9559b1146102fb57806350dde1901461031b5780635c78d0c71461033b578063642f2eaf1461035b57806364a3bc151461037b5780636f3627f81461039b57806377fcce68146103bb5780637b8e3514146103db5780637e1d9808146103fb57806382c174d01461041b5780638da5cb5b1461043b57806392c1421e1461045d578063a3e203801461047d578063b4be83d51461049d578063bfc8bfce146104bd578063c75e0a81146104dd578063d46b02c31461050a578063dd1c7d181461052a578063e5fa431b1461054a578063eea086ba1461056a578063f2fde38b1461057f578063ffa1ad741461059f575b600080fd5b34801561019b57600080fd5b506101af6101aa366004613bde565b6105c1565b6040516101bc9190614242565b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004613ae3565b6105d3565b005b3480156101f357600080fd5b50610207610202366004613bde565b61063e565b6040516101bc91906140fd565b34801561022057600080fd5b506101e561022f366004613c1b565b610653565b34801561024057600080fd5b5061025461024f366004613e83565b610721565b6040516101bc91906141e8565b34801561026d57600080fd5b5061028161027c366004613cb8565b61073c565b6040516101bc9190614225565b34801561029a57600080fd5b506102ae6102a9366004613d78565b610828565b6040516101bc9190614217565b3480156102c757600080fd5b506101e56102d6366004613aae565b610a38565b3480156102e757600080fd5b506101e56102f6366004613ae3565b610a70565b34801561030757600080fd5b506101e5610316366004613bde565b610ad5565b34801561032757600080fd5b506101e5610336366004613ae3565b610bbc565b34801561034757600080fd5b506101e5610356366004613ebf565b610c21565b34801561036757600080fd5b50610207610376366004613bde565b610e4f565b34801561038757600080fd5b506102ae610396366004613d78565b610e64565b3480156103a757600080fd5b506101af6103b6366004613a26565b610ee1565b3480156103c757600080fd5b506101e56103d6366004613a7e565b610ef3565b3480156103e757600080fd5b506102076103f6366004613a44565b610f38565b34801561040757600080fd5b506102ae610416366004613b77565b610f58565b34801561042757600080fd5b50610207610436366004613bfc565b611030565b34801561044757600080fd5b50610450611050565b6040516101bc919061407a565b34801561046957600080fd5b50610450610478366004613e83565b61105f565b34801561048957600080fd5b506102ae610498366004613b77565b61107d565b3480156104a957600080fd5b506102ae6104b8366004613d78565b61118d565b3480156104c957600080fd5b506101e56104d8366004613dea565b611211565b3480156104e957600080fd5b506104fd6104f8366004613c83565b611543565b6040516101bc9190614234565b34801561051657600080fd5b506101e5610525366004613c83565b61161f565b34801561053657600080fd5b506102ae610545366004613b77565b61164a565b34801561055657600080fd5b506102ae610565366004613b77565b611710565b34801561057657600080fd5b506104506117eb565b34801561058b57600080fd5b506101e561059a366004613a26565b6117fa565b3480156105ab57600080fd5b506105b4611862565b6040516101bc91906141f6565b60016020526000908152604090205481565b60005b83518110156106385761062f84828151811015156105f057fe5b90602001906020020151848381518110151561060857fe5b90602001906020020151848481518110151561062057fe5b9060200190602002015161118d565b506001016105d6565b50505050565b60026020526000908152604090205460ff1681565b61068e848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750611899945050505050565b60408051808201909152601181527f494e56414c49445f5349474e415455524500000000000000000000000000000060208201529015156106ee5760405160e560020a62461bcd0281526004016106e591906141f6565b60405180910390fd5b5050506000918252600560209081526040808420600160a060020a0390931684529190529020805460ff19166001179055565b600960205260009081526040902054600160a060020a031681565b61074461364c565b61074c61367b565b61075461367b565b610160808801516101408089019190915288015190870152600061077788611543565b925061078287611543565b915061078c612075565b905061079888886120a4565b6107ac888885604001518560400151612124565b8051602001519094506107c690899085908490808b6121e8565b60208085015101516107df90889084908490808a6121e8565b6107f88882856020015186604001518860000151612488565b6108118782846020015185604001518860200151612488565b61081d88888387612527565b505050949350505050565b61083061369b565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000008082526060600483018181528851606485019081526020808b01516084870152958a015160a48601529189015160c4850152608089015160e485015260a089015161010485015260c089015161012485015260e0890151610144850152610100890151610164850152610120890151610184850152610140890180516101a486019081526101608b01516101c487015261018090525180516101e48601819052939591938493926024870192849261020489019291820191601f82010460005b81811015610933578351855260209485019490930192600101610915565b50505050818103610160808401919091528c0151805180835260209283019291820191601f82010460005b8181101561097c57835185526020948501949093019260010161095e565b5050508b84525084810360209384019081528a518083529093918201918b81019190601f82010460005b818110156109c45783518552602094850194909301926001016109a6565b5060808a8b86038c305af48080156109e35760018114610a0157610a24565b60008e52600060208f0152600060408f0152600060608f0152610a24565b8b518e5260208c015160208f015260408c015160408f015260608c015160608f01525b505050505050505050505050509392505050565b60005b8151811015610a6c57610a648282815181101515610a5557fe5b9060200190602002015161161f565b600101610a3b565b5050565b60005b835181101561063857610acc8482815181101515610a8d57fe5b906020019060200201518483815181101515610aa557fe5b906020019060200201518484815181101515610abd57fe5b90602001906020020151610e64565b50600101610a73565b6000806000610ae2612075565b600160a060020a038116600090815260036020908152604091829020548251808401909352601783527f494e56414c49445f4e45575f4d414b45525f45504f434800000000000000000091830191909152919450600186019350909150818311610b625760405160e560020a62461bcd0281526004016106e591906141f6565b50600160a060020a03831660008181526003602052604090819020849055517f666a5047451d0c744e58819166260f8048fe2786e33b3c1115af94887a451ca790610bae908590614242565b60405180910390a250505050565b60005b835181101561063857610c188482815181101515610bd957fe5b906020019060200201518483815181101515610bf157fe5b906020019060200201518484815181101515610c0957fe5b90602001906020020151610828565b50600101610bbf565b6000805481908190600160a060020a03163314610c535760405160e560020a62461bcd0281526004016106e590614207565b60ff8616600090815260096020908152604091829020548251808401909352601483527f41535345545f50524f58595f4d49534d4154434800000000000000000000000091830191909152600160a060020a03908116945085168414610ccf5760405160e560020a62461bcd0281526004016106e591906141f6565b50849150600160a060020a03821615610dd35781600160a060020a031663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610d3957600080fd5b505af1158015610d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d719190810190613ea1565b60408051808201909152601781527f41535345545f50524f58595f49445f4d49534d41544348000000000000000000602082015290915060ff80831690881614610dd15760405160e560020a62461bcd0281526004016106e591906141f6565b505b60ff861660009081526009602052604090819020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038516179055517f27ef5f484e50f2daf7c2d82c60fe4ce409009541176eb64095beac369db1d26090610e3f90889088908890614250565b60405180910390a1505050505050565b60076020526000908152604090205460ff1681565b610e6c61369b565b610e7784848461118d565b9050828160200151146040805190810160405280601481526020017f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000815250901515610ed95760405160e560020a62461bcd0281526004016106e591906141f6565b509392505050565b60036020526000908152604090205481565b6000610efd612075565b600160a060020a03908116600090815260066020908152604080832096909316825294909452909220805460ff191691151591909117905550565b600660209081526000928352604080842090915290825290205460ff1681565b610f6061369b565b6060600080610f6d61369b565b876000815181101515610f7c57fe5b9060200190602002015161016001519350600092505b875183101561102557838884815181101515610faa57fe5b906020019060200201516101600181905250610fca878660200151612703565b9150610ff68884815181101515610fdd57fe5b9060200190602002015183888681518110151561062057fe5b8451600101855290506110098582612715565b868560200151141561101a57611025565b600190920191610f92565b505050509392505050565b600560209081526000928352604080842090915290825290205460ff1681565b600054600160a060020a031681565b60ff16600090815260096020526040902054600160a060020a031690565b61108561369b565b6060600080600061109461369b565b8860008151811015156110a357fe5b9060200190602002015161014001519450600093505b8851841015611181578489858151811015156110d157fe5b60209081029091010151610140015285516110ed908990612703565b9250611130898581518110151561110057fe5b9060200190602002015160a001518a8681518110151561111c57fe5b906020019060200201516080015185612777565b915061115c898581518110151561114357fe5b90602001906020020151838987815181101515610c0957fe5b90506111688682612715565b855188141561117657611181565b6001909301926110b9565b50505050509392505050565b61119561369b565b61119d61367b565b60008060006111ab88611543565b93506111b5612075565b92506111c98860a001518560400151612703565b91506111d58783612794565b90506111e58885858a858b6121e8565b6111ef88826127ac565b945061120688848660200151876040015189612488565b611025888487612816565b60085460408051808201909152601281527f5245454e5452414e43595f494c4c4547414c00000000000000000000000000006020820152600091600160a060020a0316156112755760405160e560020a62461bcd0281526004016106e591906141f6565b5030868887876040516020018086600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018481526020018383808284378201915050955050505050506040516020818303038152906040526040518082805190602001908083835b602083106113265780518252601f199092019160209182019101611307565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008181526007835285902054838601909552600f83527f494e56414c49445f54585f48415348000000000000000000000000000000000091830191909152955093505060ff161590506113b75760405160e560020a62461bcd0281526004016106e591906141f6565b50600160a060020a038616331461148457611403818785858080601f01602080910402602001604051908101604052809392919081815260200183838082843750611899945050505050565b60408051808201909152601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015290151561145a5760405160e560020a62461bcd0281526004016106e591906141f6565b506008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161790555b60008181526007602052604090819020805460ff191660011790555130908690869080838380828437820191505092505050600060405180830381855af460408051808201909152601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015292501515905061151c5760405160e560020a62461bcd0281526004016106e591906141f6565b50506008805473ffffffffffffffffffffffffffffffffffffffff19169055505050505050565b61154b61367b565b61155482612942565b6020820152608082015115156115715760015b60ff16815261161a565b60a08201511515611583576002611567565b6101008201514210611596576004611567565b60208082015160009081526002909152604090205460ff16156115ba576006611567565b6101208201518251600160a060020a031660009081526003602052604090205411156115e7576006611567565b602080820151600090815260019091526040908190205490820181905260a083015111611615576005611567565b600381525b919050565b61162761367b565b61163082611543565b905061163c82826130b6565b610a6c8282602001516131ff565b61165261369b565b606060008061165f61369b565b87600081518110151561166e57fe5b9060200190602002015161016001519350600092505b87518310156110255783888481518110151561169c57fe5b9060200190602002015161016001819052506116bc878660200151612703565b91506116e888848151811015156116cf57fe5b90602001906020020151838886815181101515610c0957fe5b90506116f48582612715565b868560200151141561170557611025565b600190920191611684565b61171861369b565b6060600080600061172761369b565b88600081518110151561173657fe5b9060200190602002015161014001519450600093505b88518410156111815784898581518110151561176457fe5b6020908102909101015161014001528551611780908990612703565b9250611793898581518110151561110057fe5b91506117bf89858151811015156117a657fe5b9060200190602002015183898781518110151561062057fe5b8551600101865290506117d28682612715565b85518814156117e057611181565b60019093019261174c565b600854600160a060020a031681565b600054600160a060020a031633146118275760405160e560020a62461bcd0281526004016106e590614207565b600160a060020a0381161561185f576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60408051808201909152600b81527f322e302e312d616c706861000000000000000000000000000000000000000000602082015281565b6000806000806000806000808851116040805190810160405280601e81526020017f4c454e4754485f475245415445525f5448414e5f305f524551554952454400008152509015156119015760405160e560020a62461bcd0281526004016106e591906141f6565b5061190b8861327b565b60f860020a900460ff16600881111561192057fe5b9550600086600881111561193057fe5b141561198457604080518082018252601181527f5349474e41545552455f494c4c4547414c0000000000000000000000000000006020820152905160e560020a62461bcd0281526106e591906004016141f6565b600186600881111561199257fe5b14156119fa57875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156119f05760405160e560020a62461bcd0281526004016106e591906141f6565b5060009650612068565b6002866008811115611a0857fe5b1415611b1057875160408051808201909152601281527f4c454e4754485f36365f52455155495245440000000000000000000000000000602082015290604114611a685760405160e560020a62461bcd0281526004016106e591906141f6565b50876000815181101515611a7857fe5b016020015160f860020a908190048102049450611a96886001613330565b9350611aa3886021613330565b925060018a86868660405160008152602001604052604051611ac89493929190614161565b60206040516020810390808403906000865af1158015611aec573d6000803e3d6000fd5b5050604051601f190151600160a060020a038b811690821614985092506120689050565b6003866008811115611b1e57fe5b1415611cca57875160408051808201909152601281527f4c454e4754485f36365f52455155495245440000000000000000000000000000602082015290604114611b7e5760405160e560020a62461bcd0281526004016106e591906141f6565b50876000815181101515611b8e57fe5b016020015160f860020a908190048102049450611bac886001613330565b9350611bb9886021613330565b925060016040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152508b6040516020018083805190602001908083835b60208310611c265780518252601f199092019160209182019101611c07565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b60208310611c865780518252601f199092019160209182019101611c67565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008352910192839052611ac89450925089918991508890614161565b6004866008811115611cd857fe5b1415611d4a57875160408051808201909152601181527f4c454e4754485f315f524551554952454400000000000000000000000000000060208201529015611d365760405160e560020a62461bcd0281526004016106e591906141f6565b50600160a060020a03891633149650612068565b6005866008811115611d5857fe5b1415611dfe576040517f1626ba7e000000000000000000000000000000000000000000000000000000008152600160a060020a038a1690631626ba7e90611da5908d908c90600401614141565b602060405180830381600087803b158015611dbf57600080fd5b505af1158015611dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611df79190810190613bc0565b9650612068565b6006866008811115611e0c57fe5b1415611e9f57611e1b886133c4565b600160a060020a03808b1660009081526006602090815260408083209385168352929052205490915060ff161515611e565760009650612068565b6040517f93634702000000000000000000000000000000000000000000000000000000008152600160a060020a03821690639363470290611da5908d908d908d9060040161410b565b6007866008811115611ead57fe5b1415611ee05760008a8152600560209081526040808320600160a060020a038d16845290915290205460ff169650612068565b6008866008811115611eee57fe5b1415611fd957875160408051808201909152601281527f4c454e4754485f36365f52455155495245440000000000000000000000000000602082015290604114611f4e5760405160e560020a62461bcd0281526004016106e591906141f6565b50876000815181101515611f5e57fe5b016020015160f860020a908190048102049450611f7c886001613330565b9350611f89886021613330565b604080518082018252601b8082527f19457468657265756d205369676e6564204d6573736167653a0a4100000000006020808401918252935194975060019492938f930191829190808383611c26565b6007866008811115611fe757fe5b141561201a5760008a8152600560209081526040808320600160a060020a038d16845290915290205460ff169650612068565b604080518082018252601581527f5349474e41545552455f554e535550504f5254454400000000000000000000006020820152905160e560020a62461bcd0281526106e591906004016141f6565b5050505050509392505050565b6008546000908190600160a060020a03161561209c57600854600160a060020a031661209e565b335b92915050565b6120b68260a001518260a00151613468565b6120c883608001518360800151613468565b60408051808201909152601881527f4e454741544956455f5350524541445f52455155495245440000000000000000602082015291111561211f5760405160e560020a62461bcd0281526004016106e591906141f6565b505050565b61212c61364c565b6000806000806121408960a0015188612703565b93506121508860a0015187612703565b9250612160838960800151613468565b61216e858a60a00151613468565b11612190578391506121898860a00151896080015184612777565b90506121a9565b8290506121a688608001518960a0015183612777565b91505b6121b389836127ac565b85526121bf88826127ac565b60208087018290528651519101516121d79190612703565b604086015250505050949350505050565b845160408051808201909152601081527f4f524445525f554e46494c4c41424c450000000000000000000000000000000060208201529060ff166003146122455760405160e560020a62461bcd0281526004016106e591906141f6565b5060408051808201909152601481527f494e56414c49445f54414b45525f414d4f554e54000000000000000000000000602082015283151561229d5760405160e560020a62461bcd0281526004016106e591906141f6565b506060860151600160a060020a03161561231857606086015160408051808201909152600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015290600160a060020a031633146123165760405160e560020a62461bcd0281526004016106e591906141f6565b505b6020860151600160a060020a03161561239f5783600160a060020a03168660200151600160a060020a0316146040805190810160405280600d81526020017f494e56414c49445f54414b45520000000000000000000000000000000000000081525090151561239d5760405160e560020a62461bcd0281526004016106e591906141f6565b505b60408501511515612416576123bd8560200151876000015183611899565b60408051808201909152601781527f494e56414c49445f4f524445525f5349474e415455524500000000000000000060208201529015156124145760405160e560020a62461bcd0281526004016106e591906141f6565b505b612429828760a00151886080015161348c565b60408051808201909152600e81527f524f554e44494e475f4552524f520000000000000000000000000000000000006020820152901561247f5760405160e560020a62461bcd0281526004016106e591906141f6565b50505050505050565b6124968282602001516134e2565b600084815260016020908152604091829020929092558681015187518451938501518584015160608701516101408c01516101608d015196518b98600160a060020a039788169897909616967fde19f18e1b56e6eada7ed95cca8398b602be32f5864640537ee9a9a3532bb29d96612518968f96919590949193909290614088565b60405180910390a45050505050565b600080606061253a87610140015161327b565b60f860020a9004925061255186610140015161327b565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260f860020a90940495508301828280156125e05780601f106125b5576101008083540402835291602001916125e0565b820191906000526020600020905b8154815290600101906020018083116125c357829003601f168201915b5050505050905061260987610140015184896000015189600001518860200151602001516134f1565b610140860151865188518651602001516126279392869290916134f1565b6126418761014001518489600001518888604001516134f1565b61265f81600189600001518a604001518860000151604001516134f1565b61267d816001886000015189604001518860200151604001516134f1565b8560400151600160a060020a03168760400151600160a060020a031614156126cf576126ca816001878a604001516126c58960000151606001518a60200151606001516134e2565b6134f1565b61247f565b6126e9816001878a604001518860000151606001516134f1565b61247f8160018789604001518860200151606001516134f1565b60008282111561270f57fe5b50900390565b8151815161272391906134e2565b82526020808301519082015161273991906134e2565b60208301526040808301519082015161275291906134e2565b60408301526060808301519082015161276b91906134e2565b60609092019190915250565b600061278c6127868584613468565b84613598565b949350505050565b60008183106127a357816127a5565b825b9392505050565b6127b461369b565b6020810182905260a083015160808401516127d0918491612777565b8152602081015160a084015160c08501516127ec929190612777565b6040820152602081015160a084015160e085015161280b929190612777565b606082015292915050565b600080606061282986610140015161327b565b60f860020a9004925061284086610160015161327b565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260f860020a90940495508301828280156128cf5780601f106128a4576101008083540402835291602001916128cf565b820191906000526020600020905b8154815290600101906020018083116128b257829003601f168201915b505050505090506128f08661014001518488600001518888600001516134f1565b61290a8661016001518387896000015188602001516134f1565b6129248160018860000151896040015188604001516134f1565b61293a81600187896040015188606001516134f1565b505050505050565b600060405160200180807f446f6d61696e536570617261746f72286164647265737320636f6e747261637481526020017f290000000000000000000000000000000000000000000000000000000000000081525060210190506040516020818303038152906040526040518082805190602001908083835b602083106129d95780518252601f1990920191602091820191016129ba565b51815160209384036101000a600019018019909216911617905260408051929094018290038220306c0100000000000000000000000002838301528451601481850301815260349093019485905282519096509194508392508401908083835b60208310612a585780518252601f199092019160209182019101612a39565b51815160209384036101000a6000190180199092169116179052604080519290940182900382207f4f72646572280000000000000000000000000000000000000000000000000000838301527f61646472657373206d616b6572416464726573732c000000000000000000000060268401527f616464726573732074616b6572416464726573732c0000000000000000000000603b8401527f6164647265737320666565526563697069656e74416464726573732c0000000060508401527f616464726573732073656e646572416464726573732c00000000000000000000606c8401527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828401527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8401527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48401527f75696e743235362074616b65724665652c00000000000000000000000000000060c58401527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68401527f75696e743235362073616c742c0000000000000000000000000000000000000060f48401527f6279746573206d616b65724173736574446174612c00000000000000000000006101018401527f62797465732074616b65724173736574446174612c00000000000000000000006101168401527f290000000000000000000000000000000000000000000000000000000000000061012b840152845180840361010c01815261012c9093019485905282519096509194508392508401908083835b60208310612cdb5780518252601f199092019160209182019101612cbc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020846000015185602001518660400151876060015188608001518960a001518a60c001518b60e001518c61010001518d61012001518e61014001516040516020018082805190602001908083835b60208310612d745780518252601f199092019160209182019101612d55565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310612dd75780518252601f199092019160209182019101612db8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208f61016001516040516020018082805190602001908083835b60208310612e3c5780518252601f199092019160209182019101612e1d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310612e9f5780518252601f199092019160209182019101612e80565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020604051602001808d600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018c600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018b600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018a600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401898152602001888152602001878152602001868152602001858152602001848152602001836000191660001916815260200182600019166000191681526020019c505050505050505050505050506040516020818303038152906040526040518082805190602001908083835b60208310612ffb5780518252601f199092019160209182019101612fdc565b51815160001960209485036101000a019081169019919091161790526040805194909201849003842084820199909952838201979097526060830195909552506080808201969096528351808203909601865260a001928390525050825190918291908401908083835b602083106130845780518252601f199092019160209182019101613065565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b805160408051808201909152601081527f4f524445525f554e46494c4c41424c4500000000000000000000000000000000602082015260009160ff166003146131155760405160e560020a62461bcd0281526004016106e591906141f6565b506060830151600160a060020a03161561319057606083015160408051808201909152600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015290600160a060020a0316331461318e5760405160e560020a62461bcd0281526004016106e591906141f6565b505b613198612075565b835160408051808201909152600d81527f494e56414c49445f4d414b4552000000000000000000000000000000000000006020820152919250600160a060020a038084169116146106385760405160e560020a62461bcd0281526004016106e591906141f6565b60008181526002602052604090819020805460ff1916600117905582810151835161014085015161016086015193518594600160a060020a039485169493909316927fb1ad640e9e79b6fdbc3c415dc2914ab54e753d2971f51eab910f7aa317a3163a9261326f929091906141c3565b60405180910390a45050565b600080825111606060405190810160405280602181526020017f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524581526020017f44000000000000000000000000000000000000000000000000000000000000008152509015156133015760405160e560020a62461bcd0281526004016106e591906141f6565b5081518290600019810190811061331457fe5b01602001518251600019019092525060f860020a908190040290565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f51554952454400000000000000000000000000000000000000000000000000008152509015156133ba5760405160e560020a62461bcd0281526004016106e591906141f6565b5050016020015190565b6000601482511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f515549524544000000000000000000000000000000000000000000000000000081525090151561344c5760405160e560020a62461bcd0281526004016106e591906141f6565b5061345b8260148451036135af565b8251601319019092525090565b6000828202831580613484575082848281151561348157fe5b04145b15156127a557fe5b60008060008480151561349b57fe5b86850991508115156134b057600092506134d9565b6134cf6134c083620f4240613468565b6134ca8887613468565b613598565b6103e88111935090505b50509392505050565b6000828201838110156127a557fe5b60008082111561293a575060ff8416600090815260096020526040908190205490517fa85e59e4000000000000000000000000000000000000000000000000000000008152600160a060020a0390911690819063a85e59e49061355e908990889088908890600401614196565b600060405180830381600087803b15801561357857600080fd5b505af115801561358c573d6000803e3d6000fd5b50505050505050505050565b60008082848115156135a657fe5b04949350505050565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f51554952454400000000000000000000000000000000000000000000000000008152509015156136395760405160e560020a62461bcd0281526004016106e591906141f6565b50500160140151600160a060020a031690565b6101206040519081016040528061366161369b565b815260200161366e61369b565b8152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b60006127a582356142ec565b6000601f820183136136e157600080fd5b81356136f46136ef8261429f565b614278565b81815260209384019390925082018360005b83811015613732578135860161371c8882613876565b8452506020928301929190910190600101613706565b5050505092915050565b6000601f8201831361374d57600080fd5b813561375b6136ef8261429f565b81815260209384019390925082018360005b83811015613732578135860161378388826138c5565b845250602092830192919091019060010161376d565b6000601f820183136137aa57600080fd5b81356137b86136ef8261429f565b915081818352602084019350602081019050838560208402820111156137dd57600080fd5b60005b8381101561373257816137f38882613821565b84525060209283019291909101906001016137e0565b60006127a582356142f8565b60006127a582516142f8565b60006127a582356142fd565b600080601f8301841361383f57600080fd5b50813567ffffffffffffffff81111561385757600080fd5b60208301915083600182028301111561386f57600080fd5b9250929050565b6000601f8201831361388757600080fd5b81356138956136ef826142c0565b915080825260208301602083018583830111156138b157600080fd5b6138bc838284614311565b50505092915050565b600061018082840312156138d857600080fd5b6138e3610180614278565b905060006138f184846136c4565b8252506020613902848483016136c4565b6020830152506040613916848285016136c4565b604083015250606061392a848285016136c4565b606083015250608061393e84828501613821565b60808301525060a061395284828501613821565b60a08301525060c061396684828501613821565b60c08301525060e061397a84828501613821565b60e08301525061010061398f84828501613821565b610100830152506101206139a584828501613821565b6101208301525061014082013567ffffffffffffffff8111156139c757600080fd5b6139d384828501613876565b6101408301525061016082013567ffffffffffffffff8111156139f557600080fd5b613a0184828501613876565b6101608301525092915050565b60006127a58235614300565b60006127a58251614300565b600060208284031215613a3857600080fd5b600061278c84846136c4565b60008060408385031215613a5757600080fd5b6000613a6385856136c4565b9250506020613a74858286016136c4565b9150509250929050565b60008060408385031215613a9157600080fd5b6000613a9d85856136c4565b9250506020613a7485828601613809565b600060208284031215613ac057600080fd5b813567ffffffffffffffff811115613ad757600080fd5b61278c8482850161373c565b600080600060608486031215613af857600080fd5b833567ffffffffffffffff811115613b0f57600080fd5b613b1b8682870161373c565b935050602084013567ffffffffffffffff811115613b3857600080fd5b613b4486828701613799565b925050604084013567ffffffffffffffff811115613b6157600080fd5b613b6d868287016136d0565b9150509250925092565b600080600060608486031215613b8c57600080fd5b833567ffffffffffffffff811115613ba357600080fd5b613baf8682870161373c565b9350506020613b4486828701613821565b600060208284031215613bd257600080fd5b600061278c8484613815565b600060208284031215613bf057600080fd5b600061278c8484613821565b60008060408385031215613c0f57600080fd5b6000613a638585613821565b60008060008060608587031215613c3157600080fd5b6000613c3d8787613821565b9450506020613c4e878288016136c4565b935050604085013567ffffffffffffffff811115613c6b57600080fd5b613c778782880161382d565b95989497509550505050565b600060208284031215613c9557600080fd5b813567ffffffffffffffff811115613cac57600080fd5b61278c848285016138c5565b60008060008060808587031215613cce57600080fd5b843567ffffffffffffffff811115613ce557600080fd5b613cf1878288016138c5565b945050602085013567ffffffffffffffff811115613d0e57600080fd5b613d1a878288016138c5565b935050604085013567ffffffffffffffff811115613d3757600080fd5b613d4387828801613876565b925050606085013567ffffffffffffffff811115613d6057600080fd5b613d6c87828801613876565b91505092959194509250565b600080600060608486031215613d8d57600080fd5b833567ffffffffffffffff811115613da457600080fd5b613db0868287016138c5565b9350506020613dc186828701613821565b925050604084013567ffffffffffffffff811115613dde57600080fd5b613b6d86828701613876565b60008060008060008060808789031215613e0357600080fd5b6000613e0f8989613821565b9650506020613e2089828a016136c4565b955050604087013567ffffffffffffffff811115613e3d57600080fd5b613e4989828a0161382d565b9450945050606087013567ffffffffffffffff811115613e6857600080fd5b613e7489828a0161382d565b92509250509295509295509295565b600060208284031215613e9557600080fd5b600061278c8484613a0e565b600060208284031215613eb357600080fd5b600061278c8484613a1a565b600080600060608486031215613ed457600080fd5b6000613ee08686613a0e565b9350506020613ef1868287016136c4565b9250506040613b6d868287016136c4565b613f0b816142ec565b82525050565b613f0b816142f8565b613f0b816142fd565b6000613f2e826142e8565b808452613f4281602086016020860161431d565b613f4b81614349565b9093016020019392505050565b613f0b81614306565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b80516080830190613fc88482613f1a565b506020820151613fdb6020850182613f1a565b506040820151613fee6040850182613f1a565b5060608201516106386060850182613f1a565b80516101208301906140138482613fb7565b5060208201516140266080850182613fb7565b506040820151610638610100850182613f1a565b8051606083019061404b8482614071565b50602082015161405e6020850182613f1a565b5060408201516106386040850182613f1a565b613f0b81614300565b6020810161209e8284613f02565b60e08101614096828a613f02565b6140a36020830189613f1a565b6140b06040830188613f1a565b6140bd6060830187613f1a565b6140ca6080830186613f1a565b81810360a08301526140dc8185613f23565b905081810360c08301526140f08184613f23565b9998505050505050505050565b6020810161209e8284613f11565b606081016141198286613f1a565b6141266020830185613f02565b81810360408301526141388184613f23565b95945050505050565b6040810161414f8285613f1a565b818103602083015261278c8184613f23565b6080810161416f8287613f1a565b61417c6020830186614071565b6141896040830185613f1a565b6141386060830184613f1a565b608080825281016141a78187613f23565b90506141b66020830186613f02565b6141896040830185613f02565b604080825281016141d48185613f23565b9050818103602083015261278c8184613f23565b6020810161209e8284613f58565b602080825281016127a58184613f23565b6020808252810161209e81613f61565b6080810161209e8284613fb7565b610120810161209e8284614001565b6060810161209e828461403a565b6020810161209e8284613f1a565b6060810161425e8286614071565b61426b6020830185613f02565b61278c6040830184613f02565b60405181810167ffffffffffffffff8111828210171561429757600080fd5b604052919050565b600067ffffffffffffffff8211156142b657600080fd5b5060209081020190565b600067ffffffffffffffff8211156142d757600080fd5b506020601f91909101601f19160190565b5190565b600160a060020a031690565b151590565b90565b60ff1690565b600061209e826142ec565b82818337506000910152565b60005b83811015614338578181015183820152602001614320565b838111156106385750506000910152565b601f01601f1916905600a265627a7a72305820bfabe09dfd0658769e182630c7628d39dcd8d912f30804a9f51e90300f9e47726c6578706572696d656e74616cf50037", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x18A JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x288CDC91 DUP2 EQ PUSH2 0x18F JUMPI DUP1 PUSH4 0x297BB70B EQ PUSH2 0x1C5 JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x1E7 JUMPI DUP1 PUSH4 0x3683EF8E EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0x38077164 EQ PUSH2 0x234 JUMPI DUP1 PUSH4 0x3C28D861 EQ PUSH2 0x261 JUMPI DUP1 PUSH4 0x3E228BAE EQ PUSH2 0x28E JUMPI DUP1 PUSH4 0x4AC14782 EQ PUSH2 0x2BB JUMPI DUP1 PUSH4 0x4D0AE546 EQ PUSH2 0x2DB JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x2FB JUMPI DUP1 PUSH4 0x50DDE190 EQ PUSH2 0x31B JUMPI DUP1 PUSH4 0x5C78D0C7 EQ PUSH2 0x33B JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0x35B JUMPI DUP1 PUSH4 0x64A3BC15 EQ PUSH2 0x37B JUMPI DUP1 PUSH4 0x6F3627F8 EQ PUSH2 0x39B JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x3BB JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x3DB JUMPI DUP1 PUSH4 0x7E1D9808 EQ PUSH2 0x3FB JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x41B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x43B JUMPI DUP1 PUSH4 0x92C1421E EQ PUSH2 0x45D JUMPI DUP1 PUSH4 0xA3E20380 EQ PUSH2 0x47D JUMPI DUP1 PUSH4 0xB4BE83D5 EQ PUSH2 0x49D JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x4BD JUMPI DUP1 PUSH4 0xC75E0A81 EQ PUSH2 0x4DD JUMPI DUP1 PUSH4 0xD46B02C3 EQ PUSH2 0x50A JUMPI DUP1 PUSH4 0xDD1C7D18 EQ PUSH2 0x52A JUMPI DUP1 PUSH4 0xE5FA431B EQ PUSH2 0x54A JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x56A JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x57F JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x59F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AF PUSH2 0x1AA CALLDATASIZE PUSH1 0x4 PUSH2 0x3BDE JUMP JUMPDEST PUSH2 0x5C1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x4242 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x1E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AE3 JUMP JUMPDEST PUSH2 0x5D3 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x207 PUSH2 0x202 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BDE JUMP JUMPDEST PUSH2 0x63E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x40FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x220 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x22F CALLDATASIZE PUSH1 0x4 PUSH2 0x3C1B JUMP JUMPDEST PUSH2 0x653 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x240 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x254 PUSH2 0x24F CALLDATASIZE PUSH1 0x4 PUSH2 0x3E83 JUMP JUMPDEST PUSH2 0x721 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x41E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x281 PUSH2 0x27C CALLDATASIZE PUSH1 0x4 PUSH2 0x3CB8 JUMP JUMPDEST PUSH2 0x73C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x4225 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x2A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D78 JUMP JUMPDEST PUSH2 0x828 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x4217 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x2D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AAE JUMP JUMPDEST PUSH2 0xA38 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x2F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AE3 JUMP JUMPDEST PUSH2 0xA70 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x307 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x316 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BDE JUMP JUMPDEST PUSH2 0xAD5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x336 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AE3 JUMP JUMPDEST PUSH2 0xBBC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x347 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x356 CALLDATASIZE PUSH1 0x4 PUSH2 0x3EBF JUMP JUMPDEST PUSH2 0xC21 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x367 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x207 PUSH2 0x376 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BDE JUMP JUMPDEST PUSH2 0xE4F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x387 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x396 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D78 JUMP JUMPDEST PUSH2 0xE64 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AF PUSH2 0x3B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A26 JUMP JUMPDEST PUSH2 0xEE1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x3D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A7E JUMP JUMPDEST PUSH2 0xEF3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x207 PUSH2 0x3F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A44 JUMP JUMPDEST PUSH2 0xF38 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x407 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x416 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B77 JUMP JUMPDEST PUSH2 0xF58 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x427 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x207 PUSH2 0x436 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BFC JUMP JUMPDEST PUSH2 0x1030 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x450 PUSH2 0x1050 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x407A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x469 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x450 PUSH2 0x478 CALLDATASIZE PUSH1 0x4 PUSH2 0x3E83 JUMP JUMPDEST PUSH2 0x105F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x489 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x498 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B77 JUMP JUMPDEST PUSH2 0x107D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x4B8 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D78 JUMP JUMPDEST PUSH2 0x118D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x4D8 CALLDATASIZE PUSH1 0x4 PUSH2 0x3DEA JUMP JUMPDEST PUSH2 0x1211 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4FD PUSH2 0x4F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C83 JUMP JUMPDEST PUSH2 0x1543 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x4234 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x516 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x525 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C83 JUMP JUMPDEST PUSH2 0x161F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x536 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x545 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B77 JUMP JUMPDEST PUSH2 0x164A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x556 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2AE PUSH2 0x565 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B77 JUMP JUMPDEST PUSH2 0x1710 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x576 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x450 PUSH2 0x17EB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E5 PUSH2 0x59A CALLDATASIZE PUSH1 0x4 PUSH2 0x3A26 JUMP JUMPDEST PUSH2 0x17FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B4 PUSH2 0x1862 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x638 JUMPI PUSH2 0x62F DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5F0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x608 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x620 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x118D JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x5D6 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x68E DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x1899 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x6EE JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH2 0x744 PUSH2 0x364C JUMP JUMPDEST PUSH2 0x74C PUSH2 0x367B JUMP JUMPDEST PUSH2 0x754 PUSH2 0x367B JUMP JUMPDEST PUSH2 0x160 DUP1 DUP9 ADD MLOAD PUSH2 0x140 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x0 PUSH2 0x777 DUP9 PUSH2 0x1543 JUMP JUMPDEST SWAP3 POP PUSH2 0x782 DUP8 PUSH2 0x1543 JUMP JUMPDEST SWAP2 POP PUSH2 0x78C PUSH2 0x2075 JUMP JUMPDEST SWAP1 POP PUSH2 0x798 DUP9 DUP9 PUSH2 0x20A4 JUMP JUMPDEST PUSH2 0x7AC DUP9 DUP9 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2124 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0x7C6 SWAP1 DUP10 SWAP1 DUP6 SWAP1 DUP5 SWAP1 DUP1 DUP12 PUSH2 0x21E8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD MLOAD ADD MLOAD PUSH2 0x7DF SWAP1 DUP9 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP1 DUP11 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0x7F8 DUP9 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x2488 JUMP JUMPDEST PUSH2 0x811 DUP8 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x2488 JUMP JUMPDEST PUSH2 0x81D DUP9 DUP9 DUP4 DUP8 PUSH2 0x2527 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x830 PUSH2 0x369B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 DUP1 DUP3 MSTORE PUSH1 0x60 PUSH1 0x4 DUP4 ADD DUP2 DUP2 MSTORE DUP9 MLOAD PUSH1 0x64 DUP6 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 DUP1 DUP12 ADD MLOAD PUSH1 0x84 DUP8 ADD MSTORE SWAP6 DUP11 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP2 DUP10 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE PUSH1 0x80 DUP10 ADD MLOAD PUSH1 0xE4 DUP6 ADD MSTORE PUSH1 0xA0 DUP10 ADD MLOAD PUSH2 0x104 DUP6 ADD MSTORE PUSH1 0xC0 DUP10 ADD MLOAD PUSH2 0x124 DUP6 ADD MSTORE PUSH1 0xE0 DUP10 ADD MLOAD PUSH2 0x144 DUP6 ADD MSTORE PUSH2 0x100 DUP10 ADD MLOAD PUSH2 0x164 DUP6 ADD MSTORE PUSH2 0x120 DUP10 ADD MLOAD PUSH2 0x184 DUP6 ADD MSTORE PUSH2 0x140 DUP10 ADD DUP1 MLOAD PUSH2 0x1A4 DUP7 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP12 ADD MLOAD PUSH2 0x1C4 DUP8 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x1E4 DUP7 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP6 SWAP2 SWAP4 DUP5 SWAP4 SWAP3 PUSH1 0x24 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x204 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x933 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x915 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP13 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x97C JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x95E JUMP JUMPDEST POP POP POP DUP12 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP11 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP12 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x9C4 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x9A6 JUMP JUMPDEST POP PUSH1 0x80 DUP11 DUP12 DUP7 SUB DUP13 ADDRESS GAS DELEGATECALL DUP1 DUP1 ISZERO PUSH2 0x9E3 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0xA01 JUMPI PUSH2 0xA24 JUMP JUMPDEST PUSH1 0x0 DUP15 MSTORE PUSH1 0x0 PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP16 ADD MSTORE PUSH2 0xA24 JUMP JUMPDEST DUP12 MLOAD DUP15 MSTORE PUSH1 0x20 DUP13 ADD MLOAD PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x40 DUP13 ADD MLOAD PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x60 DUP13 ADD MLOAD PUSH1 0x60 DUP16 ADD MSTORE JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0xA6C JUMPI PUSH2 0xA64 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA55 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x161F JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xA3B JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x638 JUMPI PUSH2 0xACC DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA8D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAA5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xABD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xE64 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xA73 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xAE2 PUSH2 0x2075 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x17 DUP4 MSTORE PUSH32 0x494E56414C49445F4E45575F4D414B45525F45504F4348000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 SWAP5 POP PUSH1 0x1 DUP7 ADD SWAP4 POP SWAP1 SWAP2 POP DUP2 DUP4 GT PUSH2 0xB62 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP5 SWAP1 SSTORE MLOAD PUSH32 0x666A5047451D0C744E58819166260F8048FE2786E33B3C1115AF94887A451CA7 SWAP1 PUSH2 0xBAE SWAP1 DUP6 SWAP1 PUSH2 0x4242 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x638 JUMPI PUSH2 0xC18 DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBD9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBF1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC09 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x828 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xBBF JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP2 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xC53 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP1 PUSH2 0x4207 JUMP JUMPDEST PUSH1 0xFF DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x14 DUP4 MSTORE PUSH32 0x41535345545F50524F58595F4D49534D41544348000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND SWAP5 POP DUP6 AND DUP5 EQ PUSH2 0xCCF JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP DUP5 SWAP2 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND ISZERO PUSH2 0xDD3 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD39 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD4D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xD71 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x3EA1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH32 0x41535345545F50524F58595F49445F4D49534D41544348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0xFF DUP1 DUP4 AND SWAP1 DUP9 AND EQ PUSH2 0xDD1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP JUMPDEST PUSH1 0xFF DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP6 AND OR SWAP1 SSTORE MLOAD PUSH32 0x27EF5F484E50F2DAF7C2D82C60FE4CE409009541176EB64095BEAC369DB1D260 SWAP1 PUSH2 0xE3F SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x4250 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xE6C PUSH2 0x369B JUMP JUMPDEST PUSH2 0xE77 DUP5 DUP5 DUP5 PUSH2 0x118D JUMP JUMPDEST SWAP1 POP DUP3 DUP2 PUSH1 0x20 ADD MLOAD EQ PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x14 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xED9 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xEFD PUSH2 0x2075 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP7 SWAP1 SWAP4 AND DUP3 MSTORE SWAP5 SWAP1 SWAP5 MSTORE SWAP1 SWAP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xF60 PUSH2 0x369B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0xF6D PUSH2 0x369B JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF7C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x1025 JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xFAA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0xFCA DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x2703 JUMP JUMPDEST SWAP2 POP PUSH2 0xFF6 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xFDD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x620 JUMPI INVALID JUMPDEST DUP5 MLOAD PUSH1 0x1 ADD DUP6 MSTORE SWAP1 POP PUSH2 0x1009 DUP6 DUP3 PUSH2 0x2715 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x101A JUMPI PUSH2 0x1025 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xF92 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0xFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x1085 PUSH2 0x369B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1094 PUSH2 0x369B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10A3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1181 JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10D1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x10ED SWAP1 DUP10 SWAP1 PUSH2 0x2703 JUMP JUMPDEST SWAP3 POP PUSH2 0x1130 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1100 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP11 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x111C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x2777 JUMP JUMPDEST SWAP2 POP PUSH2 0x115C DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1143 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC09 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1168 DUP7 DUP3 PUSH2 0x2715 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x1176 JUMPI PUSH2 0x1181 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x10B9 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1195 PUSH2 0x369B JUMP JUMPDEST PUSH2 0x119D PUSH2 0x367B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x11AB DUP9 PUSH2 0x1543 JUMP JUMPDEST SWAP4 POP PUSH2 0x11B5 PUSH2 0x2075 JUMP JUMPDEST SWAP3 POP PUSH2 0x11C9 DUP9 PUSH1 0xA0 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2703 JUMP JUMPDEST SWAP2 POP PUSH2 0x11D5 DUP8 DUP4 PUSH2 0x2794 JUMP JUMPDEST SWAP1 POP PUSH2 0x11E5 DUP9 DUP6 DUP6 DUP11 DUP6 DUP12 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0x11EF DUP9 DUP3 PUSH2 0x27AC JUMP JUMPDEST SWAP5 POP PUSH2 0x1206 DUP9 DUP5 DUP7 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP10 PUSH2 0x2488 JUMP JUMPDEST PUSH2 0x1025 DUP9 DUP5 DUP8 PUSH2 0x2816 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x1275 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP ADDRESS DUP7 DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1326 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1307 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE DUP6 SWAP1 KECCAK256 SLOAD DUP4 DUP7 ADD SWAP1 SWAP6 MSTORE PUSH1 0xF DUP4 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP6 POP SWAP4 POP POP PUSH1 0xFF AND ISZERO SWAP1 POP PUSH2 0x13B7 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND CALLER EQ PUSH2 0x1484 JUMPI PUSH2 0x1403 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x1899 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x145A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x8 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP3 POP ISZERO ISZERO SWAP1 POP PUSH2 0x151C JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP POP PUSH1 0x8 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x154B PUSH2 0x367B JUMP JUMPDEST PUSH2 0x1554 DUP3 PUSH2 0x2942 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1571 JUMPI PUSH1 0x1 JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH2 0x161A JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1583 JUMPI PUSH1 0x2 PUSH2 0x1567 JUMP JUMPDEST PUSH2 0x100 DUP3 ADD MLOAD TIMESTAMP LT PUSH2 0x1596 JUMPI PUSH1 0x4 PUSH2 0x1567 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x15BA JUMPI PUSH1 0x6 PUSH2 0x1567 JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD GT ISZERO PUSH2 0x15E7 JUMPI PUSH1 0x6 PUSH2 0x1567 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD GT PUSH2 0x1615 JUMPI PUSH1 0x5 PUSH2 0x1567 JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1627 PUSH2 0x367B JUMP JUMPDEST PUSH2 0x1630 DUP3 PUSH2 0x1543 JUMP JUMPDEST SWAP1 POP PUSH2 0x163C DUP3 DUP3 PUSH2 0x30B6 JUMP JUMPDEST PUSH2 0xA6C DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x31FF JUMP JUMPDEST PUSH2 0x1652 PUSH2 0x369B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x165F PUSH2 0x369B JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x166E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x1025 JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x169C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x16BC DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x2703 JUMP JUMPDEST SWAP2 POP PUSH2 0x16E8 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x16CF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC09 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x16F4 DUP6 DUP3 PUSH2 0x2715 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x1705 JUMPI PUSH2 0x1025 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1684 JUMP JUMPDEST PUSH2 0x1718 PUSH2 0x369B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1727 PUSH2 0x369B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1736 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1181 JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1764 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x1780 SWAP1 DUP10 SWAP1 PUSH2 0x2703 JUMP JUMPDEST SWAP3 POP PUSH2 0x1793 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1100 JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0x17BF DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17A6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x620 JUMPI INVALID JUMPDEST DUP6 MLOAD PUSH1 0x1 ADD DUP7 MSTORE SWAP1 POP PUSH2 0x17D2 DUP7 DUP3 PUSH2 0x2715 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x17E0 JUMPI PUSH2 0x1181 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x174C JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x1827 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP1 PUSH2 0x4207 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0x185F JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xB DUP2 MSTORE PUSH32 0x322E302E312D616C706861000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP9 MLOAD GT PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x1901 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH2 0x190B DUP9 PUSH2 0x327B JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1920 JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1930 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1984 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x6E5 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x41F6 JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1992 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x19FA JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x19F0 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x0 SWAP7 POP PUSH2 0x2068 JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1A08 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1B10 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x1A68 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A78 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1A96 DUP9 PUSH1 0x1 PUSH2 0x3330 JUMP JUMPDEST SWAP4 POP PUSH2 0x1AA3 DUP9 PUSH1 0x21 PUSH2 0x3330 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP11 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1AC8 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4161 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1AEC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP12 DUP2 AND SWAP1 DUP3 AND EQ SWAP9 POP SWAP3 POP PUSH2 0x2068 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1B1E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1CCA JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x1B7E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B8E JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1BAC DUP9 PUSH1 0x1 PUSH2 0x3330 JUMP JUMPDEST SWAP4 POP PUSH2 0x1BB9 DUP9 PUSH1 0x21 PUSH2 0x3330 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1C26 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1C07 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP4 DUP5 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 SUB DUP2 MSTORE SWAP4 DUP3 ADD SWAP1 DUP2 SWAP1 MSTORE DUP4 MLOAD SWAP4 SWAP5 POP SWAP3 DUP4 SWAP3 POP SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1C86 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1C67 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x1AC8 SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x4161 JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1CD8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1D4A JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x1D36 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND CALLER EQ SWAP7 POP PUSH2 0x2068 JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1D58 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1DFE JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP11 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x1DA5 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x4141 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1DD3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1DF7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x3BC0 JUMP JUMPDEST SWAP7 POP PUSH2 0x2068 JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1E0C JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1E9F JUMPI PUSH2 0x1E1B DUP9 PUSH2 0x33C4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1E56 JUMPI PUSH1 0x0 SWAP7 POP PUSH2 0x2068 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x1DA5 SWAP1 DUP14 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x410B JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1EAD JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1EE0 JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0x2068 JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1EEE JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1FD9 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x1F4E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1F5E JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1F7C DUP9 PUSH1 0x1 PUSH2 0x3330 JUMP JUMPDEST SWAP4 POP PUSH2 0x1F89 DUP9 PUSH1 0x21 PUSH2 0x3330 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1B DUP1 DUP3 MSTORE PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A410000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE SWAP4 MLOAD SWAP5 SWAP8 POP PUSH1 0x1 SWAP5 SWAP3 SWAP4 DUP16 SWAP4 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH2 0x1C26 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1FE7 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x201A JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0x2068 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x6E5 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x41F6 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x209C JUMPI PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0x209E JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x20B6 DUP3 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0xA0 ADD MLOAD PUSH2 0x3468 JUMP JUMPDEST PUSH2 0x20C8 DUP4 PUSH1 0x80 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x3468 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x18 DUP2 MSTORE PUSH32 0x4E454741544956455F5350524541445F52455155495245440000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP2 GT ISZERO PUSH2 0x211F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x212C PUSH2 0x364C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x2140 DUP10 PUSH1 0xA0 ADD MLOAD DUP9 PUSH2 0x2703 JUMP JUMPDEST SWAP4 POP PUSH2 0x2150 DUP9 PUSH1 0xA0 ADD MLOAD DUP8 PUSH2 0x2703 JUMP JUMPDEST SWAP3 POP PUSH2 0x2160 DUP4 DUP10 PUSH1 0x80 ADD MLOAD PUSH2 0x3468 JUMP JUMPDEST PUSH2 0x216E DUP6 DUP11 PUSH1 0xA0 ADD MLOAD PUSH2 0x3468 JUMP JUMPDEST GT PUSH2 0x2190 JUMPI DUP4 SWAP2 POP PUSH2 0x2189 DUP9 PUSH1 0xA0 ADD MLOAD DUP10 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2777 JUMP JUMPDEST SWAP1 POP PUSH2 0x21A9 JUMP JUMPDEST DUP3 SWAP1 POP PUSH2 0x21A6 DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP4 PUSH2 0x2777 JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH2 0x21B3 DUP10 DUP4 PUSH2 0x27AC JUMP JUMPDEST DUP6 MSTORE PUSH2 0x21BF DUP9 DUP3 PUSH2 0x27AC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP8 ADD DUP3 SWAP1 MSTORE DUP7 MLOAD MLOAD SWAP2 ADD MLOAD PUSH2 0x21D7 SWAP2 SWAP1 PUSH2 0x2703 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MSTORE POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP5 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x2245 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54414B45525F414D4F554E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP4 ISZERO ISZERO PUSH2 0x229D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x2318 JUMPI PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2316 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x239F JUMPI DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP7 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xD DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x494E56414C49445F54414B455200000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x239D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD ISZERO ISZERO PUSH2 0x2416 JUMPI PUSH2 0x23BD DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP4 PUSH2 0x1899 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4F524445525F5349474E4154555245000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x2414 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP JUMPDEST PUSH2 0x2429 DUP3 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x348C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x524F554E44494E475F4552524F52000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x247F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2496 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x34E2 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE DUP7 DUP2 ADD MLOAD DUP8 MLOAD DUP5 MLOAD SWAP4 DUP6 ADD MLOAD DUP6 DUP5 ADD MLOAD PUSH1 0x60 DUP8 ADD MLOAD PUSH2 0x140 DUP13 ADD MLOAD PUSH2 0x160 DUP14 ADD MLOAD SWAP7 MLOAD DUP12 SWAP9 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP8 DUP9 AND SWAP9 SWAP8 SWAP1 SWAP7 AND SWAP7 PUSH32 0xDE19F18E1B56E6EADA7ED95CCA8398B602BE32F5864640537EE9A9A3532BB29D SWAP7 PUSH2 0x2518 SWAP7 DUP16 SWAP7 SWAP2 SWAP6 SWAP1 SWAP5 SWAP2 SWAP4 SWAP1 SWAP3 SWAP1 PUSH2 0x4088 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x253A DUP8 PUSH2 0x140 ADD MLOAD PUSH2 0x327B JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV SWAP3 POP PUSH2 0x2551 DUP7 PUSH2 0x140 ADD MLOAD PUSH2 0x327B JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 SWAP5 DIV SWAP6 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x25E0 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x25B5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x25E0 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x25C3 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2609 DUP8 PUSH2 0x140 ADD MLOAD DUP5 DUP10 PUSH1 0x0 ADD MLOAD DUP10 PUSH1 0x0 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x140 DUP7 ADD MLOAD DUP7 MLOAD DUP9 MLOAD DUP7 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x2627 SWAP4 SWAP3 DUP7 SWAP3 SWAP1 SWAP2 PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x2641 DUP8 PUSH2 0x140 ADD MLOAD DUP5 DUP10 PUSH1 0x0 ADD MLOAD DUP9 DUP9 PUSH1 0x40 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x265F DUP2 PUSH1 0x1 DUP10 PUSH1 0x0 ADD MLOAD DUP11 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x267D DUP2 PUSH1 0x1 DUP9 PUSH1 0x0 ADD MLOAD DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP8 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x26CF JUMPI PUSH2 0x26CA DUP2 PUSH1 0x1 DUP8 DUP11 PUSH1 0x40 ADD MLOAD PUSH2 0x26C5 DUP10 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP11 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x34E2 JUMP JUMPDEST PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x247F JUMP JUMPDEST PUSH2 0x26E9 DUP2 PUSH1 0x1 DUP8 DUP11 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x247F DUP2 PUSH1 0x1 DUP8 DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x270F JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x2723 SWAP2 SWAP1 PUSH2 0x34E2 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2739 SWAP2 SWAP1 PUSH2 0x34E2 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2752 SWAP2 SWAP1 PUSH2 0x34E2 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x276B SWAP2 SWAP1 PUSH2 0x34E2 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x278C PUSH2 0x2786 DUP6 DUP5 PUSH2 0x3468 JUMP JUMPDEST DUP5 PUSH2 0x3598 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x27A3 JUMPI DUP2 PUSH2 0x27A5 JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x27B4 PUSH2 0x369B JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH2 0x27D0 SWAP2 DUP5 SWAP2 PUSH2 0x2777 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xA0 DUP5 ADD MLOAD PUSH1 0xC0 DUP6 ADD MLOAD PUSH2 0x27EC SWAP3 SWAP2 SWAP1 PUSH2 0x2777 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xA0 DUP5 ADD MLOAD PUSH1 0xE0 DUP6 ADD MLOAD PUSH2 0x280B SWAP3 SWAP2 SWAP1 PUSH2 0x2777 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x2829 DUP7 PUSH2 0x140 ADD MLOAD PUSH2 0x327B JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV SWAP3 POP PUSH2 0x2840 DUP7 PUSH2 0x160 ADD MLOAD PUSH2 0x327B JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 SWAP5 DIV SWAP6 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x28CF JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x28A4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x28CF JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x28B2 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x28F0 DUP7 PUSH2 0x140 ADD MLOAD DUP5 DUP9 PUSH1 0x0 ADD MLOAD DUP9 DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x290A DUP7 PUSH2 0x160 ADD MLOAD DUP4 DUP8 DUP10 PUSH1 0x0 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x2924 DUP2 PUSH1 0x1 DUP9 PUSH1 0x0 ADD MLOAD DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x40 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST PUSH2 0x293A DUP2 PUSH1 0x1 DUP8 DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x34F1 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x446F6D61696E536570617261746F72286164647265737320636F6E7472616374 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x21 ADD SWAP1 POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x29D9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x29BA JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 ADDRESS PUSH13 0x1000000000000000000000000 MUL DUP4 DUP4 ADD MSTORE DUP5 MLOAD PUSH1 0x14 DUP2 DUP6 SUB ADD DUP2 MSTORE PUSH1 0x34 SWAP1 SWAP4 ADD SWAP5 DUP6 SWAP1 MSTORE DUP3 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2A58 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2A39 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 DUP4 DUP4 ADD MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP5 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP5 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP5 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP5 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP5 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP5 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP5 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP5 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP5 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP5 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP5 ADD MSTORE PUSH32 0x62797465732074616B65724173736574446174612C0000000000000000000000 PUSH2 0x116 DUP5 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12B DUP5 ADD MSTORE DUP5 MLOAD DUP1 DUP5 SUB PUSH2 0x10C ADD DUP2 MSTORE PUSH2 0x12C SWAP1 SWAP4 ADD SWAP5 DUP6 SWAP1 MSTORE DUP3 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2CDB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2CBC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP11 PUSH1 0xC0 ADD MLOAD DUP12 PUSH1 0xE0 ADD MLOAD DUP13 PUSH2 0x100 ADD MLOAD DUP14 PUSH2 0x120 ADD MLOAD DUP15 PUSH2 0x140 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2D74 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2D55 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2DD7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2DB8 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP16 PUSH2 0x160 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2E3C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2E1D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2E9F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2E80 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP14 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP13 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP12 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP11 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP13 POP POP POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2FFB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2FDC JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x0 NOT PUSH1 0x20 SWAP5 DUP6 SUB PUSH2 0x100 EXP ADD SWAP1 DUP2 AND SWAP1 NOT SWAP2 SWAP1 SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP5 SWAP1 SWAP3 ADD DUP5 SWAP1 SUB DUP5 KECCAK256 DUP5 DUP3 ADD SWAP10 SWAP1 SWAP10 MSTORE DUP4 DUP3 ADD SWAP8 SWAP1 SWAP8 MSTORE PUSH1 0x60 DUP4 ADD SWAP6 SWAP1 SWAP6 MSTORE POP PUSH1 0x80 DUP1 DUP3 ADD SWAP7 SWAP1 SWAP7 MSTORE DUP4 MLOAD DUP1 DUP3 SUB SWAP1 SWAP7 ADD DUP7 MSTORE PUSH1 0xA0 ADD SWAP3 DUP4 SWAP1 MSTORE POP POP DUP3 MLOAD SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3084 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3065 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x3115 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x3190 JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x318E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP JUMPDEST PUSH2 0x3198 PUSH2 0x2075 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F4D414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP2 AND EQ PUSH2 0x638 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0xB1AD640E9E79B6FDBC3C415DC2914AB54E753D2971F51EAB910F7AA317A3163A SWAP3 PUSH2 0x326F SWAP3 SWAP1 SWAP2 SWAP1 PUSH2 0x41C3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x3301 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP DUP2 MLOAD DUP3 SWAP1 PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x3314 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH1 0x0 NOT ADD SWAP1 SWAP3 MSTORE POP PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x33BA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x344C JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP PUSH2 0x345B DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x35AF JUMP JUMPDEST DUP3 MLOAD PUSH1 0x13 NOT ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MUL DUP4 ISZERO DUP1 PUSH2 0x3484 JUMPI POP DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x3481 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST ISZERO ISZERO PUSH2 0x27A5 JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x349B JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x34B0 JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x34D9 JUMP JUMPDEST PUSH2 0x34CF PUSH2 0x34C0 DUP4 PUSH3 0xF4240 PUSH2 0x3468 JUMP JUMPDEST PUSH2 0x34CA DUP9 DUP8 PUSH2 0x3468 JUMP JUMPDEST PUSH2 0x3598 JUMP JUMPDEST PUSH2 0x3E8 DUP2 GT SWAP4 POP SWAP1 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x27A5 JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 DUP3 GT ISZERO PUSH2 0x293A JUMPI POP PUSH1 0xFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 MLOAD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 DUP2 SWAP1 PUSH4 0xA85E59E4 SWAP1 PUSH2 0x355E SWAP1 DUP10 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x4196 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3578 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x358C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x35A6 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x3639 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E5 SWAP2 SWAP1 PUSH2 0x41F6 JUMP JUMPDEST POP POP ADD PUSH1 0x14 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x3661 PUSH2 0x369B JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x366E PUSH2 0x369B JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27A5 DUP3 CALLDATALOAD PUSH2 0x42EC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x36E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x36F4 PUSH2 0x36EF DUP3 PUSH2 0x429F JUMP JUMPDEST PUSH2 0x4278 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3732 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x371C DUP9 DUP3 PUSH2 0x3876 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3706 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x374D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x375B PUSH2 0x36EF DUP3 PUSH2 0x429F JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3732 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3783 DUP9 DUP3 PUSH2 0x38C5 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x376D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x37AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x37B8 PUSH2 0x36EF DUP3 PUSH2 0x429F JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x37DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3732 JUMPI DUP2 PUSH2 0x37F3 DUP9 DUP3 PUSH2 0x3821 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x37E0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27A5 DUP3 CALLDATALOAD PUSH2 0x42F8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27A5 DUP3 MLOAD PUSH2 0x42F8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27A5 DUP3 CALLDATALOAD PUSH2 0x42FD JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x383F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3857 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x386F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3887 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3895 PUSH2 0x36EF DUP3 PUSH2 0x42C0 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x38B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x38BC DUP4 DUP3 DUP5 PUSH2 0x4311 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x38D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x38E3 PUSH2 0x180 PUSH2 0x4278 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x38F1 DUP5 DUP5 PUSH2 0x36C4 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x3902 DUP5 DUP5 DUP4 ADD PUSH2 0x36C4 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x3916 DUP5 DUP3 DUP6 ADD PUSH2 0x36C4 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x392A DUP5 DUP3 DUP6 ADD PUSH2 0x36C4 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x393E DUP5 DUP3 DUP6 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x3952 DUP5 DUP3 DUP6 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x3966 DUP5 DUP3 DUP6 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x397A DUP5 DUP3 DUP6 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x398F DUP5 DUP3 DUP6 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x39A5 DUP5 DUP3 DUP6 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x39C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x39D3 DUP5 DUP3 DUP6 ADD PUSH2 0x3876 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x39F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3A01 DUP5 DUP3 DUP6 ADD PUSH2 0x3876 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27A5 DUP3 CALLDATALOAD PUSH2 0x4300 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27A5 DUP3 MLOAD PUSH2 0x4300 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x278C DUP5 DUP5 PUSH2 0x36C4 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3A57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3A63 DUP6 DUP6 PUSH2 0x36C4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3A74 DUP6 DUP3 DUP7 ADD PUSH2 0x36C4 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3A91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3A9D DUP6 DUP6 PUSH2 0x36C4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3A74 DUP6 DUP3 DUP7 ADD PUSH2 0x3809 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3AC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3AD7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x278C DUP5 DUP3 DUP6 ADD PUSH2 0x373C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3AF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B1B DUP7 DUP3 DUP8 ADD PUSH2 0x373C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B44 DUP7 DUP3 DUP8 ADD PUSH2 0x3799 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B6D DUP7 DUP3 DUP8 ADD PUSH2 0x36D0 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3B8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3BA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3BAF DUP7 DUP3 DUP8 ADD PUSH2 0x373C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3B44 DUP7 DUP3 DUP8 ADD PUSH2 0x3821 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3BD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x278C DUP5 DUP5 PUSH2 0x3815 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3BF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x278C DUP5 DUP5 PUSH2 0x3821 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3C0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3A63 DUP6 DUP6 PUSH2 0x3821 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3C31 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3C3D DUP8 DUP8 PUSH2 0x3821 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x3C4E DUP8 DUP3 DUP9 ADD PUSH2 0x36C4 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3C6B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3C77 DUP8 DUP3 DUP9 ADD PUSH2 0x382D JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3C95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3CAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x278C DUP5 DUP3 DUP6 ADD PUSH2 0x38C5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3CCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3CE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3CF1 DUP8 DUP3 DUP9 ADD PUSH2 0x38C5 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D0E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3D1A DUP8 DUP3 DUP9 ADD PUSH2 0x38C5 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3D43 DUP8 DUP3 DUP9 ADD PUSH2 0x3876 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D60 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3D6C DUP8 DUP3 DUP9 ADD PUSH2 0x3876 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3D8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3DA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DB0 DUP7 DUP3 DUP8 ADD PUSH2 0x38C5 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3DC1 DUP7 DUP3 DUP8 ADD PUSH2 0x3821 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3DDE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B6D DUP7 DUP3 DUP8 ADD PUSH2 0x3876 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x3E03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3E0F DUP10 DUP10 PUSH2 0x3821 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x3E20 DUP10 DUP3 DUP11 ADD PUSH2 0x36C4 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E49 DUP10 DUP3 DUP11 ADD PUSH2 0x382D JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E74 DUP10 DUP3 DUP11 ADD PUSH2 0x382D JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3E95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x278C DUP5 DUP5 PUSH2 0x3A0E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3EB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x278C DUP5 DUP5 PUSH2 0x3A1A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3ED4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3EE0 DUP7 DUP7 PUSH2 0x3A0E JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3EF1 DUP7 DUP3 DUP8 ADD PUSH2 0x36C4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x3B6D DUP7 DUP3 DUP8 ADD PUSH2 0x36C4 JUMP JUMPDEST PUSH2 0x3F0B DUP2 PUSH2 0x42EC JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3F0B DUP2 PUSH2 0x42F8 JUMP JUMPDEST PUSH2 0x3F0B DUP2 PUSH2 0x42FD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3F2E DUP3 PUSH2 0x42E8 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x3F42 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x431D JUMP JUMPDEST PUSH2 0x3F4B DUP2 PUSH2 0x4349 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x3F0B DUP2 PUSH2 0x4306 JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x3FC8 DUP5 DUP3 PUSH2 0x3F1A JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x3FDB PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x3F1A JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x3FEE PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x3F1A JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x638 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x3F1A JUMP JUMPDEST DUP1 MLOAD PUSH2 0x120 DUP4 ADD SWAP1 PUSH2 0x4013 DUP5 DUP3 PUSH2 0x3FB7 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4026 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x3FB7 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x638 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0x3F1A JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x404B DUP5 DUP3 PUSH2 0x4071 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x405E PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x3F1A JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x638 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x3F0B DUP2 PUSH2 0x4300 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x3F02 JUMP JUMPDEST PUSH1 0xE0 DUP2 ADD PUSH2 0x4096 DUP3 DUP11 PUSH2 0x3F02 JUMP JUMPDEST PUSH2 0x40A3 PUSH1 0x20 DUP4 ADD DUP10 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x40B0 PUSH1 0x40 DUP4 ADD DUP9 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x40BD PUSH1 0x60 DUP4 ADD DUP8 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x40CA PUSH1 0x80 DUP4 ADD DUP7 PUSH2 0x3F1A JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xA0 DUP4 ADD MSTORE PUSH2 0x40DC DUP2 DUP6 PUSH2 0x3F23 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x40F0 DUP2 DUP5 PUSH2 0x3F23 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x3F11 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4119 DUP3 DUP7 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x4126 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x3F02 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4138 DUP2 DUP5 PUSH2 0x3F23 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x414F DUP3 DUP6 PUSH2 0x3F1A JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x278C DUP2 DUP5 PUSH2 0x3F23 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x416F DUP3 DUP8 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x417C PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x4071 JUMP JUMPDEST PUSH2 0x4189 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x3F1A JUMP JUMPDEST PUSH2 0x4138 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x3F1A JUMP JUMPDEST PUSH1 0x80 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x41A7 DUP2 DUP8 PUSH2 0x3F23 JUMP JUMPDEST SWAP1 POP PUSH2 0x41B6 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x3F02 JUMP JUMPDEST PUSH2 0x4189 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x3F02 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x41D4 DUP2 DUP6 PUSH2 0x3F23 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x278C DUP2 DUP5 PUSH2 0x3F23 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x3F58 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x27A5 DUP2 DUP5 PUSH2 0x3F23 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x209E DUP2 PUSH2 0x3F61 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x3FB7 JUMP JUMPDEST PUSH2 0x120 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x4001 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x403A JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x209E DUP3 DUP5 PUSH2 0x3F1A JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x425E DUP3 DUP7 PUSH2 0x4071 JUMP JUMPDEST PUSH2 0x426B PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x3F02 JUMP JUMPDEST PUSH2 0x278C PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x3F02 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x4297 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x42B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x42D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x209E DUP3 PUSH2 0x42EC JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4338 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x4320 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x638 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xbf 0xab 0xe0 SWAP14 REVERT MOD PC PUSH23 0x9E182630C7628D39DCD8D912F30804A9F51E90300F9E47 PUSH19 0x6C6578706572696D656E74616CF50037000000 ", - "sourceMap": "894:607:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1188:42:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1188:42:4;;;;;;;;;;;;;;;;;;;;;;;;;13245:381:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13245:381:9;;;;;;;;;;;1278:42:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1278:42:4;;;;;;;;;;;;;;;;;1723:275:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1723:275:7;;;;;;;;;1017:50:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1017:50:3;;;;;;;;;;;;;;;;;1886:2557:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1886:2557:5;;;;;;;;;;;;;;;;;2141:10811:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2141:10811:9;;;;;;;;;;;;;;;;;24288:185;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24288:185:9;;;;;;;;;13920:393;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13920:393:9;;;;;;;;;1796:607:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1796:607:4;;;;;;;;;14686:395:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14686:395:9;;;;;;;;;1481:1017:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1481:1017:3;;;;;;;;;945:45:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;945:45:8;;;;;;;;;1222:493:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1222:493:9;;;;;;;;;1496:46:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1496:46:4;;;;;;;;;2228:233:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2228:233:7;;;;;;;;;1324:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1324:71:7;;;;;;;;;15469:1843:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15469:1843:9;;;;;;;;;1204:63:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1204:63:7;;;;;;;;;292:20:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;292:20:30;;;;;;;;;;;;2688:203:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2688:203:3;;;;;;;;;22305:1848:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22305:1848:9;;;;;;;;;2720:1327:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2720:1327:4;;;;;;;;;1397:1380:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1397:1380:8;;;;;;;;;4874:2178:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4874:2178:4;;;;;;;;;;;;;;;;;4278:322;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4278:322:4;;;;;;;;;17769:1442:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17769:1442:9;;;;;;;;;19599:2245;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19599:2245:9;;;;;;;;;1042:36:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1042:36:8;;;;566:167:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;566:167:30;;;;;;;;;1097:46:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1097:46:2;;;;;;;;;;;;1188:42:4;;;;;;;;;;;;;:::o;13245:381:9:-;13433:9;13428:192;13452:6;:13;13448:1;:17;13428:192;;;13486:123;13513:6;13520:1;13513:9;;;;;;;;;;;;;;;;;;13540:21;13562:1;13540:24;;;;;;;;;;;;;;;;;;13582:10;13593:1;13582:13;;;;;;;;;;;;;;;;;;13486:9;:123::i;:::-;-1:-1:-1;13467:3:9;;13428:192;;;13245:381;;;;:::o;1278:42:4:-;;;;;;;;;;;;;;;:::o;1723:275:7:-;1869:41;1886:4;1892:6;1900:9;;1869:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1869:16:7;;-1:-1:-1;;;;;1869:41:7:i;:::-;1924:17;;;;;;;;;;;;;;;;;;1848:103;;;;;;-1:-1:-1;;;;;1848:103:7;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1961:15:7;;;;:9;:15;;;;;;;;-1:-1:-1;;;;;1961:23:7;;;;;;;;;;:30;;-1:-1:-1;;1961:30:7;1987:4;1961:30;;;1723:275::o;1017:50:3:-;;;;;;;;;;;;-1:-1:-1;;;;;1017:50:3;;:::o;1886:2557:5:-;2101:59;;:::i;:::-;2566:39;;:::i;:::-;2641:40;;:::i;:::-;2430:24;;;;;2402:25;;;;:52;;;;2492:24;;;2464:25;;;:52;2750:20;2608:23;2430:9;2608:12;:23::i;:::-;2566:65;;2684:24;2697:10;2684:12;:24::i;:::-;2641:67;;2773:26;:24;:26::i;:::-;2750:49;;2862:39;2879:9;2890:10;2862:16;:39::i;:::-;2978:195;3019:9;3042:10;3066:13;:41;;;3121:14;:42;;;2978:27;:195::i;:::-;3323:23;;:46;;;2957:216;;-1:-1:-1;3218:248:5;;3247:9;;3270:13;;3297:12;;3323:46;3443:13;3218:15;:248::i;:::-;3583:24;;;;;:47;;3476:253;;3505:10;;3529:14;;3557:12;;3583:47;3705:14;3476:15;:253::i;:::-;3773:205;3804:9;3827:12;3853:13;:23;;;3890:13;:41;;;3945:18;:23;;;3773:17;:205::i;:::-;3988:209;4019:10;4043:12;4069:14;:24;;;4107:14;:42;;;4163:18;:24;;;3988:17;:209::i;:::-;4266:134;4299:9;4322:10;4346:12;4372:18;4266:19;:134::i;:::-;1886:2557;;;;;;;;;:::o;2141:10811:9:-;2312:30;;:::i;:::-;6207:4;6201:11;;5428:23;6225:42;;;6633:4;6322:3;6301:25;;7320:59;;;7646:19;;6612:26;;;7626:40;;;7434:4;7759:23;;;7753:30;7729:22;;;7722:62;7855:23;;;7849:30;7825:22;;;7818:62;7958:23;;;7952:30;7928:22;;;7921:62;8073:4;8055:23;;8049:30;8025:22;;;8018:62;8173:4;8155:23;;8149:30;8125:22;;;8118:62;8273:4;8255:23;;8249:30;8225:22;;;8218:62;8371:4;8353:23;;8347:30;8323:22;;;8316:62;8470:5;8452:24;;8446:31;8421:23;;;8414:64;8575:5;8557:24;;8551:31;8526:23;;;8519:64;8663:5;8645:24;;8639:31;;8614:23;;;8607:64;;;8771:5;8753:24;;8747:31;8722:23;;;8715:64;8855:5;8982:74;;9144:24;9216:19;;8838:23;;;9420:34;;;5428:23;;6301:25;;;;6612:26;7412:27;;;;6612:26;;9482:22;;;;9264:23;;;;9340:4;9321:24;;9317:35;5401:24;9574:237;9597:13;9594:1;9591:20;9574:237;;;9667:19;;9647:40;;9736:4;9719:22;;;;9774:23;;;;9625:1;9618:9;9574:237;;;-1:-1:-1;;;;9921:31:9;;;9905:13;9886:33;;;9879:74;;;;10047:17;;10041:24;10113:19;;10317:34;;;9913:4;10379:22;;;;10161:23;;;;10237:4;10218:24;;10214:35;10486:1;10472:237;10495:13;10492:1;10489:20;10472:237;;;10565:19;;10545:40;;10634:4;10617:22;;;;10672:23;;;;10523:1;10516:9;10472:237;;;-1:-1:-1;;;10778:46:9;;;-1:-1:-1;11009:33:9;;;10879:4;10857:27;;;10984:59;;;11157:19;;11348:34;;;10857:27;;11410:22;;;;11205:23;;;;11157:19;11281:4;11262:24;;11258:35;-1:-1:-1;11489:237:9;11512:13;11509:1;11506:20;11489:237;;;11582:19;;11562:40;;11651:4;11634:22;;;;11689:23;;;;11540:1;11533:9;11489:237;;;11493:12;12257:3;12178:15;12124;12111:11;12107:33;12026:15;11941:7;11821:3;11791:543;12354:7;12374:205;;;;12597:1;12592:316;;;;12347:561;;12374:205;12419:1;12406:11;12399:22;12467:1;12462:2;12449:11;12445:20;12438:31;12515:1;12510:2;12497:11;12493:20;12486:31;12563:1;12558:2;12545:11;12541:20;12534:31;12374:205;;12592:316;12643:15;12637:22;12624:11;12617:43;12733:2;12716:15;12712:24;12706:31;12701:2;12688:11;12684:20;12677:61;12811:2;12794:15;12790:24;12784:31;12779:2;12766:11;12762:20;12755:61;12889:2;12872:15;12868:24;12862:31;12857:2;12844:11;12840:20;12833:61;12347:561;-1:-1:-1;;;;;;;;;;;;2141:10811:9;;;;;;:::o;24288:185::-;24381:9;24376:91;24400:6;:13;24396:1;:17;24376:91;;;24434:22;24446:6;24453:1;24446:9;;;;;;;;;;;;;;;;;;24434:11;:22::i;:::-;24415:3;;24376:91;;;24288:185;;:::o;13920:393::-;14114:9;14109:198;14133:6;:13;14129:1;:17;14109:198;;;14167:129;14200:6;14207:1;14200:9;;;;;;;;;;;;;;;;;;14227:21;14249:1;14227:24;;;;;;;;;;;;;;;;;;14269:10;14280:1;14269:13;;;;;;;;;;;;;;;;;;14167:15;:129::i;:::-;-1:-1:-1;14148:3:9;;14109:198;;1796:607:4;1867:20;2004:21;2048;1890:26;:24;:26::i;:::-;-1:-1:-1;;;;;2072:24:4;;;;;;:10;:24;;;;;;;;;;2229:23;;;;;;;;;;;;;;;;;;;1867:49;;-1:-1:-1;2035:1:4;2028:8;;;-1:-1:-1;2072:24:4;;-1:-1:-1;2185:29:4;;;2164:98;;;;-1:-1:-1;;;;;2164:98:4;;;;;;;;;;-1:-1:-1;;;;;;2302:24:4;;;;;;:10;:24;;;;;;;:40;;;2357:39;;;;;2329:13;;2357:39;;;;;;;;;;1796:607;;;;:::o;14686:395:9:-;14881:9;14876:199;14900:6;:13;14896:1;:17;14876:199;;;14934:130;14968:6;14975:1;14968:9;;;;;;;;;;;;;;;;;;14995:21;15017:1;14995:24;;;;;;;;;;;;;;;;;;15037:10;15048:1;15037:13;;;;;;;;;;;;;;;;;;14934:16;:130::i;:::-;-1:-1:-1;14915:3:9;;14876:199;;1481:1017:3;1732:25;460:5:30;;1732:25:3;;;;-1:-1:-1;;;;;460:5:30;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:30;;;;;;;;;1768:26:3;;;;;;;:12;:26;;;;;;;;;;1874:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1768:26:3;;;;-1:-1:-1;1826:34:3;;;;1805:99;;;;-1:-1:-1;;;;;1805:99:3;;;;;;;;;;-1:-1:-1;1952:13:3;;-1:-1:-1;;;;;;2095:27:3;;;2091:230;;2162:10;-1:-1:-1;;;;;2162:21:3;;:23;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2162:23:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2162:23:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2162:23:3;;;;;;;;;2273;;;;;;;;;;;;;;;;;2138:47;;-1:-1:-1;2224:31:3;;;;;;;;2199:111;;;;-1:-1:-1;;;;;2199:111:3;;;;;;;;;;;2091:230;2380:26;;;;;;;:12;:26;;;;;;;:39;;-1:-1:-1;;2380:39:3;-1:-1:-1;;;;;2380:39:3;;;;;2434:57;;;;;2380:26;;2462:13;;2477;;2434:57;;;;;;;;;;1481:1017;;;;;;:::o;945:45:8:-;;;;;;;;;;;;;;;:::o;1222:493:9:-;1392:30;;:::i;:::-;1452:95;1475:5;1494:20;1528:9;1452;:95::i;:::-;1438:109;;1616:20;1578:11;:34;;;:58;1650:20;;;;;;;;;;;;;;;;;;1557:123;;;;;;;-1:-1:-1;;;;;1557:123:9;;;;;;;;;;-1:-1:-1;1222:493:9;;;;;:::o;1496:46:4:-;;;;;;;;;;;;;:::o;2228:233:7:-;2354:14;2371:26;:24;:26::i;:::-;-1:-1:-1;;;;;2407:25:7;;;;;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;:47;;-1:-1:-1;;2407:47:7;;;;;;;;;;-1:-1:-1;2228:233:7:o;1324:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15469:1843:9:-;15646:35;;:::i;:::-;15697:27;15771:9;16157:37;16348:36;;:::i;:::-;15727:6;15734:1;15727:9;;;;;;;;;;;;;;;;;;:24;;;15697:54;;15783:1;15771:13;;15766:1507;15790:6;:13;15786:1;:17;15766:1507;;;16060:14;16033:6;16040:1;16033:9;;;;;;;;;;;;;;;;;;:24;;:41;;;;16197:70;16205:20;16227:16;:39;;;16197:7;:70::i;:::-;16157:110;;16387:128;16414:6;16421:1;16414:9;;;;;;;;;;;;;;;;;;16441:29;16488:10;16499:1;16488:13;;;;;;;;;16387:128;16840:21;;16910:1;16901:11;16878:35;;16348:167;-1:-1:-1;17011:51:9;17026:16;16348:167;17011:14;:51::i;:::-;17203:20;17160:16;:39;;;:63;17156:107;;;17243:5;;17156:107;15805:3;;;;;15766:1507;;;15469:1843;;;;;;;;;:::o;1204:63:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;292:20:30:-;;;-1:-1:-1;;;;;292:20:30;;:::o;2688:203:3:-;2830:26;;2778:7;2830:26;;;:12;:26;;;;;;-1:-1:-1;;;;;2830:26:3;;2688:203::o;22305:1848:9:-;22488:35;;:::i;:::-;22539:27;22609:9;22999:37;23305;23591:36;;:::i;:::-;22569:6;22576:1;22569:9;;;;;;;;;;;;;;;;;;:24;;;22539:54;;22621:1;22609:13;;22604:1510;22628:6;:13;22624:1;:17;22604:1510;;;22903:14;22876:6;22883:1;22876:9;;;;;;;;;;;;;;;;;;;:24;;:41;23069:39;;23039:70;;23047:20;;23039:7;:70::i;:::-;22999:110;;23345:165;23379:6;23386:1;23379:9;;;;;;;;;;;;;;;;;;:26;;;23423:6;23430:1;23423:9;;;;;;;;;;;;;;;;;;:26;;;23467:29;23345:16;:165::i;:::-;23305:205;;23630:135;23664:6;23671:1;23664:9;;;;;;;;;;;;;;;;;;23691:29;23738:10;23749:1;23738:13;;;;;;;;;23630:135;23591:174;;23850:51;23865:16;23883:17;23850:14;:51::i;:::-;24001:39;;:63;;23997:107;;;24084:5;;23997:107;22643:3;;;;;22604:1510;;;22305:1848;;;;;;;;;;:::o;2720:1327:4:-;2875:30;;:::i;:::-;2949:26;;:::i;:::-;3039:20;3143:33;3259:30;2978:19;2991:5;2978:12;:19::i;:::-;2949:48;;3062:26;:24;:26::i;:::-;3039:49;;3179:70;3187:5;:22;;;3211:9;:37;;;3179:7;:70::i;:::-;3143:106;;3292:55;3299:20;3321:25;3292:6;:55::i;:::-;3259:88;;3386:186;3415:5;3434:9;3457:12;3483:20;3517:22;3553:9;3386:15;:186::i;:::-;3642:51;3663:5;3670:22;3642:20;:51::i;:::-;3628:65;;3746:181;3777:5;3796:12;3822:9;:19;;;3855:9;:37;;;3906:11;3746:17;:181::i;:::-;3966:45;3978:5;3985:12;3999:11;3966;:45::i;1397:1380:8:-;1604:21;;1653:18;;;;;;;;;;;;;;;;;1730:23;;-1:-1:-1;;;;;1604:21:8;:35;1583:98;;;;-1:-1:-1;;;;;1583:98:8;;;;;;;;;;;1804:4;1823:6;1843:4;1861;;1766:109;;;;;;-1:-1:-1;;;;;1766:109:8;-1:-1:-1;;;;;1766:109:8;;;;;;;;-1:-1:-1;;;;;1766:109:8;-1:-1:-1;;;;;1766:109:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1766:109:8;;;1756:120;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1756:120:8;;;;;;;;;;;;-1:-1:-1;1963:29:8;;;:12;:29;;;;;;2006:15;;;;;;;;;;;;;;;;;1756:120;-1:-1:-1;1756:120:8;-1:-1:-1;;1963:29:8;;1962:30;;-1:-1:-1;1941:90:8;;;;-1:-1:-1;;;;;1941:90:8;;;;;;;;;;-1:-1:-1;;;;;;2117:20:8;;2127:10;2117:20;2113:309;;2212:52;2229:15;2246:6;2254:9;;2212:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2212:16:8;;-1:-1:-1;;;;;2212:52:8:i;:::-;2282:20;;;;;;;;;;;;;;;;;;2187:129;;;;;;-1:-1:-1;;;;;2187:129:8;;;;;;;;;;-1:-1:-1;2381:21:8;:30;;-1:-1:-1;;2381:30:8;-1:-1:-1;;;;;2381:30:8;;;;;2113:309;2463:29;;;;:12;:29;;;;;;;:36;;-1:-1:-1;;2463:36:8;2495:4;2463:36;;;2530:32;2538:4;;2557;;;;2530:32;2557:4;;;;2530:32;;;;;;;;;;;;;;;;;;;;;2576:16;;;;;;;;;;;;;;;;;;-1:-1:-1;2509:93:8;;;-1:-1:-1;2509:93:8;;;;-1:-1:-1;;;;;2509:93:8;;;;;;;;;;-1:-1:-1;;2736:21:8;:34;;-1:-1:-1;;2736:34:8;;;-1:-1:-1;;;;;;1397:1380:8:o;4874:2178:4:-;4961:26;;:::i;:::-;5059:19;5072:5;5059:12;:19::i;:::-;5037;;;:41;5380:22;;;;:27;5376:157;;;5453:38;5447:45;5423:69;;;;5506:16;;5376:157;5846:22;;;;:27;5842:157;;;5919:38;5913:45;;5842:157;6069:27;;;;6050:15;:46;6046:157;;6142:19;6136:26;;6046:157;6272:19;;;;;6262:30;;;;:9;:30;;;;;;;;;6258:143;;;6338:21;6332:28;;6258:143;6447:10;;;;6425:18;;-1:-1:-1;;;;;6414:30:4;;;;;:10;:30;;;;;;:43;6410:156;;;6503:21;6497:28;;6410:156;6686:19;;;;;6679:27;;;;:6;:27;;;;;;;;;6639:37;;;:67;;;6761:22;;;;-1:-1:-1;6716:179:4;;6829:24;6823:31;;6716:179;6998:20;6968:51;;4874:2178;;;;:::o;4278:322::-;4386:26;;:::i;:::-;4415:19;4428:5;4415:12;:19::i;:::-;4386:48;;4473:35;4491:5;4498:9;4473:17;:35::i;:::-;4545:48;4566:5;4573:9;:19;;;4545:20;:48::i;17769:1442:9:-;17953:35;;:::i;:::-;18004:27;18074:9;18460:37;18651:36;;:::i;:::-;18034:6;18041:1;18034:9;;;;;;;;;;;;;;;;;;:24;;;18004:54;;18086:1;18074:13;;18069:1103;18093:6;:13;18089:1;:17;18069:1103;;;18363:14;18336:6;18343:1;18336:9;;;;;;;;;;;;;;;;;;:24;;:41;;;;18500:70;18508:20;18530:16;:39;;;18500:7;:70::i;:::-;18460:110;;18690:135;18724:6;18731:1;18724:9;;;;;;;;;;;;;;;;;;18751:29;18798:10;18809:1;18798:13;;;;;;;;;18690:135;18651:174;;18910:51;18925:16;18943:17;18910:14;:51::i;:::-;19102:20;19059:16;:39;;;:63;19055:107;;;19142:5;;19055:107;18108:3;;;;;18069:1103;;19599:2245;19775:35;;:::i;:::-;19826:27;19896:9;20286:37;20592;20878:36;;:::i;:::-;19856:6;19863:1;19856:9;;;;;;;;;;;;;;;;;;:24;;;19826:54;;19908:1;19896:13;;19891:1914;19915:6;:13;19911:1;:17;19891:1914;;;20190:14;20163:6;20170:1;20163:9;;;;;;;;;;;;;;;;;;;:24;;:41;20356:39;;20326:70;;20334:20;;20326:7;:70::i;:::-;20286:110;;20632:165;20666:6;20673:1;20666:9;;;;;;;;;20632:165;20592:205;;20917:128;20944:6;20951:1;20944:9;;;;;;;;;;;;;;;;;;20971:29;21018:10;21029:1;21018:13;;;;;;;;;20917:128;21370:21;;21440:1;21431:11;21408:35;;20878:167;-1:-1:-1;21541:51:9;21556:16;20878:167;21541:14;:51::i;:::-;21692:39;;:63;;21688:107;;;21775:5;;21688:107;19930:3;;;;;19891:1914;;1042:36:8;;;-1:-1:-1;;;;;1042:36:8;;:::o;566:167:30:-;460:5;;-1:-1:-1;;;;;460:5:30;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:30;;;;;;;;;-1:-1:-1;;;;;662:22:30;;;658:69;;700:5;:16;;-1:-1:-1;;700:16:30;-1:-1:-1;;;;;700:16:30;;;;;658:69;566:167;:::o;1097:46:2:-;;;;;;;;;;;;;;;;;;;:::o;2826:6495:7:-;2983:12;3284:27;3418:7;3435:9;3454;3473:17;7095;3164:1;3145:9;:16;:20;3179:30;;;;;;;;;;;;;;;;;;3124:95;;;;;;;-1:-1:-1;;;;;3124:95:7;;;;;;;;;;;3334:22;3346:9;3334:11;:22::i;:::-;-1:-1:-1;;;3328:29:7;;3314:44;;;;;;;;;;3284:74;-1:-1:-1;3840:21:7;3823:13;:38;;;;;;;;;3819:5154;;;3884:17;;;;;;;;;;;;;;;;3877:25;;-1:-1:-1;;;;;3877:25:7;;;;3884:17;3877:25;;;;3819:5154;4184:21;4167:13;:38;;;;;;;;;4163:4810;;;4246:16;;4285:17;;;;;;;;;;;;;;;;;;4246:21;4221:95;;;;-1:-1:-1;;;;;4221:95:7;;;;;;;;;;-1:-1:-1;4340:5:7;;-1:-1:-1;4359:14:7;;4163:4810;4446:20;4429:13;:37;;;;;;;;;4425:4548;;;4507:16;;4547:18;;;;;;;;;;;;;;;;;;4527:2;4507:22;4482:97;;;;-1:-1:-1;;;;;4482:97:7;;;;;;;;;;;4603:9;4613:1;4603:12;;;;;;;;;;;;;;-1:-1:-1;;;4603:12:7;;;;;;4597:19;;-1:-1:-1;4634:25:7;4646:9;4657:1;4634:11;:25::i;:::-;4630:29;;4677:26;4689:9;4700:2;4677:11;:26::i;:::-;4673:30;;4729:24;4739:4;4745:1;4748;4751;4729:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4729:24:7;;-1:-1:-1;;4729:24:7;;-1:-1:-1;;;;;4777:19:7;;;;;;;;-1:-1:-1;4729:24:7;-1:-1:-1;4810:14:7;;-1:-1:-1;4810:14:7;4425:4548;4901:21;4884:13;:38;;;;;;;;;4880:4093;;;4963:16;;5003:18;;;;;;;;;;;;;;;;;;4983:2;4963:22;4938:97;;;;-1:-1:-1;;;;;4938:97:7;;;;;;;;;;;5059:9;5069:1;5059:12;;;;;;;;;;;;;;-1:-1:-1;;;5059:12:7;;;;;;5053:19;;-1:-1:-1;5090:25:7;5102:9;5113:1;5090:11;:25::i;:::-;5086:29;;5133:26;5145:9;5156:2;5133:11;:26::i;:::-;5129:30;;5185:153;5239:20;;;;;;;;;;;;;;;;;;5261:4;5222:44;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5222:44:7;;;;;-1:-1:-1;5222:44:7;;;26:21:-1;;;6:49;;5222:44:7;;;;;;;5212:55;;5222:44;;-1:-1:-1;5222:44:7;;;-1:-1:-1;5212:55:7;;;;;5222:44;5212:55;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5212:55:7;;;;;;;;;;;;-1:-1:-1;5185:153:7;;;;;;;;;;-1:-1:-1;5212:55:7;-1:-1:-1;5285:1:7;;5304;;-1:-1:-1;5323:1:7;;5185:153;;4880:4093;5999:20;5982:13;:37;;;;;;;;;5978:2995;;;6060:16;;6099:17;;;;;;;;;;;;;;;;;;6060:21;6035:95;;;;-1:-1:-1;;;;;6035:95:7;;;;;;;;;;-1:-1:-1;;;;;;6154:20:7;;6164:10;6154:20;;-1:-1:-1;6188:14:7;;5978:2995;6372:20;6355:13;:37;;;;;;;;;6351:2622;;;6418:49;;;;;-1:-1:-1;;;;;6418:32:7;;;;;:49;;6451:4;;6457:9;;6418:49;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6418:49:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6418:49:7;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6418:49:7;;;;;;;;;6408:59;-1:-1:-1;6481:14:7;;6351:2622;6994:23;6977:13;:40;;;;;;;;;6973:2000;;;7115:25;7130:9;7115:14;:25::i;:::-;-1:-1:-1;;;;;7212:25:7;;;;;;;:17;:25;;;;;;;;:36;;;;;;;;;;7095:45;;-1:-1:-1;7212:36:7;;7211:37;7207:88;;;7275:5;7268:12;;;;7207:88;7318:125;;;;;-1:-1:-1;;;;;7318:38:7;;;;;:125;;7374:4;;7396:6;;7420:9;;7318:125;;;;6973:2000;7579:23;7562:13;:40;;;;;;;;;7558:1415;;;7628:15;;;;:9;:15;;;;;;;;-1:-1:-1;;;;;7628:23:7;;;;;;;;;;;;;-1:-1:-1;7665:14:7;;7558:1415;8245:20;8228:13;:37;;;;;;;;;8224:749;;;8306:16;;8346:18;;;;;;;;;;;;;;;;;;8326:2;8306:22;8281:97;;;;-1:-1:-1;;;;;8281:97:7;;;;;;;;;;;8402:9;8412:1;8402:12;;;;;;;;;;;;;;-1:-1:-1;;;8402:12:7;;;;;;8396:19;;-1:-1:-1;8433:25:7;8445:9;8456:1;8433:11;:25::i;:::-;8429:29;;8476:26;8488:9;8499:2;8476:11;:26::i;:::-;8582:23;;;;;;;;;;;;;;;;;;;;8565:47;;8472:30;;-1:-1:-1;8528:156:7;;8582:23;;8607:4;;8565:47;;;;8582:23;;8565:47;8582:23;36:153:-1;;8224:749:7;8862:23;8845:13;:40;;;;;;;;;8841:132;;;8911:15;;;;:9;:15;;;;;;;;-1:-1:-1;;;;;8911:23:7;;;;;;;;;;;;;-1:-1:-1;8948:14:7;;8841:132;9292:21;;;;;;;;;;;;;;;;9285:29;;-1:-1:-1;;;;;9285:29:7;;;;9292:21;9285:29;;;;2826:6495;;;;;;;;;;;;:::o;3221:241:8:-;3352:21;;3304:7;;;;-1:-1:-1;;;;;3352:21:8;:35;:72;;3403:21;;-1:-1:-1;;;;;3403:21:8;3352:72;;;3390:10;3352:72;3327:97;3221:241;-1:-1:-1;;3221:241:8:o;4613:1073:5:-;5567:64;5575:9;:26;;;5603:10;:27;;;5567:7;:64::i;:::-;5487;5495:9;:26;;;5523:10;:27;;;5487:7;:64::i;:::-;5645:24;;;;;;;;;;;;;;;;;;-1:-1:-1;5487:144:5;5466:213;;;;-1:-1:-1;;;;;5466:213:5;;;;;;;;;;;4613:1073;;:::o;6422:3469::-;6694:59;;:::i;:::-;7650:37;7768:38;7889:34;7933:35;7690:68;7698:9;:26;;;7726:31;7690:7;:68::i;:::-;7650:108;;7809:70;7817:10;:27;;;7846:32;7809:7;:70::i;:::-;7768:111;;8078:68;8086:30;8118:10;:27;;;8078:7;:68::i;:::-;7995:67;8003:29;8034:10;:27;;;7995:7;:67::i;:::-;:151;7978:1238;;8268:29;8239:58;;8507:164;8541:10;:27;;;8586:10;:27;;;8631:26;8507:16;:164::i;:::-;8477:194;;7978:1238;;;8802:30;8772:60;;9040:165;9074:10;:27;;;9119:10;:27;;;9164;9040:16;:165::i;:::-;9011:194;;7978:1238;9301:93;9335:9;9358:26;9301:20;:93::i;:::-;9275:119;;9482:95;9516:10;9540:27;9482:20;:95::i;:::-;9455:24;;;;:122;;;9700:23;;:46;9760:47;;;9679:138;;9700:46;9679:7;:138::i;:::-;9631:45;;;:186;6422:3469;;;;;;;;;;:::o;9315:1637:4:-;9681:21;;9747:16;;;;;;;;;;;;;;;;;;9681:52;;9712:20;9681:52;9660:113;;;;-1:-1:-1;;;;;9660:113:4;;;;;;;;;;-1:-1:-1;9888:20:4;;;;;;;;;;;;;;;;;9849:25;;;9828:90;;;;-1:-1:-1;;;;;9828:90:4;;;;;;;;;;-1:-1:-1;9990:19:4;;;;-1:-1:-1;;;;;9990:33:4;;9986:168;;10064:19;;;;10115:14;;;;;;;;;;;;;-1:-1:-1;10115:14:4;;;;-1:-1:-1;;;;;10064:33:4;10087:10;10064:33;10039:104;;;;-1:-1:-1;;;;;10039:104:4;;;;;;;;;;;9986:168;10224:18;;;;-1:-1:-1;;;;;10224:32:4;;10220:167;;10319:12;-1:-1:-1;;;;;10297:34:4;:5;:18;;;-1:-1:-1;;;;;10297:34:4;;10349:13;;;;;;;;;;;;;;;;;;10272:104;;;;;;;-1:-1:-1;;;;;10272:104:4;;;;;;;;;;;10220:167;10469:37;;;;:42;10465:221;;;10552:68;10569:9;:19;;;10590:5;:18;;;10610:9;10552:16;:68::i;:::-;10638:23;;;;;;;;;;;;;;;;;;10527:148;;;;;;-1:-1:-1;;;;;10527:148:4;;;;;;;;;;;10465:221;10758:149;10791:22;10831:5;:22;;;10871:5;:22;;;10758:15;:149::i;:::-;10921:14;;;;;;;;;;;;;;;;;;10757:150;10736:209;;;;-1:-1:-1;;;;;10736:209:4;;;;;;;;;;;9315:1637;;;;;;:::o;7372:768::-;7650:72;7658:27;7687:11;:34;;;7650:7;:72::i;:::-;7630:17;;;;:6;:17;;;;;;;;;:92;;;;7835:25;;;;7777:18;;7874:34;;7922;;;;7970:24;;;;8008;;;;8069:20;;;;8103;;;;7759:374;;7630:17;;-1:-1:-1;;;;;7759:374:4;;;;;;;;;;;;;7809:12;;7874:34;;7922;;7970:24;;8008;;8103:20;7759:374;;;;;;;;;;7372:768;;;;;:::o;3650:2652:6:-;3898:27;3982:28;4068:25;3934:37;3946:9;:24;;;3934:11;:37::i;:::-;-1:-1:-1;;;3928:44:6;;3898:74;;4019:38;4031:10;:25;;;4019:11;:38::i;:::-;4096:14;4068:42;;;;;;;;-1:-1:-1;;4068:42:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4013:45:6;;;;-1:-1:-1;4068:42:6;;4096:14;4068:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4154:237;4188:9;:24;;;4226:21;4261:9;:22;;;4297:10;:23;;;4334:18;:24;;;:47;;;4154:20;:237::i;:::-;4435:25;;;;4510:23;;4547:22;;4583:23;;:46;;;4401:238;;4435:25;4474:22;;4510:23;;4401:20;:238::i;:::-;4649:224;4683:9;:24;;;4721:21;4756:9;:22;;;4792:12;4818:18;:45;;;4649:20;:224::i;:::-;4906:211;4940:12;1334:1;4992:9;:22;;;5028:9;:29;;;5071:18;:23;;;:36;;;4906:20;:211::i;:::-;5127:214;5161:12;1334:1;5213:10;:23;;;5250:10;:30;;;5294:18;:24;;;:37;;;5127:20;:214::i;:::-;5411:10;:30;;;-1:-1:-1;;;;;5378:63:6;:9;:29;;;-1:-1:-1;;;;;5378:63:6;;5374:922;;;5457:331;5495:12;1334:1;5555:12;5585:9;:29;;;5632:142;5661:18;:23;;;:36;;;5719:18;:24;;;:37;;;5632:7;:142::i;:::-;5457:20;:331::i;:::-;5374:922;;;5819:225;5857:12;1334:1;5917:12;5947:9;:29;;;5994:18;:23;;;:36;;;5819:20;:225::i;:::-;6058:227;6096:12;1334:1;6156:12;6186:10;:30;;;6234:18;:24;;;:37;;;6058:20;:227::i;418:146:31:-;498:7;528:6;;;;521:14;;;;-1:-1:-1;552:5:31;;;418:146::o;1307:648:18:-;1500:39;;1541:40;;1492:90;;1500:39;1492:7;:90::i;:::-;1450:132;;1642:39;;;;;1683:40;;;;1634:90;;1642:39;1634:7;:90::i;:::-;1592:39;;;:132;1774:29;;;;;1805:30;;;;1766:70;;1774:29;1766:7;:70::i;:::-;1734:29;;;:102;1886:29;;;;;1917:30;;;;1878:70;;1886:29;1878:7;:70::i;:::-;1846:29;;;;:102;;;;-1:-1:-1;1307:648:18:o;1064:326:19:-;1218:21;1271:82;1292:26;1300:9;1311:6;1292:7;:26::i;:::-;1332:11;1271:7;:82::i;:::-;1255:98;1064:326;-1:-1:-1;;;;1064:326:19:o;1161:135:31:-;1246:7;1280:1;1276;:5;:13;;1288:1;1276:13;;;1284:1;1276:13;1269:20;1161:135;-1:-1:-1;;;1161:135:31:o;12230:994:4:-;12381:30;;:::i;:::-;12586:34;;;:59;;;12770:22;;;;12806;;;;12692:146;;12623:22;;12692:16;:146::i;:::-;12655:183;;12905:34;;;;12953:22;;;;12989:14;;;;12875:138;;12905:34;12953:22;12875:16;:138::i;:::-;12848:24;;;:165;13080:34;;;;13128:22;;;;13164:14;;;;13050:138;;13080:34;13128:22;13050:16;:138::i;:::-;13023:24;;;:165;12230:994;;;;:::o;2005:1199:6:-;2185:23;2261;2337:25;2217:33;2229:5;:20;;;2217:11;:33::i;:::-;-1:-1:-1;;;2211:40:6;;2185:66;;2293:33;2305:5;:20;;;2293:11;:33::i;:::-;2365:14;2337:42;;;;;;;;-1:-1:-1;;2337:42:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2287:40:6;;;;-1:-1:-1;2337:42:6;;2365:14;2337:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2389:201;2423:5;:20;;;2457:17;2488:5;:18;;;2520:12;2546:11;:34;;;2389:20;:201::i;:::-;2600;2634:5;:20;;;2668:17;2699:12;2725:5;:18;;;2757:11;:34;;;2600:20;:201::i;:::-;2811:191;2845:12;1334:1;2897:5;:18;;;2929:5;:25;;;2968:11;:24;;;2811:20;:191::i;:::-;3012:185;3046:12;1334:1;3098:12;3124:5;:25;;;3163:11;:24;;;3012:20;:185::i;:::-;2005:1199;;;;;;:::o;2793:997:20:-;2882:17;689:67;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;689:67:20;;;679:78;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;679:78:20;;;;;;;;;;;;3150:4;3125:31;;;;;;;;;26:21:-1;;;22:32;6:49;;3125:31:20;;;;;;;;3115:42;;679:78;;-1:-1:-1;3125:31:20;;-1:-1:-1;3125:31:20;;-1:-1:-1;3115:42:20;;;;3125:31;3115:42;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;3115:42:20;;;;;;;;;;;;811:458;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;811:458:20;;;;;;;;801:469;;3115:42;;-1:-1:-1;811:458:20;;-1:-1:-1;811:458:20;;-1:-1:-1;801:469:20;;;;811:458;801:469;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;801:469:20;;;;;;;;;;;;;;;;3246:5;:18;;;3282:5;:18;;;3318:5;:25;;;3361:5;:19;;;3398:5;:22;;;3438:5;:22;;;3478:5;:14;;;3510:5;:14;;;3542:5;:27;;;3587:5;:10;;;3642:5;:20;;;3625:38;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3625:38:20;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3625:38:20;;;3615:49;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3615:49:20;;;;;;;;;;;;;;;;3709:5;:20;;;3692:38;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3692:38:20;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3692:38:20;;;3682:49;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3682:49:20;;;;;;;;;;;;;;;;3212:533;;;;;;-1:-1:-1;;;;;3212:533:20;-1:-1:-1;;;;;3212:533:20;;;;;;;;-1:-1:-1;;;;;3212:533:20;-1:-1:-1;;;;;3212:533:20;;;;;;;;-1:-1:-1;;;;;3212:533:20;-1:-1:-1;;;;;3212:533:20;;;;;;;;-1:-1:-1;;;;;3212:533:20;-1:-1:-1;;;;;3212:533:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3212:533:20;;;3202:544;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;-1:-1;;263:2;259:12;;;254:3;250:22;246:30;340:21;;;311:9;;295:26;;;;377:20;365:33;;3202:544:20;;;;;;;;;;;;3043:713;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3043:713:20;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3043:713:20;;;;;;-1:-1:-1;;3033:724:20;;3043:713;;;;3033:724;;;;;3043:713;3033:724;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;3033:724:20;;;;;;;;;;;2793:997;-1:-1:-1;;;;;2793:997:20:o;11149:810:4:-;11413:21;;11479:16;;;;;;;;;;;;;;;;;11801:20;;11413:52;;11444:20;11413:52;11392:113;;;;-1:-1:-1;;;;;11392:113:4;;;;;;;;;;-1:-1:-1;11579:19:4;;;;-1:-1:-1;;;;;11579:33:4;;11575:168;;11653:19;;;;11704:14;;;;;;;;;;;;;-1:-1:-1;11704:14:4;;;;-1:-1:-1;;;;;11653:33:4;11676:10;11653:33;11628:104;;;;-1:-1:-1;;;;;11628:104:4;;;;;;;;;;;11575:168;11824:26;:24;:26::i;:::-;11881:18;;11929:13;;;;;;;;;;;;;;;;;11801:49;;-1:-1:-1;;;;;;11881:34:4;;;;;;11860:92;;;;-1:-1:-1;;;;;11860:92:4;;;;;;;;;8442:398;8590:20;;;;:9;:20;;;;;;;:27;;-1:-1:-1;;8590:27:4;8613:4;8590:27;;;8707:25;;;;8675:18;;8769:20;;;;8803;;;;8655:178;;8600:9;;-1:-1:-1;;;;;8655:178:4;;;;;;;;;;;;;8769:20;;8803;8655:178;;;;;;;;;;8442:398;;:::o;1520:446:27:-;1604:13;1665:1;1654;:8;:12;1680:33;;;;;;;;;;;;;;;;;;;;;;;1633:90;;;;;;;-1:-1:-1;;;;;1633:90:27;;;;;;;;;;-1:-1:-1;1773:8:27;;1771:1;;-1:-1:-1;;1773:12:27;;;1771:15;;;;;;;;;;1885:8;;-1:-1:-1;;1881:16:27;1910:17;;;-1:-1:-1;;;;1771:15:27;;;;;;1520:446::o;5639:488::-;5760:14;5823:5;5831:2;5823:10;5811:1;:8;:22;;5847:38;;;;;;;;;;;;;;;;;;;;;;;5790:105;;;;;;;-1:-1:-1;;;;;5790:105:27;;;;;;;;;;-1:-1:-1;;6074:13:27;5976:2;6074:13;6068:20;;5639:488::o;2161:480::-;2248:14;2311:2;2299:1;:8;:14;;2327:38;;;;;;;;;;;;;;;;;;;;;;;2278:97;;;;;;;-1:-1:-1;;;;;2278:97:27;;;;;;;;;;;2427:29;2439:1;2453:2;2442:1;:8;:13;2427:11;:29::i;:::-;2559:8;;-1:-1:-1;;2555:17:27;2585;;;-1:-1:-1;2418:38:27;2161:480::o;84:180:31:-;164:7;196:5;;;218:6;;;:20;;;237:1;232;228;:5;;;;;;;;:10;218:20;211:28;;;;;1629:555:19;1782:12;1810:17;1967:33;1856:11;1830:38;;;;;;;1845:9;1837:6;1830:38;1810:58;-1:-1:-1;1882:14:19;;1878:79;;;1919:5;1912:12;;;;1878:79;2003:98;2024:27;2032:9;2043:7;2024;:27::i;:::-;2065:26;2073:9;2084:6;2065:7;:26::i;:::-;2003:7;:98::i;:::-;2149:4;2121:32;;;-1:-1:-1;1967:134:19;-1:-1:-1;1629:555:19;;;;;;;;:::o;570:166:31:-;650:7;682:5;;;704:6;;;;697:14;;;3283:506:3;3597:22;3547:1;3538:6;:10;3534:249;;;-1:-1:-1;3622:26:3;;;;;;;:12;:26;;;;;;;;3720:52;;;;;-1:-1:-1;;;;;3622:26:3;;;;;;3720:23;;:52;;3744:9;;3755:4;;3761:2;;3765:6;;3720:52;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3720:52:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3720:52:3;;;;3283:506;;;;;;:::o;270:142:31:-;350:7;373:6;386:1;382;:5;;;;;;;;;270:142;-1:-1:-1;;;;270:142:31:o;2855:884:27:-;2976:14;3039:5;3047:2;3039:10;3027:1;:8;:22;;3091:38;;;;;;;;;;;;;;;;;;;;;;;3006:133;;;;;;;-1:-1:-1;;;;;3006:133:27;;;;;;;;;;-1:-1:-1;;3641:13:27;3386:2;3641:13;3635:20;-1:-1:-1;;;;;3631:69:27;;2855:884::o;894:607:2:-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;894:607:2;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;146:693;;261:4;249:17;;245:27;-1:-1;235:2;;286:1;283;276:12;235:2;323:6;310:20;345:85;360:69;422:6;360:69;;;345:85;;;458:21;;;502:4;490:17;;;;336:94;;-1:-1;515:14;;490:17;610:1;595:238;620:6;617:1;614:13;595:238;;;703:3;690:17;682:6;678:30;727:42;765:3;753:10;727:42;;;715:55;;-1:-1;793:4;784:14;;;;812;;;;;642:1;635:9;595:238;;;599:14;228:611;;;;;;;;879:735;;1008:4;996:17;;992:27;-1:-1;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:99;1107:83;1183:6;1107:83;;1092:99;1219:21;;;1263:4;1251:17;;;;1083:108;;-1:-1;1276:14;;1251:17;1371:1;1356:252;1381:6;1378:1;1375:13;1356:252;;;1464:3;1451:17;1443:6;1439:30;1488:56;1540:3;1528:10;1488:56;;;1476:69;;-1:-1;1568:4;1559:14;;;;1587;;;;;1403:1;1396:9;1356:252;;1640:707;;1750:4;1738:17;;1734:27;-1:-1;1724:2;;1775:1;1772;1765:12;1724:2;1812:6;1799:20;1834:80;1849:64;1906:6;1849:64;;1834:80;1825:89;;1931:5;1956:6;1949:5;1942:21;1986:4;1978:6;1974:17;1964:27;;2008:4;2003:3;1999:14;1992:21;;2061:6;2108:3;2100:4;2092:6;2088:17;2083:3;2079:27;2076:36;2073:2;;;2125:1;2122;2115:12;2073:2;2150:1;2135:206;2160:6;2157:1;2154:13;2135:206;;;2218:3;2240:37;2273:3;2261:10;2240:37;;;2228:50;;-1:-1;2301:4;2292:14;;;;2320;;;;;2182:1;2175:9;2135:206;;2355:112;;2419:43;2454:6;2441:20;2419:43;;2474:116;;2549:36;2577:6;2571:13;2549:36;;2597:118;;2664:46;2702:6;2689:20;2664:46;;2736:335;;;2843:4;2831:17;;2827:27;-1:-1;2817:2;;2868:1;2865;2858:12;2817:2;-1:-1;2888:20;;2928:18;2917:30;;2914:2;;;2960:1;2957;2950:12;2914:2;2994:4;2986:6;2982:17;2970:29;;3044:3;3037;3029:6;3025:16;3015:8;3011:31;3008:40;3005:2;;;3061:1;3058;3051:12;3005:2;2810:261;;;;;;3080:432;;3170:4;3158:17;;3154:27;-1:-1;3144:2;;3195:1;3192;3185:12;3144:2;3232:6;3219:20;3254:60;3269:44;3306:6;3269:44;;3254:60;3245:69;;3334:6;3327:5;3320:21;3370:4;3362:6;3358:17;3403:4;3396:5;3392:16;3438:3;3429:6;3424:3;3420:16;3417:25;3414:2;;;3455:1;3452;3445:12;3414:2;3465:41;3499:6;3494:3;3489;3465:41;;;3137:375;;;;;;;;3997:2205;;4105:5;4093:9;4088:3;4084:19;4080:31;4077:2;;;4124:1;4121;4114:12;4077:2;4142:21;4157:5;4142:21;;;4133:30;-1:-1;4221:1;4252:49;4297:3;4277:9;4252:49;;;4228:74;;-1:-1;4371:2;4404:49;4449:3;4425:22;;;4404:49;;;4397:4;4390:5;4386:16;4379:75;4323:142;4530:2;4563:49;4608:3;4599:6;4588:9;4584:22;4563:49;;;4556:4;4549:5;4545:16;4538:75;4475:149;4683:2;4716:49;4761:3;4752:6;4741:9;4737:22;4716:49;;;4709:4;4702:5;4698:16;4691:75;4634:143;4839:3;4873:49;4918:3;4909:6;4898:9;4894:22;4873:49;;;4866:4;4859:5;4855:16;4848:75;4787:147;4996:3;5030:49;5075:3;5066:6;5055:9;5051:22;5030:49;;;5023:4;5016:5;5012:16;5005:75;4944:147;5145:3;5179:49;5224:3;5215:6;5204:9;5200:22;5179:49;;;5172:4;5165:5;5161:16;5154:75;5101:139;5294:3;5328:49;5373:3;5364:6;5353:9;5349:22;5328:49;;;5321:4;5314:5;5310:16;5303:75;5250:139;5456:3;5491:49;5536:3;5527:6;5516:9;5512:22;5491:49;;;5483:5;5476;5472:17;5465:76;5399:153;5602:3;5637:49;5682:3;5673:6;5662:9;5658:22;5637:49;;;5629:5;5622;5618:17;5611:76;5562:136;5786:3;5775:9;5771:19;5758:33;5811:18;5803:6;5800:30;5797:2;;;5843:1;5840;5833:12;5797:2;5879:54;5929:3;5920:6;5909:9;5905:22;5879:54;;;5871:5;5864;5860:17;5853:81;5708:237;6033:3;6022:9;6018:19;6005:33;6058:18;6050:6;6047:30;6044:2;;;6090:1;6087;6080:12;6044:2;6126:54;6176:3;6167:6;6156:9;6152:22;6126:54;;;6118:5;6111;6107:17;6100:81;5955:237;4071:2131;;;;;8578:114;;8643:44;8679:6;8666:20;8643:44;;8699:118;;8775:37;8804:6;8798:13;8775:37;;8824:241;;8928:2;8916:9;8907:7;8903:23;8899:32;8896:2;;;8944:1;8941;8934:12;8896:2;8979:1;8996:53;9041:7;9021:9;8996:53;;9072:366;;;9193:2;9181:9;9172:7;9168:23;9164:32;9161:2;;;9209:1;9206;9199:12;9161:2;9244:1;9261:53;9306:7;9286:9;9261:53;;;9251:63;;9223:97;9351:2;9369:53;9414:7;9405:6;9394:9;9390:22;9369:53;;;9359:63;;9330:98;9155:283;;;;;;9445:360;;;9563:2;9551:9;9542:7;9538:23;9534:32;9531:2;;;9579:1;9576;9569:12;9531:2;9614:1;9631:53;9676:7;9656:9;9631:53;;;9621:63;;9593:97;9721:2;9739:50;9781:7;9772:6;9761:9;9757:22;9739:50;;9812:415;;9960:2;9948:9;9939:7;9935:23;9931:32;9928:2;;;9976:1;9973;9966:12;9928:2;10011:31;;10062:18;10051:30;;10048:2;;;10094:1;10091;10084:12;10048:2;10114:97;10203:7;10194:6;10183:9;10179:22;10114:97;;10234:947;;;;10471:2;10459:9;10450:7;10446:23;10442:32;10439:2;;;10487:1;10484;10477:12;10439:2;10522:31;;10573:18;10562:30;;10559:2;;;10605:1;10602;10595:12;10559:2;10625:97;10714:7;10705:6;10694:9;10690:22;10625:97;;;10615:107;;10501:227;10787:2;10776:9;10772:18;10759:32;10811:18;10803:6;10800:30;10797:2;;;10843:1;10840;10833:12;10797:2;10863:78;10933:7;10924:6;10913:9;10909:22;10863:78;;;10853:88;;10738:209;11006:2;10995:9;10991:18;10978:32;11030:18;11022:6;11019:30;11016:2;;;11062:1;11059;11052:12;11016:2;11082:83;11157:7;11148:6;11137:9;11133:22;11082:83;;;11072:93;;10957:214;10433:748;;;;;;11188:811;;;;11400:2;11388:9;11379:7;11375:23;11371:32;11368:2;;;11416:1;11413;11406:12;11368:2;11451:31;;11502:18;11491:30;;11488:2;;;11534:1;11531;11524:12;11488:2;11554:97;11643:7;11634:6;11623:9;11619:22;11554:97;;;11544:107;;11430:227;11688:2;11706:53;11751:7;11742:6;11731:9;11727:22;11706:53;;12006:257;;12118:2;12106:9;12097:7;12093:23;12089:32;12086:2;;;12134:1;12131;12124:12;12086:2;12169:1;12186:61;12239:7;12219:9;12186:61;;12270:241;;12374:2;12362:9;12353:7;12349:23;12345:32;12342:2;;;12390:1;12387;12380:12;12342:2;12425:1;12442:53;12487:7;12467:9;12442:53;;12518:366;;;12639:2;12627:9;12618:7;12614:23;12610:32;12607:2;;;12655:1;12652;12645:12;12607:2;12690:1;12707:53;12752:7;12732:9;12707:53;;12891:615;;;;;13048:2;13036:9;13027:7;13023:23;13019:32;13016:2;;;13064:1;13061;13054:12;13016:2;13099:1;13116:53;13161:7;13141:9;13116:53;;;13106:63;;13078:97;13206:2;13224:53;13269:7;13260:6;13249:9;13245:22;13224:53;;;13214:63;;13185:98;13342:2;13331:9;13327:18;13314:32;13366:18;13358:6;13355:30;13352:2;;;13398:1;13395;13388:12;13352:2;13426:64;13482:7;13473:6;13462:9;13458:22;13426:64;;;13010:496;;;;-1:-1;13408:82;-1:-1;;;;13010:496;13513:373;;13640:2;13628:9;13619:7;13615:23;13611:32;13608:2;;;13656:1;13653;13646:12;13608:2;13691:31;;13742:18;13731:30;;13728:2;;;13774:1;13771;13764:12;13728:2;13794:76;13862:7;13853:6;13842:9;13838:22;13794:76;;13893:1089;;;;;14112:3;14100:9;14091:7;14087:23;14083:33;14080:2;;;14129:1;14126;14119:12;14080:2;14164:31;;14215:18;14204:30;;14201:2;;;14247:1;14244;14237:12;14201:2;14267:76;14335:7;14326:6;14315:9;14311:22;14267:76;;;14257:86;;14143:206;14408:2;14397:9;14393:18;14380:32;14432:18;14424:6;14421:30;14418:2;;;14464:1;14461;14454:12;14418:2;14484:76;14552:7;14543:6;14532:9;14528:22;14484:76;;;14474:86;;14359:207;14625:2;14614:9;14610:18;14597:32;14649:18;14641:6;14638:30;14635:2;;;14681:1;14678;14671:12;14635:2;14701:62;14755:7;14746:6;14735:9;14731:22;14701:62;;;14691:72;;14576:193;14828:2;14817:9;14813:18;14800:32;14852:18;14844:6;14841:30;14838:2;;;14884:1;14881;14874:12;14838:2;14904:62;14958:7;14949:6;14938:9;14934:22;14904:62;;;14894:72;;14779:193;14074:908;;;;;;;;14989:727;;;;15159:2;15147:9;15138:7;15134:23;15130:32;15127:2;;;15175:1;15172;15165:12;15127:2;15210:31;;15261:18;15250:30;;15247:2;;;15293:1;15290;15283:12;15247:2;15313:76;15381:7;15372:6;15361:9;15357:22;15313:76;;;15303:86;;15189:206;15426:2;15444:53;15489:7;15480:6;15469:9;15465:22;15444:53;;;15434:63;;15405:98;15562:2;15551:9;15547:18;15534:32;15586:18;15578:6;15575:30;15572:2;;;15618:1;15615;15608:12;15572:2;15638:62;15692:7;15683:6;15672:9;15668:22;15638:62;;15971:865;;;;;;;16164:3;16152:9;16143:7;16139:23;16135:33;16132:2;;;16181:1;16178;16171:12;16132:2;16216:1;16233:53;16278:7;16258:9;16233:53;;;16223:63;;16195:97;16323:2;16341:53;16386:7;16377:6;16366:9;16362:22;16341:53;;;16331:63;;16302:98;16459:2;16448:9;16444:18;16431:32;16483:18;16475:6;16472:30;16469:2;;;16515:1;16512;16505:12;16469:2;16543:64;16599:7;16590:6;16579:9;16575:22;16543:64;;;16525:82;;;;16410:203;16672:2;16661:9;16657:18;16644:32;16696:18;16688:6;16685:30;16682:2;;;16728:1;16725;16718:12;16682:2;16756:64;16812:7;16803:6;16792:9;16788:22;16756:64;;;16738:82;;;;16623:203;16126:710;;;;;;;;;16843:237;;16945:2;16933:9;16924:7;16920:23;16916:32;16913:2;;;16961:1;16958;16951:12;16913:2;16996:1;17013:51;17056:7;17036:9;17013:51;;17087:259;;17200:2;17188:9;17179:7;17175:23;17171:32;17168:2;;;17216:1;17213;17206:12;17168:2;17251:1;17268:62;17322:7;17302:9;17268:62;;17353:487;;;;17489:2;17477:9;17468:7;17464:23;17460:32;17457:2;;;17505:1;17502;17495:12;17457:2;17540:1;17557:51;17600:7;17580:9;17557:51;;;17547:61;;17519:95;17645:2;17663:53;17708:7;17699:6;17688:9;17684:22;17663:53;;;17653:63;;17624:98;17753:2;17771:53;17816:7;17807:6;17796:9;17792:22;17771:53;;17847:110;17920:31;17945:5;17920:31;;;17915:3;17908:44;17902:55;;;17964:101;18031:28;18053:5;18031:28;;18072:110;18145:31;18170:5;18145:31;;18189:297;;18289:38;18321:5;18289:38;;;18344:6;18339:3;18332:19;18356:63;18412:6;18405:4;18400:3;18396:14;18389:4;18382:5;18378:16;18356:63;;;18451:29;18473:6;18451:29;;;18431:50;;;18444:4;18431:50;;18269:217;-1:-1;;;18269:217;18789:156;18882:57;18933:5;18882:57;;19252:397;19407:2;19395:15;;19444:66;19439:2;19430:12;;19423:88;19545:66;19540:2;19531:12;;19524:88;19640:2;19631:12;;19388:261;19734:888;19962:22;;19875:4;19866:14;;;19996:61;19870:3;19962:22;19996:61;;;19895:174;20163:4;20156:5;20152:16;20146:23;20181:62;20237:4;20232:3;20228:14;20215:11;20181:62;;;20079:176;20339:4;20332:5;20328:16;20322:23;20357:62;20413:4;20408:3;20404:14;20391:11;20357:62;;;20265:166;20515:4;20508:5;20504:16;20498:23;20533:62;20589:4;20584:3;20580:14;20567:11;20533:62;;21688:815;21913:22;;21843:5;21834:15;;;21947:115;21838:3;21913:22;21947:115;;;21864:210;22151:4;22144:5;22140:16;22134:23;22169:116;22279:4;22274:3;22270:14;22257:11;22169:116;;;22084:213;22395:4;22388:5;22384:16;22378:23;22413:63;22469:5;22464:3;22460:15;22447:11;22413:63;;22571:695;22784:22;;22708:4;22699:14;;;22818:57;22703:3;22784:22;22818:57;;;22728:159;22968:4;22961:5;22957:16;22951:23;22986:62;23042:4;23037:3;23033:14;23020:11;22986:62;;;22897:163;23159:4;23152:5;23148:16;23142:23;23177:62;23233:4;23228:3;23224:14;23211:11;23177:62;;23390:104;23459:29;23482:5;23459:29;;23501:193;23609:2;23594:18;;23623:61;23598:9;23657:6;23623:61;;23701:955;24005:3;23990:19;;24020:61;23994:9;24054:6;24020:61;;;24092:62;24150:2;24139:9;24135:18;24126:6;24092:62;;;24165;24223:2;24212:9;24208:18;24199:6;24165:62;;;24238;24296:2;24285:9;24281:18;24272:6;24238:62;;;24311:63;24369:3;24358:9;24354:19;24345:6;24311:63;;;24423:9;24417:4;24413:20;24407:3;24396:9;24392:19;24385:49;24448:62;24505:4;24496:6;24448:62;;;24440:70;;24559:9;24553:4;24549:20;24543:3;24532:9;24528:19;24521:49;24584:62;24641:4;24632:6;24584:62;;;24576:70;23976:680;-1:-1;;;;;;;;;23976:680;24663:181;24765:2;24750:18;;24779:55;24754:9;24807:6;24779:55;;24851:479;25033:2;25018:18;;25047:61;25022:9;25081:6;25047:61;;;25119:62;25177:2;25166:9;25162:18;25153:6;25119:62;;;25229:9;25223:4;25219:20;25214:2;25203:9;25199:18;25192:48;25254:66;25315:4;25306:6;25254:66;;;25246:74;25004:326;-1:-1;;;;;25004:326;25337:378;25491:2;25476:18;;25505:61;25480:9;25539:6;25505:61;;;25614:9;25608:4;25604:20;25599:2;25588:9;25584:18;25577:48;25639:66;25700:4;25691:6;25639:66;;25722:489;25910:3;25895:19;;25925:61;25899:9;25959:6;25925:61;;;25997:58;26051:2;26040:9;26036:18;26027:6;25997:58;;;26066:62;26124:2;26113:9;26109:18;26100:6;26066:62;;;26139;26197:2;26186:9;26182:18;26173:6;26139:62;;26218:581;26428:3;26443:47;;;26413:19;;26504:66;26413:19;26556:6;26504:66;;;26496:74;;26581:62;26639:2;26628:9;26624:18;26615:6;26581:62;;;26654;26712:2;26701:9;26697:18;26688:6;26654:62;;26806:446;26970:2;26984:47;;;26955:18;;27045:62;26955:18;27093:6;27045:62;;;27037:70;;27155:9;27149:4;27145:20;27140:2;27129:9;27125:18;27118:48;27180:62;27237:4;27228:6;27180:62;;27259:233;27387:2;27372:18;;27401:81;27376:9;27455:6;27401:81;;27499:273;27623:2;27637:47;;;27608:18;;27698:64;27608:18;27748:6;27698:64;;27779:387;27960:2;27974:47;;;27945:18;;28035:121;27945:18;28035:121;;28173:310;28339:3;28324:19;;28354:119;28328:9;28446:6;28354:119;;28490:338;28670:3;28655:19;;28685:133;28659:9;28791:6;28685:133;;28835:301;28997:2;28982:18;;29011:115;28986:9;29099:6;29011:115;;29143:193;29251:2;29236:18;;29265:61;29240:9;29299:6;29265:61;;29343:387;29503:2;29488:18;;29517:57;29492:9;29547:6;29517:57;;;29585:62;29643:2;29632:9;29628:18;29619:6;29585:62;;;29658;29716:2;29705:9;29701:18;29692:6;29658:62;;29737:256;29799:2;29793:9;29825:17;;;29900:18;29885:34;;29921:22;;;29882:62;29879:2;;;29957:1;29954;29947:12;29879:2;29973;29966:22;29777:216;;-1:-1;29777:216;30000:263;;30164:18;30156:6;30153:30;30150:2;;;30196:1;30193;30186:12;30150:2;-1:-1;30225:4;30213:17;;;30243:15;;30087:176;30819:254;;30958:18;30950:6;30947:30;30944:2;;;30990:1;30987;30980:12;30944:2;-1:-1;31063:4;31034;31011:17;;;;-1:-1;;31007:33;31053:15;;30881:192;31345:87;31415:12;;31399:33;31632:128;-1:-1;;;;;31701:54;;31684:76;31767:92;31840:13;31833:21;;31816:43;31866:79;31935:5;31918:27;32038:88;32116:4;32105:16;;32088:38;32634:135;;32733:31;32758:5;32733:31;;32777:145;32858:6;32853:3;32848;32835:30;-1:-1;32914:1;32896:16;;32889:27;32828:94;32931:268;32996:1;33003:101;33017:6;33014:1;33011:13;33003:101;;;33084:11;;;33078:18;33065:11;;;33058:39;33039:2;33032:10;33003:101;;;33119:6;33116:1;33113:13;33110:2;;;-1:-1;;33184:1;33166:16;;33159:27;32980:219;33207:97;33295:2;33275:14;-1:-1;;33271:28;;33255:49" + "object": "0x6080604052600436106101955763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663288cdc91811461019a578063297bb70b146101d05780632ac12622146101f25780633683ef8e1461021f578063380771641461023f5780633c28d8611461026c5780633e228bae146102995780634ac14782146102c65780634d0ae546146102e65780634f9559b11461030657806350dde190146103265780635c78d0c714610346578063642f2eaf1461036657806364a3bc15146103865780636f3627f8146103a657806377fcce68146103c65780637b8e3514146103e65780637e1d98081461040657806382c174d0146104265780638da5cb5b1461044657806392c1421e146104685780639363470214610488578063a3e20380146104a8578063b4be83d5146104c8578063bfc8bfce146104e8578063c75e0a8114610508578063d46b02c314610535578063dd1c7d1814610555578063e5fa431b14610575578063eea086ba14610595578063f2fde38b146105aa578063ffa1ad74146105ca575b600080fd5b3480156101a657600080fd5b506101ba6101b5366004613c09565b6105ec565b6040516101c7919061429f565b60405180910390f35b3480156101dc57600080fd5b506101f06101eb366004613b0e565b6105fe565b005b3480156101fe57600080fd5b5061021261020d366004613c09565b610669565b6040516101c7919061415a565b34801561022b57600080fd5b506101f061023a366004613c46565b61067e565b34801561024b57600080fd5b5061025f61025a366004613ee0565b61074c565b6040516101c79190614245565b34801561027857600080fd5b5061028c610287366004613d3e565b610767565b6040516101c79190614282565b3480156102a557600080fd5b506102b96102b4366004613dfe565b610853565b6040516101c79190614274565b3480156102d257600080fd5b506101f06102e1366004613ad9565b610a63565b3480156102f257600080fd5b506101f0610301366004613b0e565b610a9b565b34801561031257600080fd5b506101f0610321366004613c09565b610b00565b34801561033257600080fd5b506101f0610341366004613b0e565b610be7565b34801561035257600080fd5b506101f0610361366004613f1c565b610c4c565b34801561037257600080fd5b50610212610381366004613c09565b610e7a565b34801561039257600080fd5b506102b96103a1366004613dfe565b610e8f565b3480156103b257600080fd5b506101ba6103c1366004613a51565b610f0c565b3480156103d257600080fd5b506101f06103e1366004613aa9565b610f1e565b3480156103f257600080fd5b50610212610401366004613a6f565b610f63565b34801561041257600080fd5b506102b9610421366004613ba2565b610f83565b34801561043257600080fd5b50610212610441366004613c27565b61105b565b34801561045257600080fd5b5061045b61107b565b6040516101c791906140d7565b34801561047457600080fd5b5061045b610483366004613ee0565b61108a565b34801561049457600080fd5b506102126104a3366004613cae565b6110a8565b3480156104b457600080fd5b506102b96104c3366004613ba2565b611884565b3480156104d457600080fd5b506102b96104e3366004613dfe565b611994565b3480156104f457600080fd5b506101f0610503366004613e47565b611a18565b34801561051457600080fd5b50610528610523366004613d09565b611d4a565b6040516101c79190614291565b34801561054157600080fd5b506101f0610550366004613d09565b611e26565b34801561056157600080fd5b506102b9610570366004613ba2565b611e51565b34801561058157600080fd5b506102b9610590366004613ba2565b611f17565b3480156105a157600080fd5b5061045b611ff2565b3480156105b657600080fd5b506101f06105c5366004613a51565b612001565b3480156105d657600080fd5b506105df612069565b6040516101c79190614253565b60016020526000908152604090205481565b60005b83518110156106635761065a848281518110151561061b57fe5b90602001906020020151848381518110151561063357fe5b90602001906020020151848481518110151561064b57fe5b90602001906020020151611994565b50600101610601565b50505050565b60026020526000908152604090205460ff1681565b6106b9848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437506110a8945050505050565b60408051808201909152601181527f494e56414c49445f5349474e415455524500000000000000000000000000000060208201529015156107195760405160e560020a62461bcd0281526004016107109190614253565b60405180910390fd5b5050506000918252600560209081526040808420600160a060020a0390931684529190529020805460ff19166001179055565b600960205260009081526040902054600160a060020a031681565b61076f613677565b6107776136a6565b61077f6136a6565b61016080880151610140808901919091528801519087015260006107a288611d4a565b92506107ad87611d4a565b91506107b76120a0565b90506107c388886120cf565b6107d788888560400151856040015161214f565b8051602001519094506107f190899085908490808b612213565b602080850151015161080a90889084908490808a612213565b61082388828560200151866040015188600001516124b3565b61083c87828460200151856040015188602001516124b3565b61084888888387612552565b505050949350505050565b61085b6136c6565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000008082526060600483018181528851606485019081526020808b01516084870152958a015160a48601529189015160c4850152608089015160e485015260a089015161010485015260c089015161012485015260e0890151610144850152610100890151610164850152610120890151610184850152610140890180516101a486019081526101608b01516101c487015261018090525180516101e48601819052939591938493926024870192849261020489019291820191601f82010460005b8181101561095e578351855260209485019490930192600101610940565b50505050818103610160808401919091528c0151805180835260209283019291820191601f82010460005b818110156109a7578351855260209485019490930192600101610989565b5050508b84525084810360209384019081528a518083529093918201918b81019190601f82010460005b818110156109ef5783518552602094850194909301926001016109d1565b5060808a8b86038c305af4808015610a0e5760018114610a2c57610a4f565b60008e52600060208f0152600060408f0152600060608f0152610a4f565b8b518e5260208c015160208f015260408c015160408f015260608c015160608f01525b505050505050505050505050509392505050565b60005b8151811015610a9757610a8f8282815181101515610a8057fe5b90602001906020020151611e26565b600101610a66565b5050565b60005b835181101561066357610af78482815181101515610ab857fe5b906020019060200201518483815181101515610ad057fe5b906020019060200201518484815181101515610ae857fe5b90602001906020020151610e8f565b50600101610a9e565b6000806000610b0d6120a0565b600160a060020a038116600090815260036020908152604091829020548251808401909352601783527f494e56414c49445f4e45575f4d414b45525f45504f434800000000000000000091830191909152919450600186019350909150818311610b8d5760405160e560020a62461bcd0281526004016107109190614253565b50600160a060020a03831660008181526003602052604090819020849055517f666a5047451d0c744e58819166260f8048fe2786e33b3c1115af94887a451ca790610bd990859061429f565b60405180910390a250505050565b60005b835181101561066357610c438482815181101515610c0457fe5b906020019060200201518483815181101515610c1c57fe5b906020019060200201518484815181101515610c3457fe5b90602001906020020151610853565b50600101610bea565b6000805481908190600160a060020a03163314610c7e5760405160e560020a62461bcd02815260040161071090614264565b60ff8616600090815260096020908152604091829020548251808401909352601483527f41535345545f50524f58595f4d49534d4154434800000000000000000000000091830191909152600160a060020a03908116945085168414610cfa5760405160e560020a62461bcd0281526004016107109190614253565b50849150600160a060020a03821615610dfe5781600160a060020a031663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610d6457600080fd5b505af1158015610d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d9c9190810190613efe565b60408051808201909152601781527f41535345545f50524f58595f49445f4d49534d41544348000000000000000000602082015290915060ff80831690881614610dfc5760405160e560020a62461bcd0281526004016107109190614253565b505b60ff861660009081526009602052604090819020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038516179055517f27ef5f484e50f2daf7c2d82c60fe4ce409009541176eb64095beac369db1d26090610e6a908890889088906142ad565b60405180910390a1505050505050565b60076020526000908152604090205460ff1681565b610e976136c6565b610ea2848484611994565b9050828160200151146040805190810160405280601481526020017f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000815250901515610f045760405160e560020a62461bcd0281526004016107109190614253565b509392505050565b60036020526000908152604090205481565b6000610f286120a0565b600160a060020a03908116600090815260066020908152604080832096909316825294909452909220805460ff191691151591909117905550565b600660209081526000928352604080842090915290825290205460ff1681565b610f8b6136c6565b6060600080610f986136c6565b876000815181101515610fa757fe5b9060200190602002015161016001519350600092505b875183101561105057838884815181101515610fd557fe5b906020019060200201516101600181905250610ff587866020015161272e565b9150611021888481518110151561100857fe5b9060200190602002015183888681518110151561064b57fe5b8451600101855290506110348582612740565b868560200151141561104557611050565b600190920191610fbd565b505050509392505050565b600560209081526000928352604080842090915290825290205460ff1681565b600054600160a060020a031681565b60ff16600090815260096020526040902054600160a060020a031690565b6000806000806000806000808851116040805190810160405280601e81526020017f4c454e4754485f475245415445525f5448414e5f305f524551554952454400008152509015156111105760405160e560020a62461bcd0281526004016107109190614253565b5061111a886127a2565b60f860020a900460ff16600881111561112f57fe5b9550600086600881111561113f57fe5b141561119357604080518082018252601181527f5349474e41545552455f494c4c4547414c0000000000000000000000000000006020820152905160e560020a62461bcd0281526107109190600401614253565b60018660088111156111a157fe5b141561120957875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156111ff5760405160e560020a62461bcd0281526004016107109190614253565b5060009650611877565b600286600881111561121757fe5b141561131f57875160408051808201909152601281527f4c454e4754485f36365f524551554952454400000000000000000000000000006020820152906041146112775760405160e560020a62461bcd0281526004016107109190614253565b5087600081518110151561128757fe5b016020015160f860020a9081900481020494506112a5886001612857565b93506112b2886021612857565b925060018a868686604051600081526020016040526040516112d794939291906141be565b60206040516020810390808403906000865af11580156112fb573d6000803e3d6000fd5b5050604051601f190151600160a060020a038b811690821614985092506118779050565b600386600881111561132d57fe5b14156114d957875160408051808201909152601281527f4c454e4754485f36365f5245515549524544000000000000000000000000000060208201529060411461138d5760405160e560020a62461bcd0281526004016107109190614253565b5087600081518110151561139d57fe5b016020015160f860020a9081900481020494506113bb886001612857565b93506113c8886021612857565b925060016040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152508b6040516020018083805190602001908083835b602083106114355780518252601f199092019160209182019101611416565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b602083106114955780518252601f199092019160209182019101611476565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600083529101928390526112d794509250899189915088906141be565b60048660088111156114e757fe5b141561155957875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156115455760405160e560020a62461bcd0281526004016107109190614253565b50600160a060020a03891633149650611877565b600586600881111561156757fe5b141561160d576040517f1626ba7e000000000000000000000000000000000000000000000000000000008152600160a060020a038a1690631626ba7e906115b4908d908c9060040161419e565b602060405180830381600087803b1580156115ce57600080fd5b505af11580156115e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116069190810190613beb565b9650611877565b600686600881111561161b57fe5b14156116ae5761162a886128eb565b600160a060020a03808b1660009081526006602090815260408083209385168352929052205490915060ff1615156116655760009650611877565b6040517f93634702000000000000000000000000000000000000000000000000000000008152600160a060020a038216906393634702906115b4908d908d908d90600401614168565b60078660088111156116bc57fe5b14156116ef5760008a8152600560209081526040808320600160a060020a038d16845290915290205460ff169650611877565b60088660088111156116fd57fe5b14156117e857875160408051808201909152601281527f4c454e4754485f36365f5245515549524544000000000000000000000000000060208201529060411461175d5760405160e560020a62461bcd0281526004016107109190614253565b5087600081518110151561176d57fe5b016020015160f860020a90819004810204945061178b886001612857565b9350611798886021612857565b604080518082018252601b8082527f19457468657265756d205369676e6564204d6573736167653a0a4100000000006020808401918252935194975060019492938f930191829190808383611435565b60078660088111156117f657fe5b14156118295760008a8152600560209081526040808320600160a060020a038d16845290915290205460ff169650611877565b604080518082018252601581527f5349474e41545552455f554e535550504f5254454400000000000000000000006020820152905160e560020a62461bcd0281526107109190600401614253565b5050505050509392505050565b61188c6136c6565b6060600080600061189b6136c6565b8860008151811015156118aa57fe5b9060200190602002015161014001519450600093505b8851841015611988578489858151811015156118d857fe5b60209081029091010151610140015285516118f490899061272e565b9250611937898581518110151561190757fe5b9060200190602002015160a001518a8681518110151561192357fe5b90602001906020020151608001518561298f565b9150611963898581518110151561194a57fe5b90602001906020020151838987815181101515610c3457fe5b905061196f8682612740565b855188141561197d57611988565b6001909301926118c0565b50505050509392505050565b61199c6136c6565b6119a46136a6565b60008060006119b288611d4a565b93506119bc6120a0565b92506119d08860a00151856040015161272e565b91506119dc87836129ac565b90506119ec8885858a858b612213565b6119f688826129c4565b9450611a0d888486602001518760400151896124b3565b611050888487612a2e565b60085460408051808201909152601281527f5245454e5452414e43595f494c4c4547414c00000000000000000000000000006020820152600091600160a060020a031615611a7c5760405160e560020a62461bcd0281526004016107109190614253565b5030868887876040516020018086600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018481526020018383808284378201915050955050505050506040516020818303038152906040526040518082805190602001908083835b60208310611b2d5780518252601f199092019160209182019101611b0e565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008181526007835285902054838601909552600f83527f494e56414c49445f54585f48415348000000000000000000000000000000000091830191909152955093505060ff16159050611bbe5760405160e560020a62461bcd0281526004016107109190614253565b50600160a060020a0386163314611c8b57611c0a818785858080601f016020809104026020016040519081016040528093929190818152602001838380828437506110a8945050505050565b60408051808201909152601481527f494e56414c49445f54585f5349474e41545552450000000000000000000000006020820152901515611c615760405160e560020a62461bcd0281526004016107109190614253565b506008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161790555b60008181526007602052604090819020805460ff191660011790555130908690869080838380828437820191505092505050600060405180830381855af460408051808201909152601081527f4641494c45445f455845435554494f4e000000000000000000000000000000006020820152925015159050611d235760405160e560020a62461bcd0281526004016107109190614253565b50506008805473ffffffffffffffffffffffffffffffffffffffff19169055505050505050565b611d526136a6565b611d5b82612b5a565b602082015260808201511515611d785760015b60ff168152611e21565b60a08201511515611d8a576002611d6e565b6101008201514210611d9d576004611d6e565b60208082015160009081526002909152604090205460ff1615611dc1576006611d6e565b6101208201518251600160a060020a03166000908152600360205260409020541115611dee576006611d6e565b602080820151600090815260019091526040908190205490820181905260a083015111611e1c576005611d6e565b600381525b919050565b611e2e6136a6565b611e3782611d4a565b9050611e4382826132ce565b610a97828260200151613417565b611e596136c6565b6060600080611e666136c6565b876000815181101515611e7557fe5b9060200190602002015161016001519350600092505b875183101561105057838884815181101515611ea357fe5b906020019060200201516101600181905250611ec387866020015161272e565b9150611eef8884815181101515611ed657fe5b90602001906020020151838886815181101515610c3457fe5b9050611efb8582612740565b8685602001511415611f0c57611050565b600190920191611e8b565b611f1f6136c6565b60606000806000611f2e6136c6565b886000815181101515611f3d57fe5b9060200190602002015161014001519450600093505b885184101561198857848985815181101515611f6b57fe5b6020908102909101015161014001528551611f8790899061272e565b9250611f9a898581518110151561190757fe5b9150611fc68985815181101515611fad57fe5b9060200190602002015183898781518110151561064b57fe5b855160010186529050611fd98682612740565b8551881415611fe757611988565b600190930192611f53565b600854600160a060020a031681565b600054600160a060020a0316331461202e5760405160e560020a62461bcd02815260040161071090614264565b600160a060020a03811615612066576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60408051808201909152600b81527f322e302e312d616c706861000000000000000000000000000000000000000000602082015281565b6008546000908190600160a060020a0316156120c757600854600160a060020a03166120c9565b335b92915050565b6120e18260a001518260a00151613493565b6120f383608001518360800151613493565b60408051808201909152601881527f4e454741544956455f5350524541445f52455155495245440000000000000000602082015291111561214a5760405160e560020a62461bcd0281526004016107109190614253565b505050565b612157613677565b60008060008061216b8960a001518861272e565b935061217b8860a001518761272e565b925061218b838960800151613493565b612199858a60a00151613493565b116121bb578391506121b48860a0015189608001518461298f565b90506121d4565b8290506121d188608001518960a001518361298f565b91505b6121de89836129c4565b85526121ea88826129c4565b6020808701829052865151910151612202919061272e565b604086015250505050949350505050565b845160408051808201909152601081527f4f524445525f554e46494c4c41424c450000000000000000000000000000000060208201529060ff166003146122705760405160e560020a62461bcd0281526004016107109190614253565b5060408051808201909152601481527f494e56414c49445f54414b45525f414d4f554e5400000000000000000000000060208201528315156122c85760405160e560020a62461bcd0281526004016107109190614253565b506060860151600160a060020a03161561234357606086015160408051808201909152600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015290600160a060020a031633146123415760405160e560020a62461bcd0281526004016107109190614253565b505b6020860151600160a060020a0316156123ca5783600160a060020a03168660200151600160a060020a0316146040805190810160405280600d81526020017f494e56414c49445f54414b4552000000000000000000000000000000000000008152509015156123c85760405160e560020a62461bcd0281526004016107109190614253565b505b60408501511515612441576123e885602001518760000151836110a8565b60408051808201909152601781527f494e56414c49445f4f524445525f5349474e4154555245000000000000000000602082015290151561243f5760405160e560020a62461bcd0281526004016107109190614253565b505b612454828760a0015188608001516134b7565b60408051808201909152600e81527f524f554e44494e475f4552524f52000000000000000000000000000000000000602082015290156124aa5760405160e560020a62461bcd0281526004016107109190614253565b50505050505050565b6124c182826020015161350d565b600084815260016020908152604091829020929092558681015187518451938501518584015160608701516101408c01516101608d015196518b98600160a060020a039788169897909616967fde19f18e1b56e6eada7ed95cca8398b602be32f5864640537ee9a9a3532bb29d96612543968f969195909491939092906140e5565b60405180910390a45050505050565b60008060606125658761014001516127a2565b60f860020a9004925061257c8661014001516127a2565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260f860020a909404955083018282801561260b5780601f106125e05761010080835404028352916020019161260b565b820191906000526020600020905b8154815290600101906020018083116125ee57829003601f168201915b50505050509050612634876101400151848960000151896000015188602001516020015161351c565b6101408601518651885186516020015161265293928692909161351c565b61266c87610140015184896000015188886040015161351c565b61268a81600189600001518a6040015188600001516040015161351c565b6126a88160018860000151896040015188602001516040015161351c565b8560400151600160a060020a03168760400151600160a060020a031614156126fa576126f5816001878a604001516126f08960000151606001518a602001516060015161350d565b61351c565b6124aa565b612714816001878a6040015188600001516060015161351c565b6124aa81600187896040015188602001516060015161351c565b60008282111561273a57fe5b50900390565b8151815161274e919061350d565b825260208083015190820151612764919061350d565b60208301526040808301519082015161277d919061350d565b604083015260608083015190820151612796919061350d565b60609092019190915250565b600080825111606060405190810160405280602181526020017f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524581526020017f44000000000000000000000000000000000000000000000000000000000000008152509015156128285760405160e560020a62461bcd0281526004016107109190614253565b5081518290600019810190811061283b57fe5b01602001518251600019019092525060f860020a908190040290565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f51554952454400000000000000000000000000000000000000000000000000008152509015156128e15760405160e560020a62461bcd0281526004016107109190614253565b5050016020015190565b6000601482511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f51554952454400000000000000000000000000000000000000000000000000008152509015156129735760405160e560020a62461bcd0281526004016107109190614253565b506129828260148451036135c3565b8251601319019092525090565b60006129a461299e8584613493565b84613660565b949350505050565b60008183106129bb57816129bd565b825b9392505050565b6129cc6136c6565b6020810182905260a083015160808401516129e891849161298f565b8152602081015160a084015160c0850151612a0492919061298f565b6040820152602081015160a084015160e0850151612a2392919061298f565b606082015292915050565b6000806060612a418661014001516127a2565b60f860020a90049250612a588661016001516127a2565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260f860020a9094049550830182828015612ae75780601f10612abc57610100808354040283529160200191612ae7565b820191906000526020600020905b815481529060010190602001808311612aca57829003601f168201915b50505050509050612b0886610140015184886000015188886000015161351c565b612b2286610160015183878960000151886020015161351c565b612b3c81600188600001518960400151886040015161351c565b612b52816001878960400151886060015161351c565b505050505050565b600060405160200180807f446f6d61696e536570617261746f72286164647265737320636f6e747261637481526020017f290000000000000000000000000000000000000000000000000000000000000081525060210190506040516020818303038152906040526040518082805190602001908083835b60208310612bf15780518252601f199092019160209182019101612bd2565b51815160209384036101000a600019018019909216911617905260408051929094018290038220306c0100000000000000000000000002838301528451601481850301815260349093019485905282519096509194508392508401908083835b60208310612c705780518252601f199092019160209182019101612c51565b51815160209384036101000a6000190180199092169116179052604080519290940182900382207f4f72646572280000000000000000000000000000000000000000000000000000838301527f61646472657373206d616b6572416464726573732c000000000000000000000060268401527f616464726573732074616b6572416464726573732c0000000000000000000000603b8401527f6164647265737320666565526563697069656e74416464726573732c0000000060508401527f616464726573732073656e646572416464726573732c00000000000000000000606c8401527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828401527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8401527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48401527f75696e743235362074616b65724665652c00000000000000000000000000000060c58401527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68401527f75696e743235362073616c742c0000000000000000000000000000000000000060f48401527f6279746573206d616b65724173736574446174612c00000000000000000000006101018401527f62797465732074616b65724173736574446174612c00000000000000000000006101168401527f290000000000000000000000000000000000000000000000000000000000000061012b840152845180840361010c01815261012c9093019485905282519096509194508392508401908083835b60208310612ef35780518252601f199092019160209182019101612ed4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020846000015185602001518660400151876060015188608001518960a001518a60c001518b60e001518c61010001518d61012001518e61014001516040516020018082805190602001908083835b60208310612f8c5780518252601f199092019160209182019101612f6d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310612fef5780518252601f199092019160209182019101612fd0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208f61016001516040516020018082805190602001908083835b602083106130545780518252601f199092019160209182019101613035565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106130b75780518252601f199092019160209182019101613098565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020604051602001808d600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018c600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018b600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018a600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401898152602001888152602001878152602001868152602001858152602001848152602001836000191660001916815260200182600019166000191681526020019c505050505050505050505050506040516020818303038152906040526040518082805190602001908083835b602083106132135780518252601f1990920191602091820191016131f4565b51815160001960209485036101000a019081169019919091161790526040805194909201849003842084820199909952838201979097526060830195909552506080808201969096528351808203909601865260a001928390525050825190918291908401908083835b6020831061329c5780518252601f19909201916020918201910161327d565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b805160408051808201909152601081527f4f524445525f554e46494c4c41424c4500000000000000000000000000000000602082015260009160ff1660031461332d5760405160e560020a62461bcd0281526004016107109190614253565b506060830151600160a060020a0316156133a857606083015160408051808201909152600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015290600160a060020a031633146133a65760405160e560020a62461bcd0281526004016107109190614253565b505b6133b06120a0565b835160408051808201909152600d81527f494e56414c49445f4d414b4552000000000000000000000000000000000000006020820152919250600160a060020a038084169116146106635760405160e560020a62461bcd0281526004016107109190614253565b60008181526002602052604090819020805460ff1916600117905582810151835161014085015161016086015193518594600160a060020a039485169493909316927fb1ad640e9e79b6fdbc3c415dc2914ab54e753d2971f51eab910f7aa317a3163a9261348792909190614220565b60405180910390a45050565b60008282028315806134af57508284828115156134ac57fe5b04145b15156129bd57fe5b6000806000848015156134c657fe5b86850991508115156134db5760009250613504565b6134fa6134eb83620f4240613493565b6134f58887613493565b613660565b6103e88111935090505b50509392505050565b6000828201838110156129bd57fe5b600080821115612b52575060ff8416600090815260096020526040908190205490517fa85e59e4000000000000000000000000000000000000000000000000000000008152600160a060020a0390911690819063a85e59e4906135899089908890889088906004016141f3565b600060405180830381600087803b1580156135a357600080fd5b505af11580156135b7573d6000803e3d6000fd5b50505050505050505050565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f515549524544000000000000000000000000000000000000000000000000000081525090151561364d5760405160e560020a62461bcd0281526004016107109190614253565b50500160140151600160a060020a031690565b600080828481151561366e57fe5b04949350505050565b6101206040519081016040528061368c6136c6565b81526020016136996136c6565b8152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b60006129bd8235614349565b6000601f8201831361370c57600080fd5b813561371f61371a826142fc565b6142d5565b81815260209384019390925082018360005b8381101561375d578135860161374788826138a1565b8452506020928301929190910190600101613731565b5050505092915050565b6000601f8201831361377857600080fd5b813561378661371a826142fc565b81815260209384019390925082018360005b8381101561375d57813586016137ae88826138f0565b8452506020928301929190910190600101613798565b6000601f820183136137d557600080fd5b81356137e361371a826142fc565b9150818183526020840193506020810190508385602084028201111561380857600080fd5b60005b8381101561375d578161381e888261384c565b845250602092830192919091019060010161380b565b60006129bd8235614355565b60006129bd8251614355565b60006129bd823561435a565b600080601f8301841361386a57600080fd5b50813567ffffffffffffffff81111561388257600080fd5b60208301915083600182028301111561389a57600080fd5b9250929050565b6000601f820183136138b257600080fd5b81356138c061371a8261431d565b915080825260208301602083018583830111156138dc57600080fd5b6138e783828461436e565b50505092915050565b6000610180828403121561390357600080fd5b61390e6101806142d5565b9050600061391c84846136ef565b825250602061392d848483016136ef565b6020830152506040613941848285016136ef565b6040830152506060613955848285016136ef565b60608301525060806139698482850161384c565b60808301525060a061397d8482850161384c565b60a08301525060c06139918482850161384c565b60c08301525060e06139a58482850161384c565b60e0830152506101006139ba8482850161384c565b610100830152506101206139d08482850161384c565b6101208301525061014082013567ffffffffffffffff8111156139f257600080fd5b6139fe848285016138a1565b6101408301525061016082013567ffffffffffffffff811115613a2057600080fd5b613a2c848285016138a1565b6101608301525092915050565b60006129bd823561435d565b60006129bd825161435d565b600060208284031215613a6357600080fd5b60006129a484846136ef565b60008060408385031215613a8257600080fd5b6000613a8e85856136ef565b9250506020613a9f858286016136ef565b9150509250929050565b60008060408385031215613abc57600080fd5b6000613ac885856136ef565b9250506020613a9f85828601613834565b600060208284031215613aeb57600080fd5b813567ffffffffffffffff811115613b0257600080fd5b6129a484828501613767565b600080600060608486031215613b2357600080fd5b833567ffffffffffffffff811115613b3a57600080fd5b613b4686828701613767565b935050602084013567ffffffffffffffff811115613b6357600080fd5b613b6f868287016137c4565b925050604084013567ffffffffffffffff811115613b8c57600080fd5b613b98868287016136fb565b9150509250925092565b600080600060608486031215613bb757600080fd5b833567ffffffffffffffff811115613bce57600080fd5b613bda86828701613767565b9350506020613b6f8682870161384c565b600060208284031215613bfd57600080fd5b60006129a48484613840565b600060208284031215613c1b57600080fd5b60006129a4848461384c565b60008060408385031215613c3a57600080fd5b6000613a8e858561384c565b60008060008060608587031215613c5c57600080fd5b6000613c68878761384c565b9450506020613c79878288016136ef565b935050604085013567ffffffffffffffff811115613c9657600080fd5b613ca287828801613858565b95989497509550505050565b600080600060608486031215613cc357600080fd5b6000613ccf868661384c565b9350506020613ce0868287016136ef565b925050604084013567ffffffffffffffff811115613cfd57600080fd5b613b98868287016138a1565b600060208284031215613d1b57600080fd5b813567ffffffffffffffff811115613d3257600080fd5b6129a4848285016138f0565b60008060008060808587031215613d5457600080fd5b843567ffffffffffffffff811115613d6b57600080fd5b613d77878288016138f0565b945050602085013567ffffffffffffffff811115613d9457600080fd5b613da0878288016138f0565b935050604085013567ffffffffffffffff811115613dbd57600080fd5b613dc9878288016138a1565b925050606085013567ffffffffffffffff811115613de657600080fd5b613df2878288016138a1565b91505092959194509250565b600080600060608486031215613e1357600080fd5b833567ffffffffffffffff811115613e2a57600080fd5b613e36868287016138f0565b9350506020613ce08682870161384c565b60008060008060008060808789031215613e6057600080fd5b6000613e6c898961384c565b9650506020613e7d89828a016136ef565b955050604087013567ffffffffffffffff811115613e9a57600080fd5b613ea689828a01613858565b9450945050606087013567ffffffffffffffff811115613ec557600080fd5b613ed189828a01613858565b92509250509295509295509295565b600060208284031215613ef257600080fd5b60006129a48484613a39565b600060208284031215613f1057600080fd5b60006129a48484613a45565b600080600060608486031215613f3157600080fd5b6000613f3d8686613a39565b9350506020613f4e868287016136ef565b9250506040613b98868287016136ef565b613f6881614349565b82525050565b613f6881614355565b613f688161435a565b6000613f8b82614345565b808452613f9f81602086016020860161437a565b613fa8816143a6565b9093016020019392505050565b613f6881614363565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b805160808301906140258482613f77565b5060208201516140386020850182613f77565b50604082015161404b6040850182613f77565b5060608201516106636060850182613f77565b80516101208301906140708482614014565b5060208201516140836080850182614014565b506040820151610663610100850182613f77565b805160608301906140a884826140ce565b5060208201516140bb6020850182613f77565b5060408201516106636040850182613f77565b613f688161435d565b602081016120c98284613f5f565b60e081016140f3828a613f5f565b6141006020830189613f77565b61410d6040830188613f77565b61411a6060830187613f77565b6141276080830186613f77565b81810360a08301526141398185613f80565b905081810360c083015261414d8184613f80565b9998505050505050505050565b602081016120c98284613f6e565b606081016141768286613f77565b6141836020830185613f5f565b81810360408301526141958184613f80565b95945050505050565b604081016141ac8285613f77565b81810360208301526129a48184613f80565b608081016141cc8287613f77565b6141d960208301866140ce565b6141e66040830185613f77565b6141956060830184613f77565b608080825281016142048187613f80565b90506142136020830186613f5f565b6141e66040830185613f5f565b604080825281016142318185613f80565b905081810360208301526129a48184613f80565b602081016120c98284613fb5565b602080825281016129bd8184613f80565b602080825281016120c981613fbe565b608081016120c98284614014565b61012081016120c9828461405e565b606081016120c98284614097565b602081016120c98284613f77565b606081016142bb82866140ce565b6142c86020830185613f5f565b6129a46040830184613f5f565b60405181810167ffffffffffffffff811182821017156142f457600080fd5b604052919050565b600067ffffffffffffffff82111561431357600080fd5b5060209081020190565b600067ffffffffffffffff82111561433457600080fd5b506020601f91909101601f19160190565b5190565b600160a060020a031690565b151590565b90565b60ff1690565b60006120c982614349565b82818337506000910152565b60005b8381101561439557818101518382015260200161437d565b838111156106635750506000910152565b601f01601f1916905600a265627a7a723058200cdc1a8df8fcf3068c1c2c9499b0494875a807cfdd1d5f3d94484c3a4496b04e6c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x195 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x288CDC91 DUP2 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0x297BB70B EQ PUSH2 0x1D0 JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x1F2 JUMPI DUP1 PUSH4 0x3683EF8E EQ PUSH2 0x21F JUMPI DUP1 PUSH4 0x38077164 EQ PUSH2 0x23F JUMPI DUP1 PUSH4 0x3C28D861 EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0x3E228BAE EQ PUSH2 0x299 JUMPI DUP1 PUSH4 0x4AC14782 EQ PUSH2 0x2C6 JUMPI DUP1 PUSH4 0x4D0AE546 EQ PUSH2 0x2E6 JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x306 JUMPI DUP1 PUSH4 0x50DDE190 EQ PUSH2 0x326 JUMPI DUP1 PUSH4 0x5C78D0C7 EQ PUSH2 0x346 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0x64A3BC15 EQ PUSH2 0x386 JUMPI DUP1 PUSH4 0x6F3627F8 EQ PUSH2 0x3A6 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x3C6 JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x3E6 JUMPI DUP1 PUSH4 0x7E1D9808 EQ PUSH2 0x406 JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x426 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x446 JUMPI DUP1 PUSH4 0x92C1421E EQ PUSH2 0x468 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x488 JUMPI DUP1 PUSH4 0xA3E20380 EQ PUSH2 0x4A8 JUMPI DUP1 PUSH4 0xB4BE83D5 EQ PUSH2 0x4C8 JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x4E8 JUMPI DUP1 PUSH4 0xC75E0A81 EQ PUSH2 0x508 JUMPI DUP1 PUSH4 0xD46B02C3 EQ PUSH2 0x535 JUMPI DUP1 PUSH4 0xDD1C7D18 EQ PUSH2 0x555 JUMPI DUP1 PUSH4 0xE5FA431B EQ PUSH2 0x575 JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x595 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x5AA JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x5CA JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C09 JUMP JUMPDEST PUSH2 0x5EC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x429F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0x3B0E JUMP JUMPDEST PUSH2 0x5FE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x20D CALLDATASIZE PUSH1 0x4 PUSH2 0x3C09 JUMP JUMPDEST PUSH2 0x669 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x415A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x23A CALLDATASIZE PUSH1 0x4 PUSH2 0x3C46 JUMP JUMPDEST PUSH2 0x67E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x24B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25F PUSH2 0x25A CALLDATASIZE PUSH1 0x4 PUSH2 0x3EE0 JUMP JUMPDEST PUSH2 0x74C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x4245 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x287 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D3E JUMP JUMPDEST PUSH2 0x767 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x4282 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x2B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x3DFE JUMP JUMPDEST PUSH2 0x853 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x4274 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x2E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AD9 JUMP JUMPDEST PUSH2 0xA63 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x301 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B0E JUMP JUMPDEST PUSH2 0xA9B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x312 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x321 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C09 JUMP JUMPDEST PUSH2 0xB00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x332 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x341 CALLDATASIZE PUSH1 0x4 PUSH2 0x3B0E JUMP JUMPDEST PUSH2 0xBE7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x352 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x361 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F1C JUMP JUMPDEST PUSH2 0xC4C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x381 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C09 JUMP JUMPDEST PUSH2 0xE7A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x392 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x3A1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3DFE JUMP JUMPDEST PUSH2 0xE8F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH2 0x3C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A51 JUMP JUMPDEST PUSH2 0xF0C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x3E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AA9 JUMP JUMPDEST PUSH2 0xF1E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x401 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A6F JUMP JUMPDEST PUSH2 0xF63 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x412 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x421 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BA2 JUMP JUMPDEST PUSH2 0xF83 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x432 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x441 CALLDATASIZE PUSH1 0x4 PUSH2 0x3C27 JUMP JUMPDEST PUSH2 0x105B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x452 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45B PUSH2 0x107B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x40D7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x474 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45B PUSH2 0x483 CALLDATASIZE PUSH1 0x4 PUSH2 0x3EE0 JUMP JUMPDEST PUSH2 0x108A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x494 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x4A3 CALLDATASIZE PUSH1 0x4 PUSH2 0x3CAE JUMP JUMPDEST PUSH2 0x10A8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x4C3 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BA2 JUMP JUMPDEST PUSH2 0x1884 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x4E3 CALLDATASIZE PUSH1 0x4 PUSH2 0x3DFE JUMP JUMPDEST PUSH2 0x1994 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x503 CALLDATASIZE PUSH1 0x4 PUSH2 0x3E47 JUMP JUMPDEST PUSH2 0x1A18 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x514 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x528 PUSH2 0x523 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D09 JUMP JUMPDEST PUSH2 0x1D4A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x4291 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x541 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x550 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D09 JUMP JUMPDEST PUSH2 0x1E26 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x561 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x570 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BA2 JUMP JUMPDEST PUSH2 0x1E51 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B9 PUSH2 0x590 CALLDATASIZE PUSH1 0x4 PUSH2 0x3BA2 JUMP JUMPDEST PUSH2 0x1F17 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45B PUSH2 0x1FF2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1F0 PUSH2 0x5C5 CALLDATASIZE PUSH1 0x4 PUSH2 0x3A51 JUMP JUMPDEST PUSH2 0x2001 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5DF PUSH2 0x2069 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1C7 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x663 JUMPI PUSH2 0x65A DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x61B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x633 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x64B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1994 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x601 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x6B9 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x10A8 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x719 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH2 0x76F PUSH2 0x3677 JUMP JUMPDEST PUSH2 0x777 PUSH2 0x36A6 JUMP JUMPDEST PUSH2 0x77F PUSH2 0x36A6 JUMP JUMPDEST PUSH2 0x160 DUP1 DUP9 ADD MLOAD PUSH2 0x140 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x0 PUSH2 0x7A2 DUP9 PUSH2 0x1D4A JUMP JUMPDEST SWAP3 POP PUSH2 0x7AD DUP8 PUSH2 0x1D4A JUMP JUMPDEST SWAP2 POP PUSH2 0x7B7 PUSH2 0x20A0 JUMP JUMPDEST SWAP1 POP PUSH2 0x7C3 DUP9 DUP9 PUSH2 0x20CF JUMP JUMPDEST PUSH2 0x7D7 DUP9 DUP9 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x214F JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0x7F1 SWAP1 DUP10 SWAP1 DUP6 SWAP1 DUP5 SWAP1 DUP1 DUP12 PUSH2 0x2213 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD MLOAD ADD MLOAD PUSH2 0x80A SWAP1 DUP9 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP1 DUP11 PUSH2 0x2213 JUMP JUMPDEST PUSH2 0x823 DUP9 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x83C DUP8 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x848 DUP9 DUP9 DUP4 DUP8 PUSH2 0x2552 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x85B PUSH2 0x36C6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 DUP1 DUP3 MSTORE PUSH1 0x60 PUSH1 0x4 DUP4 ADD DUP2 DUP2 MSTORE DUP9 MLOAD PUSH1 0x64 DUP6 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 DUP1 DUP12 ADD MLOAD PUSH1 0x84 DUP8 ADD MSTORE SWAP6 DUP11 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP2 DUP10 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE PUSH1 0x80 DUP10 ADD MLOAD PUSH1 0xE4 DUP6 ADD MSTORE PUSH1 0xA0 DUP10 ADD MLOAD PUSH2 0x104 DUP6 ADD MSTORE PUSH1 0xC0 DUP10 ADD MLOAD PUSH2 0x124 DUP6 ADD MSTORE PUSH1 0xE0 DUP10 ADD MLOAD PUSH2 0x144 DUP6 ADD MSTORE PUSH2 0x100 DUP10 ADD MLOAD PUSH2 0x164 DUP6 ADD MSTORE PUSH2 0x120 DUP10 ADD MLOAD PUSH2 0x184 DUP6 ADD MSTORE PUSH2 0x140 DUP10 ADD DUP1 MLOAD PUSH2 0x1A4 DUP7 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP12 ADD MLOAD PUSH2 0x1C4 DUP8 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x1E4 DUP7 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP6 SWAP2 SWAP4 DUP5 SWAP4 SWAP3 PUSH1 0x24 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x204 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x95E JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x940 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP13 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x9A7 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x989 JUMP JUMPDEST POP POP POP DUP12 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP11 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP12 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x9EF JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x9D1 JUMP JUMPDEST POP PUSH1 0x80 DUP11 DUP12 DUP7 SUB DUP13 ADDRESS GAS DELEGATECALL DUP1 DUP1 ISZERO PUSH2 0xA0E JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0xA2C JUMPI PUSH2 0xA4F JUMP JUMPDEST PUSH1 0x0 DUP15 MSTORE PUSH1 0x0 PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP16 ADD MSTORE PUSH2 0xA4F JUMP JUMPDEST DUP12 MLOAD DUP15 MSTORE PUSH1 0x20 DUP13 ADD MLOAD PUSH1 0x20 DUP16 ADD MSTORE PUSH1 0x40 DUP13 ADD MLOAD PUSH1 0x40 DUP16 ADD MSTORE PUSH1 0x60 DUP13 ADD MLOAD PUSH1 0x60 DUP16 ADD MSTORE JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0xA97 JUMPI PUSH2 0xA8F DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA80 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1E26 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xA66 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x663 JUMPI PUSH2 0xAF7 DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAB8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAD0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAE8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xE8F JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xA9E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xB0D PUSH2 0x20A0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x17 DUP4 MSTORE PUSH32 0x494E56414C49445F4E45575F4D414B45525F45504F4348000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 SWAP5 POP PUSH1 0x1 DUP7 ADD SWAP4 POP SWAP1 SWAP2 POP DUP2 DUP4 GT PUSH2 0xB8D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP5 SWAP1 SSTORE MLOAD PUSH32 0x666A5047451D0C744E58819166260F8048FE2786E33B3C1115AF94887A451CA7 SWAP1 PUSH2 0xBD9 SWAP1 DUP6 SWAP1 PUSH2 0x429F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x663 JUMPI PUSH2 0xC43 DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC04 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC1C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC34 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x853 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xBEA JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP2 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xC7E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP1 PUSH2 0x4264 JUMP JUMPDEST PUSH1 0xFF DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x14 DUP4 MSTORE PUSH32 0x41535345545F50524F58595F4D49534D41544348000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND SWAP5 POP DUP6 AND DUP5 EQ PUSH2 0xCFA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP DUP5 SWAP2 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND ISZERO PUSH2 0xDFE JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD78 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xD9C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x3EFE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH32 0x41535345545F50524F58595F49445F4D49534D41544348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH1 0xFF DUP1 DUP4 AND SWAP1 DUP9 AND EQ PUSH2 0xDFC JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP JUMPDEST PUSH1 0xFF DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP6 AND OR SWAP1 SSTORE MLOAD PUSH32 0x27EF5F484E50F2DAF7C2D82C60FE4CE409009541176EB64095BEAC369DB1D260 SWAP1 PUSH2 0xE6A SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x42AD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xE97 PUSH2 0x36C6 JUMP JUMPDEST PUSH2 0xEA2 DUP5 DUP5 DUP5 PUSH2 0x1994 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 PUSH1 0x20 ADD MLOAD EQ PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x14 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xF04 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF28 PUSH2 0x20A0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP7 SWAP1 SWAP4 AND DUP3 MSTORE SWAP5 SWAP1 SWAP5 MSTORE SWAP1 SWAP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xF8B PUSH2 0x36C6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0xF98 PUSH2 0x36C6 JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xFA7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x1050 JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xFD5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0xFF5 DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x272E JUMP JUMPDEST SWAP2 POP PUSH2 0x1021 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1008 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x64B JUMPI INVALID JUMPDEST DUP5 MLOAD PUSH1 0x1 ADD DUP6 MSTORE SWAP1 POP PUSH2 0x1034 DUP6 DUP3 PUSH2 0x2740 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x1045 JUMPI PUSH2 0x1050 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xFBD JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0xFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP9 MLOAD GT PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x1110 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH2 0x111A DUP9 PUSH2 0x27A2 JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x112F JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x113F JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1193 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x710 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x4253 JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x11A1 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1209 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x11FF JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x0 SWAP7 POP PUSH2 0x1877 JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1217 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x131F JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x1277 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1287 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x12A5 DUP9 PUSH1 0x1 PUSH2 0x2857 JUMP JUMPDEST SWAP4 POP PUSH2 0x12B2 DUP9 PUSH1 0x21 PUSH2 0x2857 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP11 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x12D7 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x41BE JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x12FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP12 DUP2 AND SWAP1 DUP3 AND EQ SWAP9 POP SWAP3 POP PUSH2 0x1877 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x132D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x14D9 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x138D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x139D JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x13BB DUP9 PUSH1 0x1 PUSH2 0x2857 JUMP JUMPDEST SWAP4 POP PUSH2 0x13C8 DUP9 PUSH1 0x21 PUSH2 0x2857 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1435 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1416 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP4 DUP5 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 SUB DUP2 MSTORE SWAP4 DUP3 ADD SWAP1 DUP2 SWAP1 MSTORE DUP4 MLOAD SWAP4 SWAP5 POP SWAP3 DUP4 SWAP3 POP SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1495 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1476 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x12D7 SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x41BE JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x14E7 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1559 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x1545 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND CALLER EQ SWAP7 POP PUSH2 0x1877 JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x1567 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x160D JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP11 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x15B4 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x419E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x15CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x15E2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1606 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x3BEB JUMP JUMPDEST SWAP7 POP PUSH2 0x1877 JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x161B JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x16AE JUMPI PUSH2 0x162A DUP9 PUSH2 0x28EB JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1665 JUMPI PUSH1 0x0 SWAP7 POP PUSH2 0x1877 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x15B4 SWAP1 DUP14 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x4168 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x16BC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x16EF JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0x1877 JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x16FD JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x17E8 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x175D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x176D JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x178B DUP9 PUSH1 0x1 PUSH2 0x2857 JUMP JUMPDEST SWAP4 POP PUSH2 0x1798 DUP9 PUSH1 0x21 PUSH2 0x2857 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1B DUP1 DUP3 MSTORE PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A410000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE SWAP4 MLOAD SWAP5 SWAP8 POP PUSH1 0x1 SWAP5 SWAP3 SWAP4 DUP16 SWAP4 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH2 0x1435 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x17F6 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1829 JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0x1877 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x710 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x4253 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x188C PUSH2 0x36C6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x189B PUSH2 0x36C6 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18AA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1988 JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18D8 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x18F4 SWAP1 DUP10 SWAP1 PUSH2 0x272E JUMP JUMPDEST SWAP3 POP PUSH2 0x1937 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1907 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP11 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1923 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x298F JUMP JUMPDEST SWAP2 POP PUSH2 0x1963 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x194A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC34 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x196F DUP7 DUP3 PUSH2 0x2740 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x197D JUMPI PUSH2 0x1988 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x18C0 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x199C PUSH2 0x36C6 JUMP JUMPDEST PUSH2 0x19A4 PUSH2 0x36A6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x19B2 DUP9 PUSH2 0x1D4A JUMP JUMPDEST SWAP4 POP PUSH2 0x19BC PUSH2 0x20A0 JUMP JUMPDEST SWAP3 POP PUSH2 0x19D0 DUP9 PUSH1 0xA0 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x272E JUMP JUMPDEST SWAP2 POP PUSH2 0x19DC DUP8 DUP4 PUSH2 0x29AC JUMP JUMPDEST SWAP1 POP PUSH2 0x19EC DUP9 DUP6 DUP6 DUP11 DUP6 DUP12 PUSH2 0x2213 JUMP JUMPDEST PUSH2 0x19F6 DUP9 DUP3 PUSH2 0x29C4 JUMP JUMPDEST SWAP5 POP PUSH2 0x1A0D DUP9 DUP5 DUP7 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP10 PUSH2 0x24B3 JUMP JUMPDEST PUSH2 0x1050 DUP9 DUP5 DUP8 PUSH2 0x2A2E JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x1A7C JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP ADDRESS DUP7 DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1B2D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1B0E JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 DUP4 MSTORE DUP6 SWAP1 KECCAK256 SLOAD DUP4 DUP7 ADD SWAP1 SWAP6 MSTORE PUSH1 0xF DUP4 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP6 POP SWAP4 POP POP PUSH1 0xFF AND ISZERO SWAP1 POP PUSH2 0x1BBE JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND CALLER EQ PUSH2 0x1C8B JUMPI PUSH2 0x1C0A DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x10A8 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x1C61 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x8 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP3 POP ISZERO ISZERO SWAP1 POP PUSH2 0x1D23 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP POP PUSH1 0x8 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1D52 PUSH2 0x36A6 JUMP JUMPDEST PUSH2 0x1D5B DUP3 PUSH2 0x2B5A JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1D78 JUMPI PUSH1 0x1 JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH2 0x1E21 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1D8A JUMPI PUSH1 0x2 PUSH2 0x1D6E JUMP JUMPDEST PUSH2 0x100 DUP3 ADD MLOAD TIMESTAMP LT PUSH2 0x1D9D JUMPI PUSH1 0x4 PUSH2 0x1D6E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1DC1 JUMPI PUSH1 0x6 PUSH2 0x1D6E JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD GT ISZERO PUSH2 0x1DEE JUMPI PUSH1 0x6 PUSH2 0x1D6E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD GT PUSH2 0x1E1C JUMPI PUSH1 0x5 PUSH2 0x1D6E JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1E2E PUSH2 0x36A6 JUMP JUMPDEST PUSH2 0x1E37 DUP3 PUSH2 0x1D4A JUMP JUMPDEST SWAP1 POP PUSH2 0x1E43 DUP3 DUP3 PUSH2 0x32CE JUMP JUMPDEST PUSH2 0xA97 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x3417 JUMP JUMPDEST PUSH2 0x1E59 PUSH2 0x36C6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH2 0x1E66 PUSH2 0x36C6 JUMP JUMPDEST DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1E75 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP8 MLOAD DUP4 LT ISZERO PUSH2 0x1050 JUMPI DUP4 DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1EA3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x1EC3 DUP8 DUP7 PUSH1 0x20 ADD MLOAD PUSH2 0x272E JUMP JUMPDEST SWAP2 POP PUSH2 0x1EEF DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1ED6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC34 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1EFB DUP6 DUP3 PUSH2 0x2740 JUMP JUMPDEST DUP7 DUP6 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0x1F0C JUMPI PUSH2 0x1050 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1E8B JUMP JUMPDEST PUSH2 0x1F1F PUSH2 0x36C6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1F2E PUSH2 0x36C6 JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1F3D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP9 MLOAD DUP5 LT ISZERO PUSH2 0x1988 JUMPI DUP5 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1F6B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP6 MLOAD PUSH2 0x1F87 SWAP1 DUP10 SWAP1 PUSH2 0x272E JUMP JUMPDEST SWAP3 POP PUSH2 0x1F9A DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1907 JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0x1FC6 DUP10 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1FAD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x64B JUMPI INVALID JUMPDEST DUP6 MLOAD PUSH1 0x1 ADD DUP7 MSTORE SWAP1 POP PUSH2 0x1FD9 DUP7 DUP3 PUSH2 0x2740 JUMP JUMPDEST DUP6 MLOAD DUP9 EQ ISZERO PUSH2 0x1FE7 JUMPI PUSH2 0x1988 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1F53 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x202E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP1 PUSH2 0x4264 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0x2066 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xB DUP2 MSTORE PUSH32 0x322E302E312D616C706861000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x20C7 JUMPI PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0x20C9 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x20E1 DUP3 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0xA0 ADD MLOAD PUSH2 0x3493 JUMP JUMPDEST PUSH2 0x20F3 DUP4 PUSH1 0x80 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x3493 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x18 DUP2 MSTORE PUSH32 0x4E454741544956455F5350524541445F52455155495245440000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP2 GT ISZERO PUSH2 0x214A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x2157 PUSH2 0x3677 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x216B DUP10 PUSH1 0xA0 ADD MLOAD DUP9 PUSH2 0x272E JUMP JUMPDEST SWAP4 POP PUSH2 0x217B DUP9 PUSH1 0xA0 ADD MLOAD DUP8 PUSH2 0x272E JUMP JUMPDEST SWAP3 POP PUSH2 0x218B DUP4 DUP10 PUSH1 0x80 ADD MLOAD PUSH2 0x3493 JUMP JUMPDEST PUSH2 0x2199 DUP6 DUP11 PUSH1 0xA0 ADD MLOAD PUSH2 0x3493 JUMP JUMPDEST GT PUSH2 0x21BB JUMPI DUP4 SWAP2 POP PUSH2 0x21B4 DUP9 PUSH1 0xA0 ADD MLOAD DUP10 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x298F JUMP JUMPDEST SWAP1 POP PUSH2 0x21D4 JUMP JUMPDEST DUP3 SWAP1 POP PUSH2 0x21D1 DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP4 PUSH2 0x298F JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH2 0x21DE DUP10 DUP4 PUSH2 0x29C4 JUMP JUMPDEST DUP6 MSTORE PUSH2 0x21EA DUP9 DUP3 PUSH2 0x29C4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP8 ADD DUP3 SWAP1 MSTORE DUP7 MLOAD MLOAD SWAP2 ADD MLOAD PUSH2 0x2202 SWAP2 SWAP1 PUSH2 0x272E JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MSTORE POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP5 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x2270 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54414B45525F414D4F554E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP4 ISZERO ISZERO PUSH2 0x22C8 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x2343 JUMPI PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2341 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x23CA JUMPI DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP7 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xD DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x494E56414C49445F54414B455200000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x23C8 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD ISZERO ISZERO PUSH2 0x2441 JUMPI PUSH2 0x23E8 DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP4 PUSH2 0x10A8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4F524445525F5349474E4154555245000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x243F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP JUMPDEST PUSH2 0x2454 DUP3 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x34B7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x524F554E44494E475F4552524F52000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x24AA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x24C1 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x350D JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE DUP7 DUP2 ADD MLOAD DUP8 MLOAD DUP5 MLOAD SWAP4 DUP6 ADD MLOAD DUP6 DUP5 ADD MLOAD PUSH1 0x60 DUP8 ADD MLOAD PUSH2 0x140 DUP13 ADD MLOAD PUSH2 0x160 DUP14 ADD MLOAD SWAP7 MLOAD DUP12 SWAP9 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP8 DUP9 AND SWAP9 SWAP8 SWAP1 SWAP7 AND SWAP7 PUSH32 0xDE19F18E1B56E6EADA7ED95CCA8398B602BE32F5864640537EE9A9A3532BB29D SWAP7 PUSH2 0x2543 SWAP7 DUP16 SWAP7 SWAP2 SWAP6 SWAP1 SWAP5 SWAP2 SWAP4 SWAP1 SWAP3 SWAP1 PUSH2 0x40E5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x2565 DUP8 PUSH2 0x140 ADD MLOAD PUSH2 0x27A2 JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV SWAP3 POP PUSH2 0x257C DUP7 PUSH2 0x140 ADD MLOAD PUSH2 0x27A2 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 SWAP5 DIV SWAP6 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x260B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x25E0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x260B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x25EE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2634 DUP8 PUSH2 0x140 ADD MLOAD DUP5 DUP10 PUSH1 0x0 ADD MLOAD DUP10 PUSH1 0x0 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x140 DUP7 ADD MLOAD DUP7 MLOAD DUP9 MLOAD DUP7 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x2652 SWAP4 SWAP3 DUP7 SWAP3 SWAP1 SWAP2 PUSH2 0x351C JUMP JUMPDEST PUSH2 0x266C DUP8 PUSH2 0x140 ADD MLOAD DUP5 DUP10 PUSH1 0x0 ADD MLOAD DUP9 DUP9 PUSH1 0x40 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x268A DUP2 PUSH1 0x1 DUP10 PUSH1 0x0 ADD MLOAD DUP11 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x26A8 DUP2 PUSH1 0x1 DUP9 PUSH1 0x0 ADD MLOAD DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP8 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x26FA JUMPI PUSH2 0x26F5 DUP2 PUSH1 0x1 DUP8 DUP11 PUSH1 0x40 ADD MLOAD PUSH2 0x26F0 DUP10 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP11 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x350D JUMP JUMPDEST PUSH2 0x351C JUMP JUMPDEST PUSH2 0x24AA JUMP JUMPDEST PUSH2 0x2714 DUP2 PUSH1 0x1 DUP8 DUP11 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x24AA DUP2 PUSH1 0x1 DUP8 DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x273A JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x274E SWAP2 SWAP1 PUSH2 0x350D JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2764 SWAP2 SWAP1 PUSH2 0x350D JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x277D SWAP2 SWAP1 PUSH2 0x350D JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2796 SWAP2 SWAP1 PUSH2 0x350D JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x2828 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP DUP2 MLOAD DUP3 SWAP1 PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x283B JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH1 0x0 NOT ADD SWAP1 SWAP3 MSTORE POP PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x28E1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x2973 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH2 0x2982 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x35C3 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x13 NOT ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29A4 PUSH2 0x299E DUP6 DUP5 PUSH2 0x3493 JUMP JUMPDEST DUP5 PUSH2 0x3660 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x29BB JUMPI DUP2 PUSH2 0x29BD JUMP JUMPDEST DUP3 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x29CC PUSH2 0x36C6 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH2 0x29E8 SWAP2 DUP5 SWAP2 PUSH2 0x298F JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xA0 DUP5 ADD MLOAD PUSH1 0xC0 DUP6 ADD MLOAD PUSH2 0x2A04 SWAP3 SWAP2 SWAP1 PUSH2 0x298F JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0xA0 DUP5 ADD MLOAD PUSH1 0xE0 DUP6 ADD MLOAD PUSH2 0x2A23 SWAP3 SWAP2 SWAP1 PUSH2 0x298F JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x2A41 DUP7 PUSH2 0x140 ADD MLOAD PUSH2 0x27A2 JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV SWAP3 POP PUSH2 0x2A58 DUP7 PUSH2 0x160 ADD MLOAD PUSH2 0x27A2 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 SWAP5 DIV SWAP6 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2AE7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2ABC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2AE7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2ACA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2B08 DUP7 PUSH2 0x140 ADD MLOAD DUP5 DUP9 PUSH1 0x0 ADD MLOAD DUP9 DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x2B22 DUP7 PUSH2 0x160 ADD MLOAD DUP4 DUP8 DUP10 PUSH1 0x0 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x2B3C DUP2 PUSH1 0x1 DUP9 PUSH1 0x0 ADD MLOAD DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x40 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST PUSH2 0x2B52 DUP2 PUSH1 0x1 DUP8 DUP10 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x60 ADD MLOAD PUSH2 0x351C JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x446F6D61696E536570617261746F72286164647265737320636F6E7472616374 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x21 ADD SWAP1 POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2BF1 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2BD2 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 ADDRESS PUSH13 0x1000000000000000000000000 MUL DUP4 DUP4 ADD MSTORE DUP5 MLOAD PUSH1 0x14 DUP2 DUP6 SUB ADD DUP2 MSTORE PUSH1 0x34 SWAP1 SWAP4 ADD SWAP5 DUP6 SWAP1 MSTORE DUP3 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2C70 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2C51 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 DUP4 DUP4 ADD MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP5 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP5 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP5 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP5 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP5 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP5 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP5 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP5 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP5 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP5 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP5 ADD MSTORE PUSH32 0x62797465732074616B65724173736574446174612C0000000000000000000000 PUSH2 0x116 DUP5 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12B DUP5 ADD MSTORE DUP5 MLOAD DUP1 DUP5 SUB PUSH2 0x10C ADD DUP2 MSTORE PUSH2 0x12C SWAP1 SWAP4 ADD SWAP5 DUP6 SWAP1 MSTORE DUP3 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2EF3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2ED4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP11 PUSH1 0xC0 ADD MLOAD DUP12 PUSH1 0xE0 ADD MLOAD DUP13 PUSH2 0x100 ADD MLOAD DUP14 PUSH2 0x120 ADD MLOAD DUP15 PUSH2 0x140 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2F8C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2F6D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2FEF JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2FD0 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP16 PUSH2 0x160 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3054 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3035 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x30B7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3098 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP14 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP13 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP12 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP11 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP13 POP POP POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3213 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x31F4 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x0 NOT PUSH1 0x20 SWAP5 DUP6 SUB PUSH2 0x100 EXP ADD SWAP1 DUP2 AND SWAP1 NOT SWAP2 SWAP1 SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP5 SWAP1 SWAP3 ADD DUP5 SWAP1 SUB DUP5 KECCAK256 DUP5 DUP3 ADD SWAP10 SWAP1 SWAP10 MSTORE DUP4 DUP3 ADD SWAP8 SWAP1 SWAP8 MSTORE PUSH1 0x60 DUP4 ADD SWAP6 SWAP1 SWAP6 MSTORE POP PUSH1 0x80 DUP1 DUP3 ADD SWAP7 SWAP1 SWAP7 MSTORE DUP4 MLOAD DUP1 DUP3 SUB SWAP1 SWAP7 ADD DUP7 MSTORE PUSH1 0xA0 ADD SWAP3 DUP4 SWAP1 MSTORE POP POP DUP3 MLOAD SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x329C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x327D JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x332D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x33A8 JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x33A6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP JUMPDEST PUSH2 0x33B0 PUSH2 0x20A0 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F4D414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP2 AND EQ PUSH2 0x663 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0xB1AD640E9E79B6FDBC3C415DC2914AB54E753D2971F51EAB910F7AA317A3163A SWAP3 PUSH2 0x3487 SWAP3 SWAP1 SWAP2 SWAP1 PUSH2 0x4220 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MUL DUP4 ISZERO DUP1 PUSH2 0x34AF JUMPI POP DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x34AC JUMPI INVALID JUMPDEST DIV EQ JUMPDEST ISZERO ISZERO PUSH2 0x29BD JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x34C6 JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x34DB JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x3504 JUMP JUMPDEST PUSH2 0x34FA PUSH2 0x34EB DUP4 PUSH3 0xF4240 PUSH2 0x3493 JUMP JUMPDEST PUSH2 0x34F5 DUP9 DUP8 PUSH2 0x3493 JUMP JUMPDEST PUSH2 0x3660 JUMP JUMPDEST PUSH2 0x3E8 DUP2 GT SWAP4 POP SWAP1 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x29BD JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 DUP3 GT ISZERO PUSH2 0x2B52 JUMPI POP PUSH1 0xFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 MLOAD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 DUP2 SWAP1 PUSH4 0xA85E59E4 SWAP1 PUSH2 0x3589 SWAP1 DUP10 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x41F3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x35A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x35B7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x364D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x710 SWAP2 SWAP1 PUSH2 0x4253 JUMP JUMPDEST POP POP ADD PUSH1 0x14 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x366E JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x368C PUSH2 0x36C6 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3699 PUSH2 0x36C6 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29BD DUP3 CALLDATALOAD PUSH2 0x4349 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x370C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x371F PUSH2 0x371A DUP3 PUSH2 0x42FC JUMP JUMPDEST PUSH2 0x42D5 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x375D JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3747 DUP9 DUP3 PUSH2 0x38A1 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3731 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3778 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3786 PUSH2 0x371A DUP3 PUSH2 0x42FC JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x375D JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x37AE DUP9 DUP3 PUSH2 0x38F0 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3798 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x37D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x37E3 PUSH2 0x371A DUP3 PUSH2 0x42FC JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x3808 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x375D JUMPI DUP2 PUSH2 0x381E DUP9 DUP3 PUSH2 0x384C JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x380B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29BD DUP3 CALLDATALOAD PUSH2 0x4355 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29BD DUP3 MLOAD PUSH2 0x4355 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29BD DUP3 CALLDATALOAD PUSH2 0x435A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x386A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3882 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x389A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x38B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x38C0 PUSH2 0x371A DUP3 PUSH2 0x431D JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x38DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x38E7 DUP4 DUP3 DUP5 PUSH2 0x436E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3903 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x390E PUSH2 0x180 PUSH2 0x42D5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x391C DUP5 DUP5 PUSH2 0x36EF JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x392D DUP5 DUP5 DUP4 ADD PUSH2 0x36EF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x3941 DUP5 DUP3 DUP6 ADD PUSH2 0x36EF JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x3955 DUP5 DUP3 DUP6 ADD PUSH2 0x36EF JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x3969 DUP5 DUP3 DUP6 ADD PUSH2 0x384C JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x397D DUP5 DUP3 DUP6 ADD PUSH2 0x384C JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x3991 DUP5 DUP3 DUP6 ADD PUSH2 0x384C JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x39A5 DUP5 DUP3 DUP6 ADD PUSH2 0x384C JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x39BA DUP5 DUP3 DUP6 ADD PUSH2 0x384C JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x39D0 DUP5 DUP3 DUP6 ADD PUSH2 0x384C JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x39F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x39FE DUP5 DUP3 DUP6 ADD PUSH2 0x38A1 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3A20 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3A2C DUP5 DUP3 DUP6 ADD PUSH2 0x38A1 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29BD DUP3 CALLDATALOAD PUSH2 0x435D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x29BD DUP3 MLOAD PUSH2 0x435D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x29A4 DUP5 DUP5 PUSH2 0x36EF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3A82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3A8E DUP6 DUP6 PUSH2 0x36EF JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3A9F DUP6 DUP3 DUP7 ADD PUSH2 0x36EF JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3ABC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3AC8 DUP6 DUP6 PUSH2 0x36EF JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3A9F DUP6 DUP3 DUP7 ADD PUSH2 0x3834 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3AEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B02 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x29A4 DUP5 DUP3 DUP6 ADD PUSH2 0x3767 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3B23 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B46 DUP7 DUP3 DUP8 ADD PUSH2 0x3767 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B6F DUP7 DUP3 DUP8 ADD PUSH2 0x37C4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3B8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B98 DUP7 DUP3 DUP8 ADD PUSH2 0x36FB JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3BB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3BCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3BDA DUP7 DUP3 DUP8 ADD PUSH2 0x3767 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3B6F DUP7 DUP3 DUP8 ADD PUSH2 0x384C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3BFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x29A4 DUP5 DUP5 PUSH2 0x3840 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3C1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x29A4 DUP5 DUP5 PUSH2 0x384C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3C3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3A8E DUP6 DUP6 PUSH2 0x384C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3C5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3C68 DUP8 DUP8 PUSH2 0x384C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x3C79 DUP8 DUP3 DUP9 ADD PUSH2 0x36EF JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3C96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3CA2 DUP8 DUP3 DUP9 ADD PUSH2 0x3858 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3CC3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3CCF DUP7 DUP7 PUSH2 0x384C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3CE0 DUP7 DUP3 DUP8 ADD PUSH2 0x36EF JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3CFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3B98 DUP7 DUP3 DUP8 ADD PUSH2 0x38A1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3D1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x29A4 DUP5 DUP3 DUP6 ADD PUSH2 0x38F0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3D54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D6B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3D77 DUP8 DUP3 DUP9 ADD PUSH2 0x38F0 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D94 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DA0 DUP8 DUP3 DUP9 ADD PUSH2 0x38F0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3DBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DC9 DUP8 DUP3 DUP9 ADD PUSH2 0x38A1 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3DE6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DF2 DUP8 DUP3 DUP9 ADD PUSH2 0x38A1 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3E13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E36 DUP7 DUP3 DUP8 ADD PUSH2 0x38F0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3CE0 DUP7 DUP3 DUP8 ADD PUSH2 0x384C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x3E60 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3E6C DUP10 DUP10 PUSH2 0x384C JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x3E7D DUP10 DUP3 DUP11 ADD PUSH2 0x36EF JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EA6 DUP10 DUP3 DUP11 ADD PUSH2 0x3858 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3EC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3ED1 DUP10 DUP3 DUP11 ADD PUSH2 0x3858 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3EF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x29A4 DUP5 DUP5 PUSH2 0x3A39 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x29A4 DUP5 DUP5 PUSH2 0x3A45 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3F31 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3F3D DUP7 DUP7 PUSH2 0x3A39 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3F4E DUP7 DUP3 DUP8 ADD PUSH2 0x36EF JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x3B98 DUP7 DUP3 DUP8 ADD PUSH2 0x36EF JUMP JUMPDEST PUSH2 0x3F68 DUP2 PUSH2 0x4349 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x3F68 DUP2 PUSH2 0x4355 JUMP JUMPDEST PUSH2 0x3F68 DUP2 PUSH2 0x435A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3F8B DUP3 PUSH2 0x4345 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x3F9F DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x437A JUMP JUMPDEST PUSH2 0x3FA8 DUP2 PUSH2 0x43A6 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x3F68 DUP2 PUSH2 0x4363 JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x4025 DUP5 DUP3 PUSH2 0x3F77 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4038 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x3F77 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x404B PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x3F77 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x663 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x3F77 JUMP JUMPDEST DUP1 MLOAD PUSH2 0x120 DUP4 ADD SWAP1 PUSH2 0x4070 DUP5 DUP3 PUSH2 0x4014 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4083 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x4014 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x663 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0x3F77 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x40A8 DUP5 DUP3 PUSH2 0x40CE JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x40BB PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x3F77 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x663 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x3F68 DUP2 PUSH2 0x435D JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x3F5F JUMP JUMPDEST PUSH1 0xE0 DUP2 ADD PUSH2 0x40F3 DUP3 DUP11 PUSH2 0x3F5F JUMP JUMPDEST PUSH2 0x4100 PUSH1 0x20 DUP4 ADD DUP10 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x410D PUSH1 0x40 DUP4 ADD DUP9 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x411A PUSH1 0x60 DUP4 ADD DUP8 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x4127 PUSH1 0x80 DUP4 ADD DUP7 PUSH2 0x3F77 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xA0 DUP4 ADD MSTORE PUSH2 0x4139 DUP2 DUP6 PUSH2 0x3F80 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x414D DUP2 DUP5 PUSH2 0x3F80 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x3F6E JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4176 DUP3 DUP7 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x4183 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x3F5F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4195 DUP2 DUP5 PUSH2 0x3F80 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x41AC DUP3 DUP6 PUSH2 0x3F77 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x29A4 DUP2 DUP5 PUSH2 0x3F80 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x41CC DUP3 DUP8 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x41D9 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x40CE JUMP JUMPDEST PUSH2 0x41E6 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x3F77 JUMP JUMPDEST PUSH2 0x4195 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x3F77 JUMP JUMPDEST PUSH1 0x80 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4204 DUP2 DUP8 PUSH2 0x3F80 JUMP JUMPDEST SWAP1 POP PUSH2 0x4213 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x3F5F JUMP JUMPDEST PUSH2 0x41E6 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x3F5F JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4231 DUP2 DUP6 PUSH2 0x3F80 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x29A4 DUP2 DUP5 PUSH2 0x3F80 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x3FB5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x29BD DUP2 DUP5 PUSH2 0x3F80 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x20C9 DUP2 PUSH2 0x3FBE JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x4014 JUMP JUMPDEST PUSH2 0x120 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x405E JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x4097 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x20C9 DUP3 DUP5 PUSH2 0x3F77 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x42BB DUP3 DUP7 PUSH2 0x40CE JUMP JUMPDEST PUSH2 0x42C8 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x3F5F JUMP JUMPDEST PUSH2 0x29A4 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x3F5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x42F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x20C9 DUP3 PUSH2 0x4349 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4395 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x437D JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x663 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xc 0xdc BYTE DUP14 0xf8 0xfc RETURN MOD DUP13 SHR 0x2c SWAP5 SWAP10 0xb0 0x49 0x48 PUSH22 0xA807CFDD1D5F3D94484C3A4496B04E6C657870657269 PUSH14 0x656E74616CF50037000000000000 ", + "sourceMap": "894:607:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1188:42:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1188:42:4;;;;;;;;;;;;;;;;;;;;;;;;;13245:381:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13245:381:9;;;;;;;;;;;1278:42:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1278:42:4;;;;;;;;;;;;;;;;;1723:275:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1723:275:7;;;;;;;;;1017:50:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1017:50:3;;;;;;;;;;;;;;;;;1886:2557:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1886:2557:5;;;;;;;;;;;;;;;;;2141:10811:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2141:10811:9;;;;;;;;;;;;;;;;;24288:185;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24288:185:9;;;;;;;;;13920:393;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13920:393:9;;;;;;;;;1796:607:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1796:607:4;;;;;;;;;14686:395:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14686:395:9;;;;;;;;;1481:1017:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1481:1017:3;;;;;;;;;945:45:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;945:45:8;;;;;;;;;1222:493:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1222:493:9;;;;;;;;;1496:46:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1496:46:4;;;;;;;;;2228:233:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2228:233:7;;;;;;;;;1324:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1324:71:7;;;;;;;;;15469:1843:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15469:1843:9;;;;;;;;;1204:63:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1204:63:7;;;;;;;;;292:20:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;292:20:30;;;;;;;;;;;;2688:203:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2688:203:3;;;;;;;;;2826:6493:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2826:6493:7;;;;;;;;;22305:1848:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22305:1848:9;;;;;;;;;2720:1327:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2720:1327:4;;;;;;;;;1397:1380:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1397:1380:8;;;;;;;;;4874:2178:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4874:2178:4;;;;;;;;;;;;;;;;;4278:322;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4278:322:4;;;;;;;;;17769:1442:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17769:1442:9;;;;;;;;;19599:2245;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19599:2245:9;;;;;;;;;1042:36:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1042:36:8;;;;566:167:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;566:167:30;;;;;;;;;1097:46:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1097:46:2;;;;;;;;;;;;1188:42:4;;;;;;;;;;;;;:::o;13245:381:9:-;13433:9;13428:192;13452:6;:13;13448:1;:17;13428:192;;;13486:123;13513:6;13520:1;13513:9;;;;;;;;;;;;;;;;;;13540:21;13562:1;13540:24;;;;;;;;;;;;;;;;;;13582:10;13593:1;13582:13;;;;;;;;;;;;;;;;;;13486:9;:123::i;:::-;-1:-1:-1;13467:3:9;;13428:192;;;13245:381;;;;:::o;1278:42:4:-;;;;;;;;;;;;;;;:::o;1723:275:7:-;1869:41;1886:4;1892:6;1900:9;;1869:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1869:16:7;;-1:-1:-1;;;;;1869:41:7:i;:::-;1924:17;;;;;;;;;;;;;;;;;;1848:103;;;;;;-1:-1:-1;;;;;1848:103:7;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1961:15:7;;;;:9;:15;;;;;;;;-1:-1:-1;;;;;1961:23:7;;;;;;;;;;:30;;-1:-1:-1;;1961:30:7;1987:4;1961:30;;;1723:275::o;1017:50:3:-;;;;;;;;;;;;-1:-1:-1;;;;;1017:50:3;;:::o;1886:2557:5:-;2101:59;;:::i;:::-;2566:39;;:::i;:::-;2641:40;;:::i;:::-;2430:24;;;;;2402:25;;;;:52;;;;2492:24;;;2464:25;;;:52;2750:20;2608:23;2430:9;2608:12;:23::i;:::-;2566:65;;2684:24;2697:10;2684:12;:24::i;:::-;2641:67;;2773:26;:24;:26::i;:::-;2750:49;;2862:39;2879:9;2890:10;2862:16;:39::i;:::-;2978:195;3019:9;3042:10;3066:13;:41;;;3121:14;:42;;;2978:27;:195::i;:::-;3323:23;;:46;;;2957:216;;-1:-1:-1;3218:248:5;;3247:9;;3270:13;;3297:12;;3323:46;3443:13;3218:15;:248::i;:::-;3583:24;;;;;:47;;3476:253;;3505:10;;3529:14;;3557:12;;3583:47;3705:14;3476:15;:253::i;:::-;3773:205;3804:9;3827:12;3853:13;:23;;;3890:13;:41;;;3945:18;:23;;;3773:17;:205::i;:::-;3988:209;4019:10;4043:12;4069:14;:24;;;4107:14;:42;;;4163:18;:24;;;3988:17;:209::i;:::-;4266:134;4299:9;4322:10;4346:12;4372:18;4266:19;:134::i;:::-;1886:2557;;;;;;;;;:::o;2141:10811:9:-;2312:30;;:::i;:::-;6207:4;6201:11;;5428:23;6225:42;;;6633:4;6322:3;6301:25;;7320:59;;;7646:19;;6612:26;;;7626:40;;;7434:4;7759:23;;;7753:30;7729:22;;;7722:62;7855:23;;;7849:30;7825:22;;;7818:62;7958:23;;;7952:30;7928:22;;;7921:62;8073:4;8055:23;;8049:30;8025:22;;;8018:62;8173:4;8155:23;;8149:30;8125:22;;;8118:62;8273:4;8255:23;;8249:30;8225:22;;;8218:62;8371:4;8353:23;;8347:30;8323:22;;;8316:62;8470:5;8452:24;;8446:31;8421:23;;;8414:64;8575:5;8557:24;;8551:31;8526:23;;;8519:64;8663:5;8645:24;;8639:31;;8614:23;;;8607:64;;;8771:5;8753:24;;8747:31;8722:23;;;8715:64;8855:5;8982:74;;9144:24;9216:19;;8838:23;;;9420:34;;;5428:23;;6301:25;;;;6612:26;7412:27;;;;6612:26;;9482:22;;;;9264:23;;;;9340:4;9321:24;;9317:35;5401:24;9574:237;9597:13;9594:1;9591:20;9574:237;;;9667:19;;9647:40;;9736:4;9719:22;;;;9774:23;;;;9625:1;9618:9;9574:237;;;-1:-1:-1;;;;9921:31:9;;;9905:13;9886:33;;;9879:74;;;;10047:17;;10041:24;10113:19;;10317:34;;;9913:4;10379:22;;;;10161:23;;;;10237:4;10218:24;;10214:35;10486:1;10472:237;10495:13;10492:1;10489:20;10472:237;;;10565:19;;10545:40;;10634:4;10617:22;;;;10672:23;;;;10523:1;10516:9;10472:237;;;-1:-1:-1;;;10778:46:9;;;-1:-1:-1;11009:33:9;;;10879:4;10857:27;;;10984:59;;;11157:19;;11348:34;;;10857:27;;11410:22;;;;11205:23;;;;11157:19;11281:4;11262:24;;11258:35;-1:-1:-1;11489:237:9;11512:13;11509:1;11506:20;11489:237;;;11582:19;;11562:40;;11651:4;11634:22;;;;11689:23;;;;11540:1;11533:9;11489:237;;;11493:12;12257:3;12178:15;12124;12111:11;12107:33;12026:15;11941:7;11821:3;11791:543;12354:7;12374:205;;;;12597:1;12592:316;;;;12347:561;;12374:205;12419:1;12406:11;12399:22;12467:1;12462:2;12449:11;12445:20;12438:31;12515:1;12510:2;12497:11;12493:20;12486:31;12563:1;12558:2;12545:11;12541:20;12534:31;12374:205;;12592:316;12643:15;12637:22;12624:11;12617:43;12733:2;12716:15;12712:24;12706:31;12701:2;12688:11;12684:20;12677:61;12811:2;12794:15;12790:24;12784:31;12779:2;12766:11;12762:20;12755:61;12889:2;12872:15;12868:24;12862:31;12857:2;12844:11;12840:20;12833:61;12347:561;-1:-1:-1;;;;;;;;;;;;2141:10811:9;;;;;;:::o;24288:185::-;24381:9;24376:91;24400:6;:13;24396:1;:17;24376:91;;;24434:22;24446:6;24453:1;24446:9;;;;;;;;;;;;;;;;;;24434:11;:22::i;:::-;24415:3;;24376:91;;;24288:185;;:::o;13920:393::-;14114:9;14109:198;14133:6;:13;14129:1;:17;14109:198;;;14167:129;14200:6;14207:1;14200:9;;;;;;;;;;;;;;;;;;14227:21;14249:1;14227:24;;;;;;;;;;;;;;;;;;14269:10;14280:1;14269:13;;;;;;;;;;;;;;;;;;14167:15;:129::i;:::-;-1:-1:-1;14148:3:9;;14109:198;;1796:607:4;1867:20;2004:21;2048;1890:26;:24;:26::i;:::-;-1:-1:-1;;;;;2072:24:4;;;;;;:10;:24;;;;;;;;;;2229:23;;;;;;;;;;;;;;;;;;;1867:49;;-1:-1:-1;2035:1:4;2028:8;;;-1:-1:-1;2072:24:4;;-1:-1:-1;2185:29:4;;;2164:98;;;;-1:-1:-1;;;;;2164:98:4;;;;;;;;;;-1:-1:-1;;;;;;2302:24:4;;;;;;:10;:24;;;;;;;:40;;;2357:39;;;;;2329:13;;2357:39;;;;;;;;;;1796:607;;;;:::o;14686:395:9:-;14881:9;14876:199;14900:6;:13;14896:1;:17;14876:199;;;14934:130;14968:6;14975:1;14968:9;;;;;;;;;;;;;;;;;;14995:21;15017:1;14995:24;;;;;;;;;;;;;;;;;;15037:10;15048:1;15037:13;;;;;;;;;;;;;;;;;;14934:16;:130::i;:::-;-1:-1:-1;14915:3:9;;14876:199;;1481:1017:3;1732:25;460:5:30;;1732:25:3;;;;-1:-1:-1;;;;;460:5:30;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:30;;;;;;;;;1768:26:3;;;;;;;:12;:26;;;;;;;;;;1874:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1768:26:3;;;;-1:-1:-1;1826:34:3;;;;1805:99;;;;-1:-1:-1;;;;;1805:99:3;;;;;;;;;;-1:-1:-1;1952:13:3;;-1:-1:-1;;;;;;2095:27:3;;;2091:230;;2162:10;-1:-1:-1;;;;;2162:21:3;;:23;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2162:23:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2162:23:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2162:23:3;;;;;;;;;2273;;;;;;;;;;;;;;;;;2138:47;;-1:-1:-1;2224:31:3;;;;;;;;2199:111;;;;-1:-1:-1;;;;;2199:111:3;;;;;;;;;;;2091:230;2380:26;;;;;;;:12;:26;;;;;;;:39;;-1:-1:-1;;2380:39:3;-1:-1:-1;;;;;2380:39:3;;;;;2434:57;;;;;2380:26;;2462:13;;2477;;2434:57;;;;;;;;;;1481:1017;;;;;;:::o;945:45:8:-;;;;;;;;;;;;;;;:::o;1222:493:9:-;1392:30;;:::i;:::-;1452:95;1475:5;1494:20;1528:9;1452;:95::i;:::-;1438:109;;1616:20;1578:11;:34;;;:58;1650:20;;;;;;;;;;;;;;;;;;1557:123;;;;;;;-1:-1:-1;;;;;1557:123:9;;;;;;;;;;-1:-1:-1;1222:493:9;;;;;:::o;1496:46:4:-;;;;;;;;;;;;;:::o;2228:233:7:-;2354:14;2371:26;:24;:26::i;:::-;-1:-1:-1;;;;;2407:25:7;;;;;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;:47;;-1:-1:-1;;2407:47:7;;;;;;;;;;-1:-1:-1;2228:233:7:o;1324:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15469:1843:9:-;15646:35;;:::i;:::-;15697:27;15771:9;16157:37;16348:36;;:::i;:::-;15727:6;15734:1;15727:9;;;;;;;;;;;;;;;;;;:24;;;15697:54;;15783:1;15771:13;;15766:1507;15790:6;:13;15786:1;:17;15766:1507;;;16060:14;16033:6;16040:1;16033:9;;;;;;;;;;;;;;;;;;:24;;:41;;;;16197:70;16205:20;16227:16;:39;;;16197:7;:70::i;:::-;16157:110;;16387:128;16414:6;16421:1;16414:9;;;;;;;;;;;;;;;;;;16441:29;16488:10;16499:1;16488:13;;;;;;;;;16387:128;16840:21;;16910:1;16901:11;16878:35;;16348:167;-1:-1:-1;17011:51:9;17026:16;16348:167;17011:14;:51::i;:::-;17203:20;17160:16;:39;;;:63;17156:107;;;17243:5;;17156:107;15805:3;;;;;15766:1507;;;15469:1843;;;;;;;;;:::o;1204:63:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;292:20:30:-;;;-1:-1:-1;;;;;292:20:30;;:::o;2688:203:3:-;2830:26;;2778:7;2830:26;;;:12;:26;;;;;;-1:-1:-1;;;;;2830:26:3;;2688:203::o;2826:6493:7:-;2981:12;3282:27;3416:7;3433:9;3452;3471:17;7093;3162:1;3143:9;:16;:20;3177:30;;;;;;;;;;;;;;;;;;3122:95;;;;;;;-1:-1:-1;;;;;3122:95:7;;;;;;;;;;;3332:22;3344:9;3332:11;:22::i;:::-;-1:-1:-1;;;3326:29:7;;3312:44;;;;;;;;;;3282:74;-1:-1:-1;3838:21:7;3821:13;:38;;;;;;;;;3817:5154;;;3882:17;;;;;;;;;;;;;;;;3875:25;;-1:-1:-1;;;;;3875:25:7;;;;3882:17;3875:25;;;;3817:5154;4182:21;4165:13;:38;;;;;;;;;4161:4810;;;4244:16;;4283:17;;;;;;;;;;;;;;;;;;4244:21;4219:95;;;;-1:-1:-1;;;;;4219:95:7;;;;;;;;;;-1:-1:-1;4338:5:7;;-1:-1:-1;4357:14:7;;4161:4810;4444:20;4427:13;:37;;;;;;;;;4423:4548;;;4505:16;;4545:18;;;;;;;;;;;;;;;;;;4525:2;4505:22;4480:97;;;;-1:-1:-1;;;;;4480:97:7;;;;;;;;;;;4601:9;4611:1;4601:12;;;;;;;;;;;;;;-1:-1:-1;;;4601:12:7;;;;;;4595:19;;-1:-1:-1;4632:25:7;4644:9;4655:1;4632:11;:25::i;:::-;4628:29;;4675:26;4687:9;4698:2;4675:11;:26::i;:::-;4671:30;;4727:24;4737:4;4743:1;4746;4749;4727:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4727:24:7;;-1:-1:-1;;4727:24:7;;-1:-1:-1;;;;;4775:19:7;;;;;;;;-1:-1:-1;4727:24:7;-1:-1:-1;4808:14:7;;-1:-1:-1;4808:14:7;4423:4548;4899:21;4882:13;:38;;;;;;;;;4878:4093;;;4961:16;;5001:18;;;;;;;;;;;;;;;;;;4981:2;4961:22;4936:97;;;;-1:-1:-1;;;;;4936:97:7;;;;;;;;;;;5057:9;5067:1;5057:12;;;;;;;;;;;;;;-1:-1:-1;;;5057:12:7;;;;;;5051:19;;-1:-1:-1;5088:25:7;5100:9;5111:1;5088:11;:25::i;:::-;5084:29;;5131:26;5143:9;5154:2;5131:11;:26::i;:::-;5127:30;;5183:153;5237:20;;;;;;;;;;;;;;;;;;5259:4;5220:44;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5220:44:7;;;;;-1:-1:-1;5220:44:7;;;26:21:-1;;;6:49;;5220:44:7;;;;;;;5210:55;;5220:44;;-1:-1:-1;5220:44:7;;;-1:-1:-1;5210:55:7;;;;;5220:44;5210:55;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5210:55:7;;;;;;;;;;;;-1:-1:-1;5183:153:7;;;;;;;;;;-1:-1:-1;5210:55:7;-1:-1:-1;5283:1:7;;5302;;-1:-1:-1;5321:1:7;;5183:153;;4878:4093;5997:20;5980:13;:37;;;;;;;;;5976:2995;;;6058:16;;6097:17;;;;;;;;;;;;;;;;;;6058:21;6033:95;;;;-1:-1:-1;;;;;6033:95:7;;;;;;;;;;-1:-1:-1;;;;;;6152:20:7;;6162:10;6152:20;;-1:-1:-1;6186:14:7;;5976:2995;6370:20;6353:13;:37;;;;;;;;;6349:2622;;;6416:49;;;;;-1:-1:-1;;;;;6416:32:7;;;;;:49;;6449:4;;6455:9;;6416:49;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6416:49:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6416:49:7;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6416:49:7;;;;;;;;;6406:59;-1:-1:-1;6479:14:7;;6349:2622;6992:23;6975:13;:40;;;;;;;;;6971:2000;;;7113:25;7128:9;7113:14;:25::i;:::-;-1:-1:-1;;;;;7210:25:7;;;;;;;:17;:25;;;;;;;;:36;;;;;;;;;;7093:45;;-1:-1:-1;7210:36:7;;7209:37;7205:88;;;7273:5;7266:12;;;;7205:88;7316:125;;;;;-1:-1:-1;;;;;7316:38:7;;;;;:125;;7372:4;;7394:6;;7418:9;;7316:125;;;;6971:2000;7577:23;7560:13;:40;;;;;;;;;7556:1415;;;7626:15;;;;:9;:15;;;;;;;;-1:-1:-1;;;;;7626:23:7;;;;;;;;;;;;;-1:-1:-1;7663:14:7;;7556:1415;8243:20;8226:13;:37;;;;;;;;;8222:749;;;8304:16;;8344:18;;;;;;;;;;;;;;;;;;8324:2;8304:22;8279:97;;;;-1:-1:-1;;;;;8279:97:7;;;;;;;;;;;8400:9;8410:1;8400:12;;;;;;;;;;;;;;-1:-1:-1;;;8400:12:7;;;;;;8394:19;;-1:-1:-1;8431:25:7;8443:9;8454:1;8431:11;:25::i;:::-;8427:29;;8474:26;8486:9;8497:2;8474:11;:26::i;:::-;8580:23;;;;;;;;;;;;;;;;;;;;8563:47;;8470:30;;-1:-1:-1;8526:156:7;;8580:23;;8605:4;;8563:47;;;;8580:23;;8563:47;8580:23;36:153:-1;;8222:749:7;8860:23;8843:13;:40;;;;;;;;;8839:132;;;8909:15;;;;:9;:15;;;;;;;;-1:-1:-1;;;;;8909:23:7;;;;;;;;;;;;;-1:-1:-1;8946:14:7;;8839:132;9290:21;;;;;;;;;;;;;;;;9283:29;;-1:-1:-1;;;;;9283:29:7;;;;9290:21;9283:29;;;;2826:6493;;;;;;;;;;;;:::o;22305:1848:9:-;22488:35;;:::i;:::-;22539:27;22609:9;22999:37;23305;23591:36;;:::i;:::-;22569:6;22576:1;22569:9;;;;;;;;;;;;;;;;;;:24;;;22539:54;;22621:1;22609:13;;22604:1510;22628:6;:13;22624:1;:17;22604:1510;;;22903:14;22876:6;22883:1;22876:9;;;;;;;;;;;;;;;;;;;:24;;:41;23069:39;;23039:70;;23047:20;;23039:7;:70::i;:::-;22999:110;;23345:165;23379:6;23386:1;23379:9;;;;;;;;;;;;;;;;;;:26;;;23423:6;23430:1;23423:9;;;;;;;;;;;;;;;;;;:26;;;23467:29;23345:16;:165::i;:::-;23305:205;;23630:135;23664:6;23671:1;23664:9;;;;;;;;;;;;;;;;;;23691:29;23738:10;23749:1;23738:13;;;;;;;;;23630:135;23591:174;;23850:51;23865:16;23883:17;23850:14;:51::i;:::-;24001:39;;:63;;23997:107;;;24084:5;;23997:107;22643:3;;;;;22604:1510;;;22305:1848;;;;;;;;;;:::o;2720:1327:4:-;2875:30;;:::i;:::-;2949:26;;:::i;:::-;3039:20;3143:33;3259:30;2978:19;2991:5;2978:12;:19::i;:::-;2949:48;;3062:26;:24;:26::i;:::-;3039:49;;3179:70;3187:5;:22;;;3211:9;:37;;;3179:7;:70::i;:::-;3143:106;;3292:55;3299:20;3321:25;3292:6;:55::i;:::-;3259:88;;3386:186;3415:5;3434:9;3457:12;3483:20;3517:22;3553:9;3386:15;:186::i;:::-;3642:51;3663:5;3670:22;3642:20;:51::i;:::-;3628:65;;3746:181;3777:5;3796:12;3822:9;:19;;;3855:9;:37;;;3906:11;3746:17;:181::i;:::-;3966:45;3978:5;3985:12;3999:11;3966;:45::i;1397:1380:8:-;1604:21;;1653:18;;;;;;;;;;;;;;;;;1730:23;;-1:-1:-1;;;;;1604:21:8;:35;1583:98;;;;-1:-1:-1;;;;;1583:98:8;;;;;;;;;;;1804:4;1823:6;1843:4;1861;;1766:109;;;;;;-1:-1:-1;;;;;1766:109:8;-1:-1:-1;;;;;1766:109:8;;;;;;;;-1:-1:-1;;;;;1766:109:8;-1:-1:-1;;;;;1766:109:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1766:109:8;;;1756:120;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1756:120:8;;;;;;;;;;;;-1:-1:-1;1963:29:8;;;:12;:29;;;;;;2006:15;;;;;;;;;;;;;;;;;1756:120;-1:-1:-1;1756:120:8;-1:-1:-1;;1963:29:8;;1962:30;;-1:-1:-1;1941:90:8;;;;-1:-1:-1;;;;;1941:90:8;;;;;;;;;;-1:-1:-1;;;;;;2117:20:8;;2127:10;2117:20;2113:309;;2212:52;2229:15;2246:6;2254:9;;2212:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2212:16:8;;-1:-1:-1;;;;;2212:52:8:i;:::-;2282:20;;;;;;;;;;;;;;;;;;2187:129;;;;;;-1:-1:-1;;;;;2187:129:8;;;;;;;;;;-1:-1:-1;2381:21:8;:30;;-1:-1:-1;;2381:30:8;-1:-1:-1;;;;;2381:30:8;;;;;2113:309;2463:29;;;;:12;:29;;;;;;;:36;;-1:-1:-1;;2463:36:8;2495:4;2463:36;;;2530:32;2538:4;;2557;;;;2530:32;2557:4;;;;2530:32;;;;;;;;;;;;;;;;;;;;;2576:16;;;;;;;;;;;;;;;;;;-1:-1:-1;2509:93:8;;;-1:-1:-1;2509:93:8;;;;-1:-1:-1;;;;;2509:93:8;;;;;;;;;;-1:-1:-1;;2736:21:8;:34;;-1:-1:-1;;2736:34:8;;;-1:-1:-1;;;;;;1397:1380:8:o;4874:2178:4:-;4961:26;;:::i;:::-;5059:19;5072:5;5059:12;:19::i;:::-;5037;;;:41;5380:22;;;;:27;5376:157;;;5453:38;5447:45;5423:69;;;;5506:16;;5376:157;5846:22;;;;:27;5842:157;;;5919:38;5913:45;;5842:157;6069:27;;;;6050:15;:46;6046:157;;6142:19;6136:26;;6046:157;6272:19;;;;;6262:30;;;;:9;:30;;;;;;;;;6258:143;;;6338:21;6332:28;;6258:143;6447:10;;;;6425:18;;-1:-1:-1;;;;;6414:30:4;;;;;:10;:30;;;;;;:43;6410:156;;;6503:21;6497:28;;6410:156;6686:19;;;;;6679:27;;;;:6;:27;;;;;;;;;6639:37;;;:67;;;6761:22;;;;-1:-1:-1;6716:179:4;;6829:24;6823:31;;6716:179;6998:20;6968:51;;4874:2178;;;;:::o;4278:322::-;4386:26;;:::i;:::-;4415:19;4428:5;4415:12;:19::i;:::-;4386:48;;4473:35;4491:5;4498:9;4473:17;:35::i;:::-;4545:48;4566:5;4573:9;:19;;;4545:20;:48::i;17769:1442:9:-;17953:35;;:::i;:::-;18004:27;18074:9;18460:37;18651:36;;:::i;:::-;18034:6;18041:1;18034:9;;;;;;;;;;;;;;;;;;:24;;;18004:54;;18086:1;18074:13;;18069:1103;18093:6;:13;18089:1;:17;18069:1103;;;18363:14;18336:6;18343:1;18336:9;;;;;;;;;;;;;;;;;;:24;;:41;;;;18500:70;18508:20;18530:16;:39;;;18500:7;:70::i;:::-;18460:110;;18690:135;18724:6;18731:1;18724:9;;;;;;;;;;;;;;;;;;18751:29;18798:10;18809:1;18798:13;;;;;;;;;18690:135;18651:174;;18910:51;18925:16;18943:17;18910:14;:51::i;:::-;19102:20;19059:16;:39;;;:63;19055:107;;;19142:5;;19055:107;18108:3;;;;;18069:1103;;19599:2245;19775:35;;:::i;:::-;19826:27;19896:9;20286:37;20592;20878:36;;:::i;:::-;19856:6;19863:1;19856:9;;;;;;;;;;;;;;;;;;:24;;;19826:54;;19908:1;19896:13;;19891:1914;19915:6;:13;19911:1;:17;19891:1914;;;20190:14;20163:6;20170:1;20163:9;;;;;;;;;;;;;;;;;;;:24;;:41;20356:39;;20326:70;;20334:20;;20326:7;:70::i;:::-;20286:110;;20632:165;20666:6;20673:1;20666:9;;;;;;;;;20632:165;20592:205;;20917:128;20944:6;20951:1;20944:9;;;;;;;;;;;;;;;;;;20971:29;21018:10;21029:1;21018:13;;;;;;;;;20917:128;21370:21;;21440:1;21431:11;21408:35;;20878:167;-1:-1:-1;21541:51:9;21556:16;20878:167;21541:14;:51::i;:::-;21692:39;;:63;;21688:107;;;21775:5;;21688:107;19930:3;;;;;19891:1914;;1042:36:8;;;-1:-1:-1;;;;;1042:36:8;;:::o;566:167:30:-;460:5;;-1:-1:-1;;;;;460:5:30;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:30;;;;;;;;;-1:-1:-1;;;;;662:22:30;;;658:69;;700:5;:16;;-1:-1:-1;;700:16:30;-1:-1:-1;;;;;700:16:30;;;;;658:69;566:167;:::o;1097:46:2:-;;;;;;;;;;;;;;;;;;;:::o;3221:241:8:-;3352:21;;3304:7;;;;-1:-1:-1;;;;;3352:21:8;:35;:72;;3403:21;;-1:-1:-1;;;;;3403:21:8;3352:72;;;3390:10;3352:72;3327:97;3221:241;-1:-1:-1;;3221:241:8:o;4613:1073:5:-;5567:64;5575:9;:26;;;5603:10;:27;;;5567:7;:64::i;:::-;5487;5495:9;:26;;;5523:10;:27;;;5487:7;:64::i;:::-;5645:24;;;;;;;;;;;;;;;;;;-1:-1:-1;5487:144:5;5466:213;;;;-1:-1:-1;;;;;5466:213:5;;;;;;;;;;;4613:1073;;:::o;6422:3469::-;6694:59;;:::i;:::-;7650:37;7768:38;7889:34;7933:35;7690:68;7698:9;:26;;;7726:31;7690:7;:68::i;:::-;7650:108;;7809:70;7817:10;:27;;;7846:32;7809:7;:70::i;:::-;7768:111;;8078:68;8086:30;8118:10;:27;;;8078:7;:68::i;:::-;7995:67;8003:29;8034:10;:27;;;7995:7;:67::i;:::-;:151;7978:1238;;8268:29;8239:58;;8507:164;8541:10;:27;;;8586:10;:27;;;8631:26;8507:16;:164::i;:::-;8477:194;;7978:1238;;;8802:30;8772:60;;9040:165;9074:10;:27;;;9119:10;:27;;;9164;9040:16;:165::i;:::-;9011:194;;7978:1238;9301:93;9335:9;9358:26;9301:20;:93::i;:::-;9275:119;;9482:95;9516:10;9540:27;9482:20;:95::i;:::-;9455:24;;;;:122;;;9700:23;;:46;9760:47;;;9679:138;;9700:46;9679:7;:138::i;:::-;9631:45;;;:186;6422:3469;;;;;;;;;;:::o;9315:1637:4:-;9681:21;;9747:16;;;;;;;;;;;;;;;;;;9681:52;;9712:20;9681:52;9660:113;;;;-1:-1:-1;;;;;9660:113:4;;;;;;;;;;-1:-1:-1;9888:20:4;;;;;;;;;;;;;;;;;9849:25;;;9828:90;;;;-1:-1:-1;;;;;9828:90:4;;;;;;;;;;-1:-1:-1;9990:19:4;;;;-1:-1:-1;;;;;9990:33:4;;9986:168;;10064:19;;;;10115:14;;;;;;;;;;;;;-1:-1:-1;10115:14:4;;;;-1:-1:-1;;;;;10064:33:4;10087:10;10064:33;10039:104;;;;-1:-1:-1;;;;;10039:104:4;;;;;;;;;;;9986:168;10224:18;;;;-1:-1:-1;;;;;10224:32:4;;10220:167;;10319:12;-1:-1:-1;;;;;10297:34:4;:5;:18;;;-1:-1:-1;;;;;10297:34:4;;10349:13;;;;;;;;;;;;;;;;;;10272:104;;;;;;;-1:-1:-1;;;;;10272:104:4;;;;;;;;;;;10220:167;10469:37;;;;:42;10465:221;;;10552:68;10569:9;:19;;;10590:5;:18;;;10610:9;10552:16;:68::i;:::-;10638:23;;;;;;;;;;;;;;;;;;10527:148;;;;;;-1:-1:-1;;;;;10527:148:4;;;;;;;;;;;10465:221;10758:149;10791:22;10831:5;:22;;;10871:5;:22;;;10758:15;:149::i;:::-;10921:14;;;;;;;;;;;;;;;;;;10757:150;10736:209;;;;-1:-1:-1;;;;;10736:209:4;;;;;;;;;;;9315:1637;;;;;;:::o;7372:768::-;7650:72;7658:27;7687:11;:34;;;7650:7;:72::i;:::-;7630:17;;;;:6;:17;;;;;;;;;:92;;;;7835:25;;;;7777:18;;7874:34;;7922;;;;7970:24;;;;8008;;;;8069:20;;;;8103;;;;7759:374;;7630:17;;-1:-1:-1;;;;;7759:374:4;;;;;;;;;;;;;7809:12;;7874:34;;7922;;7970:24;;8008;;8103:20;7759:374;;;;;;;;;;7372:768;;;;;:::o;3650:2652:6:-;3898:27;3982:28;4068:25;3934:37;3946:9;:24;;;3934:11;:37::i;:::-;-1:-1:-1;;;3928:44:6;;3898:74;;4019:38;4031:10;:25;;;4019:11;:38::i;:::-;4096:14;4068:42;;;;;;;;-1:-1:-1;;4068:42:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4013:45:6;;;;-1:-1:-1;4068:42:6;;4096:14;4068:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4154:237;4188:9;:24;;;4226:21;4261:9;:22;;;4297:10;:23;;;4334:18;:24;;;:47;;;4154:20;:237::i;:::-;4435:25;;;;4510:23;;4547:22;;4583:23;;:46;;;4401:238;;4435:25;4474:22;;4510:23;;4401:20;:238::i;:::-;4649:224;4683:9;:24;;;4721:21;4756:9;:22;;;4792:12;4818:18;:45;;;4649:20;:224::i;:::-;4906:211;4940:12;1334:1;4992:9;:22;;;5028:9;:29;;;5071:18;:23;;;:36;;;4906:20;:211::i;:::-;5127:214;5161:12;1334:1;5213:10;:23;;;5250:10;:30;;;5294:18;:24;;;:37;;;5127:20;:214::i;:::-;5411:10;:30;;;-1:-1:-1;;;;;5378:63:6;:9;:29;;;-1:-1:-1;;;;;5378:63:6;;5374:922;;;5457:331;5495:12;1334:1;5555:12;5585:9;:29;;;5632:142;5661:18;:23;;;:36;;;5719:18;:24;;;:37;;;5632:7;:142::i;:::-;5457:20;:331::i;:::-;5374:922;;;5819:225;5857:12;1334:1;5917:12;5947:9;:29;;;5994:18;:23;;;:36;;;5819:20;:225::i;:::-;6058:227;6096:12;1334:1;6156:12;6186:10;:30;;;6234:18;:24;;;:37;;;6058:20;:227::i;418:146:31:-;498:7;528:6;;;;521:14;;;;-1:-1:-1;552:5:31;;;418:146::o;1307:648:18:-;1500:39;;1541:40;;1492:90;;1500:39;1492:7;:90::i;:::-;1450:132;;1642:39;;;;;1683:40;;;;1634:90;;1642:39;1634:7;:90::i;:::-;1592:39;;;:132;1774:29;;;;;1805:30;;;;1766:70;;1774:29;1766:7;:70::i;:::-;1734:29;;;:102;1886:29;;;;;1917:30;;;;1878:70;;1886:29;1878:7;:70::i;:::-;1846:29;;;;:102;;;;-1:-1:-1;1307:648:18:o;1520:446:27:-;1604:13;1665:1;1654;:8;:12;1680:33;;;;;;;;;;;;;;;;;;;;;;;1633:90;;;;;;;-1:-1:-1;;;;;1633:90:27;;;;;;;;;;-1:-1:-1;1773:8:27;;1771:1;;-1:-1:-1;;1773:12:27;;;1771:15;;;;;;;;;;1885:8;;-1:-1:-1;;1881:16:27;1910:17;;;-1:-1:-1;;;;1771:15:27;;;;;;1520:446::o;5639:488::-;5760:14;5823:5;5831:2;5823:10;5811:1;:8;:22;;5847:38;;;;;;;;;;;;;;;;;;;;;;;5790:105;;;;;;;-1:-1:-1;;;;;5790:105:27;;;;;;;;;;-1:-1:-1;;6074:13:27;5976:2;6074:13;6068:20;;5639:488::o;2161:480::-;2248:14;2311:2;2299:1;:8;:14;;2327:38;;;;;;;;;;;;;;;;;;;;;;;2278:97;;;;;;;-1:-1:-1;;;;;2278:97:27;;;;;;;;;;;2427:29;2439:1;2453:2;2442:1;:8;:13;2427:11;:29::i;:::-;2559:8;;-1:-1:-1;;2555:17:27;2585;;;-1:-1:-1;2418:38:27;2161:480::o;1064:326:19:-;1218:21;1271:82;1292:26;1300:9;1311:6;1292:7;:26::i;:::-;1332:11;1271:7;:82::i;:::-;1255:98;1064:326;-1:-1:-1;;;;1064:326:19:o;1161:135:31:-;1246:7;1280:1;1276;:5;:13;;1288:1;1276:13;;;1284:1;1276:13;1269:20;1161:135;-1:-1:-1;;;1161:135:31:o;12230:994:4:-;12381:30;;:::i;:::-;12586:34;;;:59;;;12770:22;;;;12806;;;;12692:146;;12623:22;;12692:16;:146::i;:::-;12655:183;;12905:34;;;;12953:22;;;;12989:14;;;;12875:138;;12905:34;12953:22;12875:16;:138::i;:::-;12848:24;;;:165;13080:34;;;;13128:22;;;;13164:14;;;;13050:138;;13080:34;13128:22;13050:16;:138::i;:::-;13023:24;;;:165;12230:994;;;;:::o;2005:1199:6:-;2185:23;2261;2337:25;2217:33;2229:5;:20;;;2217:11;:33::i;:::-;-1:-1:-1;;;2211:40:6;;2185:66;;2293:33;2305:5;:20;;;2293:11;:33::i;:::-;2365:14;2337:42;;;;;;;;-1:-1:-1;;2337:42:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2287:40:6;;;;-1:-1:-1;2337:42:6;;2365:14;2337:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2389:201;2423:5;:20;;;2457:17;2488:5;:18;;;2520:12;2546:11;:34;;;2389:20;:201::i;:::-;2600;2634:5;:20;;;2668:17;2699:12;2725:5;:18;;;2757:11;:34;;;2600:20;:201::i;:::-;2811:191;2845:12;1334:1;2897:5;:18;;;2929:5;:25;;;2968:11;:24;;;2811:20;:191::i;:::-;3012:185;3046:12;1334:1;3098:12;3124:5;:25;;;3163:11;:24;;;3012:20;:185::i;:::-;2005:1199;;;;;;:::o;2793:997:20:-;2882:17;689:67;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;689:67:20;;;679:78;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;679:78:20;;;;;;;;;;;;3150:4;3125:31;;;;;;;;;26:21:-1;;;22:32;6:49;;3125:31:20;;;;;;;;3115:42;;679:78;;-1:-1:-1;3125:31:20;;-1:-1:-1;3125:31:20;;-1:-1:-1;3115:42:20;;;;3125:31;3115:42;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;3115:42:20;;;;;;;;;;;;811:458;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;811:458:20;;;;;;;;801:469;;3115:42;;-1:-1:-1;811:458:20;;-1:-1:-1;811:458:20;;-1:-1:-1;801:469:20;;;;811:458;801:469;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;801:469:20;;;;;;;;;;;;;;;;3246:5;:18;;;3282:5;:18;;;3318:5;:25;;;3361:5;:19;;;3398:5;:22;;;3438:5;:22;;;3478:5;:14;;;3510:5;:14;;;3542:5;:27;;;3587:5;:10;;;3642:5;:20;;;3625:38;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3625:38:20;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3625:38:20;;;3615:49;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3615:49:20;;;;;;;;;;;;;;;;3709:5;:20;;;3692:38;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3692:38:20;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3692:38:20;;;3682:49;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3682:49:20;;;;;;;;;;;;;;;;3212:533;;;;;;-1:-1:-1;;;;;3212:533:20;-1:-1:-1;;;;;3212:533:20;;;;;;;;-1:-1:-1;;;;;3212:533:20;-1:-1:-1;;;;;3212:533:20;;;;;;;;-1:-1:-1;;;;;3212:533:20;-1:-1:-1;;;;;3212:533:20;;;;;;;;-1:-1:-1;;;;;3212:533:20;-1:-1:-1;;;;;3212:533:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3212:533:20;;;3202:544;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;-1:-1;;263:2;259:12;;;254:3;250:22;246:30;340:21;;;311:9;;295:26;;;;377:20;365:33;;3202:544:20;;;;;;;;;;;;3043:713;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3043:713:20;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3043:713:20;;;;;;-1:-1:-1;;3033:724:20;;3043:713;;;;3033:724;;;;;3043:713;3033:724;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;3033:724:20;;;;;;;;;;;2793:997;-1:-1:-1;;;;;2793:997:20:o;11149:810:4:-;11413:21;;11479:16;;;;;;;;;;;;;;;;;11801:20;;11413:52;;11444:20;11413:52;11392:113;;;;-1:-1:-1;;;;;11392:113:4;;;;;;;;;;-1:-1:-1;11579:19:4;;;;-1:-1:-1;;;;;11579:33:4;;11575:168;;11653:19;;;;11704:14;;;;;;;;;;;;;-1:-1:-1;11704:14:4;;;;-1:-1:-1;;;;;11653:33:4;11676:10;11653:33;11628:104;;;;-1:-1:-1;;;;;11628:104:4;;;;;;;;;;;11575:168;11824:26;:24;:26::i;:::-;11881:18;;11929:13;;;;;;;;;;;;;;;;;11801:49;;-1:-1:-1;;;;;;11881:34:4;;;;;;11860:92;;;;-1:-1:-1;;;;;11860:92:4;;;;;;;;;8442:398;8590:20;;;;:9;:20;;;;;;;:27;;-1:-1:-1;;8590:27:4;8613:4;8590:27;;;8707:25;;;;8675:18;;8769:20;;;;8803;;;;8655:178;;8600:9;;-1:-1:-1;;;;;8655:178:4;;;;;;;;;;;;;8769:20;;8803;8655:178;;;;;;;;;;8442:398;;:::o;84:180:31:-;164:7;196:5;;;218:6;;;:20;;;237:1;232;228;:5;;;;;;;;:10;218:20;211:28;;;;;1629:555:19;1782:12;1810:17;1967:33;1856:11;1830:38;;;;;;;1845:9;1837:6;1830:38;1810:58;-1:-1:-1;1882:14:19;;1878:79;;;1919:5;1912:12;;;;1878:79;2003:98;2024:27;2032:9;2043:7;2024;:27::i;:::-;2065:26;2073:9;2084:6;2065:7;:26::i;:::-;2003:7;:98::i;:::-;2149:4;2121:32;;;-1:-1:-1;1967:134:19;-1:-1:-1;1629:555:19;;;;;;;;:::o;570:166:31:-;650:7;682:5;;;704:6;;;;697:14;;;3283:506:3;3597:22;3547:1;3538:6;:10;3534:249;;;-1:-1:-1;3622:26:3;;;;;;;:12;:26;;;;;;;;3720:52;;;;;-1:-1:-1;;;;;3622:26:3;;;;;;3720:23;;:52;;3744:9;;3755:4;;3761:2;;3765:6;;3720:52;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3720:52:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3720:52:3;;;;3283:506;;;;;;:::o;2855:884:27:-;2976:14;3039:5;3047:2;3039:10;3027:1;:8;:22;;3091:38;;;;;;;;;;;;;;;;;;;;;;;3006:133;;;;;;;-1:-1:-1;;;;;3006:133:27;;;;;;;;;;-1:-1:-1;;3641:13:27;3386:2;3641:13;3635:20;-1:-1:-1;;;;;3631:69:27;;2855:884::o;270:142:31:-;350:7;373:6;386:1;382;:5;;;;;;;;;270:142;-1:-1:-1;;;;270:142:31:o;894:607:2:-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;894:607:2;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;146:693;;261:4;249:17;;245:27;-1:-1;235:2;;286:1;283;276:12;235:2;323:6;310:20;345:85;360:69;422:6;360:69;;;345:85;;;458:21;;;502:4;490:17;;;;336:94;;-1:-1;515:14;;490:17;610:1;595:238;620:6;617:1;614:13;595:238;;;703:3;690:17;682:6;678:30;727:42;765:3;753:10;727:42;;;715:55;;-1:-1;793:4;784:14;;;;812;;;;;642:1;635:9;595:238;;;599:14;228:611;;;;;;;;879:735;;1008:4;996:17;;992:27;-1:-1;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:99;1107:83;1183:6;1107:83;;1092:99;1219:21;;;1263:4;1251:17;;;;1083:108;;-1:-1;1276:14;;1251:17;1371:1;1356:252;1381:6;1378:1;1375:13;1356:252;;;1464:3;1451:17;1443:6;1439:30;1488:56;1540:3;1528:10;1488:56;;;1476:69;;-1:-1;1568:4;1559:14;;;;1587;;;;;1403:1;1396:9;1356:252;;1640:707;;1750:4;1738:17;;1734:27;-1:-1;1724:2;;1775:1;1772;1765:12;1724:2;1812:6;1799:20;1834:80;1849:64;1906:6;1849:64;;1834:80;1825:89;;1931:5;1956:6;1949:5;1942:21;1986:4;1978:6;1974:17;1964:27;;2008:4;2003:3;1999:14;1992:21;;2061:6;2108:3;2100:4;2092:6;2088:17;2083:3;2079:27;2076:36;2073:2;;;2125:1;2122;2115:12;2073:2;2150:1;2135:206;2160:6;2157:1;2154:13;2135:206;;;2218:3;2240:37;2273:3;2261:10;2240:37;;;2228:50;;-1:-1;2301:4;2292:14;;;;2320;;;;;2182:1;2175:9;2135:206;;2355:112;;2419:43;2454:6;2441:20;2419:43;;2474:116;;2549:36;2577:6;2571:13;2549:36;;2597:118;;2664:46;2702:6;2689:20;2664:46;;2736:335;;;2843:4;2831:17;;2827:27;-1:-1;2817:2;;2868:1;2865;2858:12;2817:2;-1:-1;2888:20;;2928:18;2917:30;;2914:2;;;2960:1;2957;2950:12;2914:2;2994:4;2986:6;2982:17;2970:29;;3044:3;3037;3029:6;3025:16;3015:8;3011:31;3008:40;3005:2;;;3061:1;3058;3051:12;3005:2;2810:261;;;;;;3080:432;;3170:4;3158:17;;3154:27;-1:-1;3144:2;;3195:1;3192;3185:12;3144:2;3232:6;3219:20;3254:60;3269:44;3306:6;3269:44;;3254:60;3245:69;;3334:6;3327:5;3320:21;3370:4;3362:6;3358:17;3403:4;3396:5;3392:16;3438:3;3429:6;3424:3;3420:16;3417:25;3414:2;;;3455:1;3452;3445:12;3414:2;3465:41;3499:6;3494:3;3489;3465:41;;;3137:375;;;;;;;;3997:2205;;4105:5;4093:9;4088:3;4084:19;4080:31;4077:2;;;4124:1;4121;4114:12;4077:2;4142:21;4157:5;4142:21;;;4133:30;-1:-1;4221:1;4252:49;4297:3;4277:9;4252:49;;;4228:74;;-1:-1;4371:2;4404:49;4449:3;4425:22;;;4404:49;;;4397:4;4390:5;4386:16;4379:75;4323:142;4530:2;4563:49;4608:3;4599:6;4588:9;4584:22;4563:49;;;4556:4;4549:5;4545:16;4538:75;4475:149;4683:2;4716:49;4761:3;4752:6;4741:9;4737:22;4716:49;;;4709:4;4702:5;4698:16;4691:75;4634:143;4839:3;4873:49;4918:3;4909:6;4898:9;4894:22;4873:49;;;4866:4;4859:5;4855:16;4848:75;4787:147;4996:3;5030:49;5075:3;5066:6;5055:9;5051:22;5030:49;;;5023:4;5016:5;5012:16;5005:75;4944:147;5145:3;5179:49;5224:3;5215:6;5204:9;5200:22;5179:49;;;5172:4;5165:5;5161:16;5154:75;5101:139;5294:3;5328:49;5373:3;5364:6;5353:9;5349:22;5328:49;;;5321:4;5314:5;5310:16;5303:75;5250:139;5456:3;5491:49;5536:3;5527:6;5516:9;5512:22;5491:49;;;5483:5;5476;5472:17;5465:76;5399:153;5602:3;5637:49;5682:3;5673:6;5662:9;5658:22;5637:49;;;5629:5;5622;5618:17;5611:76;5562:136;5786:3;5775:9;5771:19;5758:33;5811:18;5803:6;5800:30;5797:2;;;5843:1;5840;5833:12;5797:2;5879:54;5929:3;5920:6;5909:9;5905:22;5879:54;;;5871:5;5864;5860:17;5853:81;5708:237;6033:3;6022:9;6018:19;6005:33;6058:18;6050:6;6047:30;6044:2;;;6090:1;6087;6080:12;6044:2;6126:54;6176:3;6167:6;6156:9;6152:22;6126:54;;;6118:5;6111;6107:17;6100:81;5955:237;4071:2131;;;;;8578:114;;8643:44;8679:6;8666:20;8643:44;;8699:118;;8775:37;8804:6;8798:13;8775:37;;8824:241;;8928:2;8916:9;8907:7;8903:23;8899:32;8896:2;;;8944:1;8941;8934:12;8896:2;8979:1;8996:53;9041:7;9021:9;8996:53;;9072:366;;;9193:2;9181:9;9172:7;9168:23;9164:32;9161:2;;;9209:1;9206;9199:12;9161:2;9244:1;9261:53;9306:7;9286:9;9261:53;;;9251:63;;9223:97;9351:2;9369:53;9414:7;9405:6;9394:9;9390:22;9369:53;;;9359:63;;9330:98;9155:283;;;;;;9445:360;;;9563:2;9551:9;9542:7;9538:23;9534:32;9531:2;;;9579:1;9576;9569:12;9531:2;9614:1;9631:53;9676:7;9656:9;9631:53;;;9621:63;;9593:97;9721:2;9739:50;9781:7;9772:6;9761:9;9757:22;9739:50;;9812:415;;9960:2;9948:9;9939:7;9935:23;9931:32;9928:2;;;9976:1;9973;9966:12;9928:2;10011:31;;10062:18;10051:30;;10048:2;;;10094:1;10091;10084:12;10048:2;10114:97;10203:7;10194:6;10183:9;10179:22;10114:97;;10234:947;;;;10471:2;10459:9;10450:7;10446:23;10442:32;10439:2;;;10487:1;10484;10477:12;10439:2;10522:31;;10573:18;10562:30;;10559:2;;;10605:1;10602;10595:12;10559:2;10625:97;10714:7;10705:6;10694:9;10690:22;10625:97;;;10615:107;;10501:227;10787:2;10776:9;10772:18;10759:32;10811:18;10803:6;10800:30;10797:2;;;10843:1;10840;10833:12;10797:2;10863:78;10933:7;10924:6;10913:9;10909:22;10863:78;;;10853:88;;10738:209;11006:2;10995:9;10991:18;10978:32;11030:18;11022:6;11019:30;11016:2;;;11062:1;11059;11052:12;11016:2;11082:83;11157:7;11148:6;11137:9;11133:22;11082:83;;;11072:93;;10957:214;10433:748;;;;;;11188:811;;;;11400:2;11388:9;11379:7;11375:23;11371:32;11368:2;;;11416:1;11413;11406:12;11368:2;11451:31;;11502:18;11491:30;;11488:2;;;11534:1;11531;11524:12;11488:2;11554:97;11643:7;11634:6;11623:9;11619:22;11554:97;;;11544:107;;11430:227;11688:2;11706:53;11751:7;11742:6;11731:9;11727:22;11706:53;;12006:257;;12118:2;12106:9;12097:7;12093:23;12089:32;12086:2;;;12134:1;12131;12124:12;12086:2;12169:1;12186:61;12239:7;12219:9;12186:61;;12270:241;;12374:2;12362:9;12353:7;12349:23;12345:32;12342:2;;;12390:1;12387;12380:12;12342:2;12425:1;12442:53;12487:7;12467:9;12442:53;;12518:366;;;12639:2;12627:9;12618:7;12614:23;12610:32;12607:2;;;12655:1;12652;12645:12;12607:2;12690:1;12707:53;12752:7;12732:9;12707:53;;12891:615;;;;;13048:2;13036:9;13027:7;13023:23;13019:32;13016:2;;;13064:1;13061;13054:12;13016:2;13099:1;13116:53;13161:7;13141:9;13116:53;;;13106:63;;13078:97;13206:2;13224:53;13269:7;13260:6;13249:9;13245:22;13224:53;;;13214:63;;13185:98;13342:2;13331:9;13327:18;13314:32;13366:18;13358:6;13355:30;13352:2;;;13398:1;13395;13388:12;13352:2;13426:64;13482:7;13473:6;13462:9;13458:22;13426:64;;;13010:496;;;;-1:-1;13408:82;-1:-1;;;;13010:496;13513:595;;;;13660:2;13648:9;13639:7;13635:23;13631:32;13628:2;;;13676:1;13673;13666:12;13628:2;13711:1;13728:53;13773:7;13753:9;13728:53;;;13718:63;;13690:97;13818:2;13836:53;13881:7;13872:6;13861:9;13857:22;13836:53;;;13826:63;;13797:98;13954:2;13943:9;13939:18;13926:32;13978:18;13970:6;13967:30;13964:2;;;14010:1;14007;14000:12;13964:2;14030:62;14084:7;14075:6;14064:9;14060:22;14030:62;;14115:373;;14242:2;14230:9;14221:7;14217:23;14213:32;14210:2;;;14258:1;14255;14248:12;14210:2;14293:31;;14344:18;14333:30;;14330:2;;;14376:1;14373;14366:12;14330:2;14396:76;14464:7;14455:6;14444:9;14440:22;14396:76;;14495:1089;;;;;14714:3;14702:9;14693:7;14689:23;14685:33;14682:2;;;14731:1;14728;14721:12;14682:2;14766:31;;14817:18;14806:30;;14803:2;;;14849:1;14846;14839:12;14803:2;14869:76;14937:7;14928:6;14917:9;14913:22;14869:76;;;14859:86;;14745:206;15010:2;14999:9;14995:18;14982:32;15034:18;15026:6;15023:30;15020:2;;;15066:1;15063;15056:12;15020:2;15086:76;15154:7;15145:6;15134:9;15130:22;15086:76;;;15076:86;;14961:207;15227:2;15216:9;15212:18;15199:32;15251:18;15243:6;15240:30;15237:2;;;15283:1;15280;15273:12;15237:2;15303:62;15357:7;15348:6;15337:9;15333:22;15303:62;;;15293:72;;15178:193;15430:2;15419:9;15415:18;15402:32;15454:18;15446:6;15443:30;15440:2;;;15486:1;15483;15476:12;15440:2;15506:62;15560:7;15551:6;15540:9;15536:22;15506:62;;;15496:72;;15381:193;14676:908;;;;;;;;15591:727;;;;15761:2;15749:9;15740:7;15736:23;15732:32;15729:2;;;15777:1;15774;15767:12;15729:2;15812:31;;15863:18;15852:30;;15849:2;;;15895:1;15892;15885:12;15849:2;15915:76;15983:7;15974:6;15963:9;15959:22;15915:76;;;15905:86;;15791:206;16028:2;16046:53;16091:7;16082:6;16071:9;16067:22;16046:53;;16573:865;;;;;;;16766:3;16754:9;16745:7;16741:23;16737:33;16734:2;;;16783:1;16780;16773:12;16734:2;16818:1;16835:53;16880:7;16860:9;16835:53;;;16825:63;;16797:97;16925:2;16943:53;16988:7;16979:6;16968:9;16964:22;16943:53;;;16933:63;;16904:98;17061:2;17050:9;17046:18;17033:32;17085:18;17077:6;17074:30;17071:2;;;17117:1;17114;17107:12;17071:2;17145:64;17201:7;17192:6;17181:9;17177:22;17145:64;;;17127:82;;;;17012:203;17274:2;17263:9;17259:18;17246:32;17298:18;17290:6;17287:30;17284:2;;;17330:1;17327;17320:12;17284:2;17358:64;17414:7;17405:6;17394:9;17390:22;17358:64;;;17340:82;;;;17225:203;16728:710;;;;;;;;;17445:237;;17547:2;17535:9;17526:7;17522:23;17518:32;17515:2;;;17563:1;17560;17553:12;17515:2;17598:1;17615:51;17658:7;17638:9;17615:51;;17689:259;;17802:2;17790:9;17781:7;17777:23;17773:32;17770:2;;;17818:1;17815;17808:12;17770:2;17853:1;17870:62;17924:7;17904:9;17870:62;;17955:487;;;;18091:2;18079:9;18070:7;18066:23;18062:32;18059:2;;;18107:1;18104;18097:12;18059:2;18142:1;18159:51;18202:7;18182:9;18159:51;;;18149:61;;18121:95;18247:2;18265:53;18310:7;18301:6;18290:9;18286:22;18265:53;;;18255:63;;18226:98;18355:2;18373:53;18418:7;18409:6;18398:9;18394:22;18373:53;;18449:110;18522:31;18547:5;18522:31;;;18517:3;18510:44;18504:55;;;18566:101;18633:28;18655:5;18633:28;;18674:110;18747:31;18772:5;18747:31;;18791:297;;18891:38;18923:5;18891:38;;;18946:6;18941:3;18934:19;18958:63;19014:6;19007:4;19002:3;18998:14;18991:4;18984:5;18980:16;18958:63;;;19053:29;19075:6;19053:29;;;19033:50;;;19046:4;19033:50;;18871:217;-1:-1;;;18871:217;19391:156;19484:57;19535:5;19484:57;;19854:397;20009:2;19997:15;;20046:66;20041:2;20032:12;;20025:88;20147:66;20142:2;20133:12;;20126:88;20242:2;20233:12;;19990:261;20336:888;20564:22;;20477:4;20468:14;;;20598:61;20472:3;20564:22;20598:61;;;20497:174;20765:4;20758:5;20754:16;20748:23;20783:62;20839:4;20834:3;20830:14;20817:11;20783:62;;;20681:176;20941:4;20934:5;20930:16;20924:23;20959:62;21015:4;21010:3;21006:14;20993:11;20959:62;;;20867:166;21117:4;21110:5;21106:16;21100:23;21135:62;21191:4;21186:3;21182:14;21169:11;21135:62;;22290:815;22515:22;;22445:5;22436:15;;;22549:115;22440:3;22515:22;22549:115;;;22466:210;22753:4;22746:5;22742:16;22736:23;22771:116;22881:4;22876:3;22872:14;22859:11;22771:116;;;22686:213;22997:4;22990:5;22986:16;22980:23;23015:63;23071:5;23066:3;23062:15;23049:11;23015:63;;23173:695;23386:22;;23310:4;23301:14;;;23420:57;23305:3;23386:22;23420:57;;;23330:159;23570:4;23563:5;23559:16;23553:23;23588:62;23644:4;23639:3;23635:14;23622:11;23588:62;;;23499:163;23761:4;23754:5;23750:16;23744:23;23779:62;23835:4;23830:3;23826:14;23813:11;23779:62;;23992:104;24061:29;24084:5;24061:29;;24103:193;24211:2;24196:18;;24225:61;24200:9;24259:6;24225:61;;24303:955;24607:3;24592:19;;24622:61;24596:9;24656:6;24622:61;;;24694:62;24752:2;24741:9;24737:18;24728:6;24694:62;;;24767;24825:2;24814:9;24810:18;24801:6;24767:62;;;24840;24898:2;24887:9;24883:18;24874:6;24840:62;;;24913:63;24971:3;24960:9;24956:19;24947:6;24913:63;;;25025:9;25019:4;25015:20;25009:3;24998:9;24994:19;24987:49;25050:62;25107:4;25098:6;25050:62;;;25042:70;;25161:9;25155:4;25151:20;25145:3;25134:9;25130:19;25123:49;25186:62;25243:4;25234:6;25186:62;;;25178:70;24578:680;-1:-1;;;;;;;;;24578:680;25265:181;25367:2;25352:18;;25381:55;25356:9;25409:6;25381:55;;25453:479;25635:2;25620:18;;25649:61;25624:9;25683:6;25649:61;;;25721:62;25779:2;25768:9;25764:18;25755:6;25721:62;;;25831:9;25825:4;25821:20;25816:2;25805:9;25801:18;25794:48;25856:66;25917:4;25908:6;25856:66;;;25848:74;25606:326;-1:-1;;;;;25606:326;25939:378;26093:2;26078:18;;26107:61;26082:9;26141:6;26107:61;;;26216:9;26210:4;26206:20;26201:2;26190:9;26186:18;26179:48;26241:66;26302:4;26293:6;26241:66;;26324:489;26512:3;26497:19;;26527:61;26501:9;26561:6;26527:61;;;26599:58;26653:2;26642:9;26638:18;26629:6;26599:58;;;26668:62;26726:2;26715:9;26711:18;26702:6;26668:62;;;26741;26799:2;26788:9;26784:18;26775:6;26741:62;;26820:581;27030:3;27045:47;;;27015:19;;27106:66;27015:19;27158:6;27106:66;;;27098:74;;27183:62;27241:2;27230:9;27226:18;27217:6;27183:62;;;27256;27314:2;27303:9;27299:18;27290:6;27256:62;;27408:446;27572:2;27586:47;;;27557:18;;27647:62;27557:18;27695:6;27647:62;;;27639:70;;27757:9;27751:4;27747:20;27742:2;27731:9;27727:18;27720:48;27782:62;27839:4;27830:6;27782:62;;27861:233;27989:2;27974:18;;28003:81;27978:9;28057:6;28003:81;;28101:273;28225:2;28239:47;;;28210:18;;28300:64;28210:18;28350:6;28300:64;;28381:387;28562:2;28576:47;;;28547:18;;28637:121;28547:18;28637:121;;28775:310;28941:3;28926:19;;28956:119;28930:9;29048:6;28956:119;;29092:338;29272:3;29257:19;;29287:133;29261:9;29393:6;29287:133;;29437:301;29599:2;29584:18;;29613:115;29588:9;29701:6;29613:115;;29745:193;29853:2;29838:18;;29867:61;29842:9;29901:6;29867:61;;29945:387;30105:2;30090:18;;30119:57;30094:9;30149:6;30119:57;;;30187:62;30245:2;30234:9;30230:18;30221:6;30187:62;;;30260;30318:2;30307:9;30303:18;30294:6;30260:62;;30339:256;30401:2;30395:9;30427:17;;;30502:18;30487:34;;30523:22;;;30484:62;30481:2;;;30559:1;30556;30549:12;30481:2;30575;30568:22;30379:216;;-1:-1;30379:216;30602:263;;30766:18;30758:6;30755:30;30752:2;;;30798:1;30795;30788:12;30752:2;-1:-1;30827:4;30815:17;;;30845:15;;30689:176;31421:254;;31560:18;31552:6;31549:30;31546:2;;;31592:1;31589;31582:12;31546:2;-1:-1;31665:4;31636;31613:17;;;;-1:-1;;31609:33;31655:15;;31483:192;31947:87;32017:12;;32001:33;32234:128;-1:-1;;;;;32303:54;;32286:76;32369:92;32442:13;32435:21;;32418:43;32468:79;32537:5;32520:27;32640:88;32718:4;32707:16;;32690:38;33236:135;;33335:31;33360:5;33335:31;;33379:145;33460:6;33455:3;33450;33437:30;-1:-1;33516:1;33498:16;;33491:27;33430:94;33533:268;33598:1;33605:101;33619:6;33616:1;33613:13;33605:101;;;33686:11;;;33680:18;33667:11;;;33660:39;33641:2;33634:10;33605:101;;;33721:6;33718:1;33715:13;33712:2;;;-1:-1;;33786:1;33768:16;;33761:27;33582:219;33809:97;33897:2;33877:14;-1:-1;;33873:28;;33857:49" } } }, @@ -1855,13 +1882,13 @@ "current/protocol/Exchange/MixinExchangeCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibFillResults.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibMath.sol\";\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MExchangeCore.sol\";\nimport \"./mixins/MSettlement.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\n\ncontract MixinExchangeCore is\n LibMath,\n LibOrder,\n LibFillResults,\n LibExchangeErrors,\n MExchangeCore,\n MSettlement,\n MSignatureValidator,\n MTransactions\n{\n // Mapping of orderHash => amount of takerAsset already bought by maker\n mapping (bytes32 => uint256) public filled;\n\n // Mapping of orderHash => cancelled\n mapping (bytes32 => bool) public cancelled;\n\n // Mapping of makerAddress => lowest salt an order can have in order to be fillable\n // Orders with a salt less than their maker's epoch are considered cancelled\n mapping (address => uint256) public makerEpoch;\n\n ////// Core exchange functions //////\n\n /// @dev Cancels all orders created by sender with a salt less than or equal to the specified salt value.\n /// @param salt Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 salt)\n external\n {\n address makerAddress = getCurrentContextAddress();\n\n // makerEpoch is initialized to 0, so to cancelUpTo we need salt + 1\n uint256 newMakerEpoch = salt + 1; \n uint256 oldMakerEpoch = makerEpoch[makerAddress];\n\n // Ensure makerEpoch is monotonically increasing\n require(\n newMakerEpoch > oldMakerEpoch, \n INVALID_NEW_MAKER_EPOCH\n );\n\n // Update makerEpoch\n makerEpoch[makerAddress] = newMakerEpoch;\n emit CancelUpTo(makerAddress, newMakerEpoch);\n }\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n // Fetch order info\n OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Fetch taker address\n address takerAddress = getCurrentContextAddress();\n\n // Get amount of takerAsset to fill\n uint256 remainingTakerAssetAmount = safeSub(order.takerAssetAmount, orderInfo.orderTakerAssetFilledAmount);\n uint256 takerAssetFilledAmount = min256(takerAssetFillAmount, remainingTakerAssetAmount);\n\n // Validate context\n assertValidFill(\n order,\n orderInfo,\n takerAddress,\n takerAssetFillAmount,\n takerAssetFilledAmount,\n signature\n );\n\n // Compute proportional fill amounts\n fillResults = calculateFillResults(order, takerAssetFilledAmount);\n\n // Update exchange internal state\n updateFilledState(\n order,\n takerAddress,\n orderInfo.orderHash,\n orderInfo.orderTakerAssetFilledAmount,\n fillResults\n );\n \n // Settle order\n settleOrder(order, takerAddress, fillResults);\n\n return fillResults;\n }\n\n /// @dev After calling, the order can not be filled anymore.\n /// Throws if order is invalid or sender does not have permission to cancel.\n /// @param order Order to cancel. Order must be OrderStatus.FILLABLE.\n function cancelOrder(Order memory order)\n public\n {\n // Fetch current order status\n OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Validate context\n assertValidCancel(order, orderInfo);\n\n // Perform cancel\n updateCancelledState(order, orderInfo.orderHash);\n }\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(Order memory order)\n public\n view\n returns (OrderInfo memory orderInfo)\n {\n // Compute the order hash\n orderInfo.orderHash = getOrderHash(order);\n\n // If order.makerAssetAmount is zero, we also reject the order.\n // While the Exchange contract handles them correctly, they create\n // edge cases in the supporting infrastructure because they have\n // an 'infinite' price when computed by a simple division.\n if (order.makerAssetAmount == 0) {\n orderInfo.orderStatus = uint8(OrderStatus.INVALID_MAKER_ASSET_AMOUNT);\n return orderInfo;\n }\n\n // If order.takerAssetAmount is zero, then the order will always\n // be considered filled because 0 == takerAssetAmount == orderTakerAssetFilledAmount\n // Instead of distinguishing between unfilled and filled zero taker\n // amount orders, we choose not to support them.\n if (order.takerAssetAmount == 0) {\n orderInfo.orderStatus = uint8(OrderStatus.INVALID_TAKER_ASSET_AMOUNT);\n return orderInfo;\n }\n\n // Validate order expiration\n if (block.timestamp >= order.expirationTimeSeconds) {\n orderInfo.orderStatus = uint8(OrderStatus.EXPIRED);\n return orderInfo;\n }\n\n // Check if order has been cancelled\n if (cancelled[orderInfo.orderHash]) {\n orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);\n return orderInfo;\n }\n if (makerEpoch[order.makerAddress] > order.salt) {\n orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);\n return orderInfo;\n }\n\n // Fetch filled amount and validate order availability\n orderInfo.orderTakerAssetFilledAmount = filled[orderInfo.orderHash];\n if (orderInfo.orderTakerAssetFilledAmount >= order.takerAssetAmount) {\n orderInfo.orderStatus = uint8(OrderStatus.FULLY_FILLED);\n return orderInfo;\n }\n\n // All other statuses are ruled out: order is Fillable\n orderInfo.orderStatus = uint8(OrderStatus.FILLABLE);\n return orderInfo;\n }\n\n /// @dev Updates state with results of a fill order.\n /// @param order that was filled.\n /// @param takerAddress Address of taker who filled the order.\n /// @param orderTakerAssetFilledAmount Amount of order already filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function updateFilledState(\n Order memory order,\n address takerAddress,\n bytes32 orderHash,\n uint256 orderTakerAssetFilledAmount,\n FillResults memory fillResults\n )\n internal\n {\n // Update state\n filled[orderHash] = safeAdd(orderTakerAssetFilledAmount, fillResults.takerAssetFilledAmount);\n\n // Log order\n emit Fill(\n order.makerAddress,\n takerAddress,\n order.feeRecipientAddress,\n fillResults.makerAssetFilledAmount,\n fillResults.takerAssetFilledAmount,\n fillResults.makerFeePaid,\n fillResults.takerFeePaid,\n orderHash,\n order.makerAssetData,\n order.takerAssetData\n );\n }\n\n /// @dev Updates state with results of cancelling an order.\n /// State is only updated if the order is currently fillable.\n /// Otherwise, updating state would have no effect.\n /// @param order that was cancelled.\n /// @param orderHash Hash of order that was cancelled.\n function updateCancelledState(\n Order memory order,\n bytes32 orderHash\n )\n internal\n {\n // Perform cancel\n cancelled[orderHash] = true;\n\n // Log cancel\n emit Cancel(\n order.makerAddress,\n order.feeRecipientAddress,\n orderHash,\n order.makerAssetData,\n order.takerAssetData\n );\n }\n\n /// @dev Validates context for fillOrder. Succeeds or throws.\n /// @param order to be filled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n /// @param takerAddress Address of order taker.\n /// @param takerAssetFillAmount Desired amount of order to fill by taker.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param signature Proof that the orders was created by its maker.\n function assertValidFill(\n Order memory order,\n OrderInfo memory orderInfo,\n address takerAddress,\n uint256 takerAssetFillAmount,\n uint256 takerAssetFilledAmount,\n bytes memory signature\n )\n internal\n view\n {\n // An order can only be filled if its status is FILLABLE.\n require(\n orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),\n ORDER_UNFILLABLE\n );\n\n // Revert if fill amount is invalid\n require(\n takerAssetFillAmount != 0,\n INVALID_TAKER_AMOUNT\n );\n\n // Validate sender is allowed to fill this order\n if (order.senderAddress != address(0)) {\n require(\n order.senderAddress == msg.sender,\n INVALID_SENDER\n );\n }\n\n // Validate taker is allowed to fill this order\n if (order.takerAddress != address(0)) {\n require(\n order.takerAddress == takerAddress,\n INVALID_TAKER\n );\n }\n\n // Validate Maker signature (check only if first time seen)\n if (orderInfo.orderTakerAssetFilledAmount == 0) {\n require(\n isValidSignature(orderInfo.orderHash, order.makerAddress, signature),\n INVALID_ORDER_SIGNATURE\n );\n }\n\n // Validate fill order rounding\n require(\n !isRoundingError(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n ),\n ROUNDING_ERROR\n );\n }\n\n /// @dev Validates context for cancelOrder. Succeeds or throws.\n /// @param order to be cancelled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n function assertValidCancel(\n Order memory order,\n OrderInfo memory orderInfo\n )\n internal\n view\n {\n // Ensure order is valid\n // An order can only be cancelled if its status is FILLABLE.\n require(\n orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),\n ORDER_UNFILLABLE\n );\n\n // Validate sender is allowed to cancel this order\n if (order.senderAddress != address(0)) {\n require(\n order.senderAddress == msg.sender,\n INVALID_SENDER\n );\n }\n\n // Validate transaction signed by maker\n address makerAddress = getCurrentContextAddress();\n require(\n order.makerAddress == makerAddress,\n INVALID_MAKER\n );\n }\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n Order memory order,\n uint256 takerAssetFilledAmount\n )\n internal\n pure\n returns (FillResults memory fillResults)\n {\n // Compute proportional transfer amounts\n // TODO: All three are multiplied by the same fraction. This can\n // potentially be optimized.\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = getPartialAmount(\n fillResults.takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = getPartialAmount(\n fillResults.takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = getPartialAmount(\n fillResults.takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n\n return fillResults;\n }\n}\n", "current/protocol/Exchange/MixinMatchOrders.sol": "/*\n Copyright 2018 ZeroEx Intl.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibMath.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MExchangeCore.sol\";\nimport \"./mixins/MMatchOrders.sol\";\nimport \"./mixins/MSettlement.sol\";\nimport \"./mixins/MTransactions.sol\";\n\ncontract MixinMatchOrders is\n LibMath,\n LibExchangeErrors,\n MExchangeCore,\n MMatchOrders,\n MSettlement,\n MTransactions\n{\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n /// TODO: Make this function external once supported by Solidity (See Solidity Issues #3199, #1603)\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n // We assume that rightOrder.takerAssetData == leftOrder.makerAssetData and rightOrder.makerAssetData == leftOrder.takerAssetData.\n // If this assumption isn't true, the match will fail at signature validation.\n rightOrder.makerAssetData = leftOrder.takerAssetData;\n rightOrder.takerAssetData = leftOrder.makerAssetData;\n\n // Get left & right order info\n LibOrder.OrderInfo memory leftOrderInfo = getOrderInfo(leftOrder);\n LibOrder.OrderInfo memory rightOrderInfo = getOrderInfo(rightOrder);\n\n // Fetch taker address\n address takerAddress = getCurrentContextAddress();\n\n // Either our context is valid or we revert\n assertValidMatch(leftOrder, rightOrder);\n\n // Compute proportional fill amounts\n matchedFillResults = calculateMatchedFillResults(\n leftOrder,\n rightOrder,\n leftOrderInfo.orderTakerAssetFilledAmount,\n rightOrderInfo.orderTakerAssetFilledAmount\n );\n\n // Validate fill contexts\n assertValidFill(\n leftOrder,\n leftOrderInfo,\n takerAddress,\n matchedFillResults.left.takerAssetFilledAmount,\n matchedFillResults.left.takerAssetFilledAmount,\n leftSignature\n );\n assertValidFill(\n rightOrder,\n rightOrderInfo,\n takerAddress,\n matchedFillResults.right.takerAssetFilledAmount,\n matchedFillResults.right.takerAssetFilledAmount,\n rightSignature\n );\n\n // Update exchange state\n updateFilledState(\n leftOrder,\n takerAddress,\n leftOrderInfo.orderHash,\n leftOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.left\n );\n updateFilledState(\n rightOrder,\n takerAddress,\n rightOrderInfo.orderHash,\n rightOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.right\n );\n \n // Settle matched orders. Succeeds or throws.\n settleMatchedOrders(\n leftOrder,\n rightOrder,\n takerAddress,\n matchedFillResults\n );\n\n return matchedFillResults;\n }\n\n /// @dev Validates context for matchOrders. Succeeds or throws.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n function assertValidMatch(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder\n )\n internal\n pure\n {\n // Make sure there is a profitable spread.\n // There is a profitable spread iff the cost per unit bought (OrderA.MakerAmount/OrderA.TakerAmount) for each order is greater\n // than the profit per unit sold of the matched order (OrderB.TakerAmount/OrderB.MakerAmount).\n // This is satisfied by the equations below:\n // <leftOrder.makerAssetAmount> / <leftOrder.takerAssetAmount> >= <rightOrder.takerAssetAmount> / <rightOrder.makerAssetAmount>\n // AND\n // <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount> >= <leftOrder.takerAssetAmount> / <leftOrder.makerAssetAmount>\n // These equations can be combined to get the following:\n require(\n safeMul(leftOrder.makerAssetAmount, rightOrder.makerAssetAmount) >=\n safeMul(leftOrder.takerAssetAmount, rightOrder.takerAssetAmount),\n NEGATIVE_SPREAD_REQUIRED\n );\n }\n\n /// @dev Calculates fill amounts for the matched orders.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the leftOrder order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.\n /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n function calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftOrderTakerAssetFilledAmount,\n uint256 rightOrderTakerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n // We settle orders at the exchange rate of the right order.\n // The amount saved by the left maker goes to the taker.\n // Either the left or right order will be fully filled; possibly both.\n // The left order is fully filled iff the right order can sell more than left can buy.\n // That is: the amount required to fill the left order is less than or equal to\n // the amount we can spend from the right order:\n // <leftTakerAssetAmountRemaining> <= <rightTakerAssetAmountRemaining> * <rightMakerToTakerRatio>\n // <leftTakerAssetAmountRemaining> <= <rightTakerAssetAmountRemaining> * <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount>\n // <leftTakerAssetAmountRemaining> * <rightOrder.takerAssetAmount> <= <rightTakerAssetAmountRemaining> * <rightOrder.makerAssetAmount>\n uint256 leftTakerAssetAmountRemaining = safeSub(leftOrder.takerAssetAmount, leftOrderTakerAssetFilledAmount);\n uint256 rightTakerAssetAmountRemaining = safeSub(rightOrder.takerAssetAmount, rightOrderTakerAssetFilledAmount);\n uint256 leftTakerAssetFilledAmount;\n uint256 rightTakerAssetFilledAmount;\n if (\n safeMul(leftTakerAssetAmountRemaining, rightOrder.takerAssetAmount) <=\n safeMul(rightTakerAssetAmountRemaining, rightOrder.makerAssetAmount)\n ) {\n // Left order will be fully filled: maximally fill left\n leftTakerAssetFilledAmount = leftTakerAssetAmountRemaining;\n\n // The right order receives an amount proportional to how much was spent.\n // TODO: Can we ensure rounding error is in the correct direction?\n rightTakerAssetFilledAmount = getPartialAmount(\n rightOrder.takerAssetAmount,\n rightOrder.makerAssetAmount,\n leftTakerAssetFilledAmount\n );\n } else {\n // Right order will be fully filled: maximally fill right\n rightTakerAssetFilledAmount = rightTakerAssetAmountRemaining;\n\n // The left order receives an amount proportional to how much was spent.\n // TODO: Can we ensure rounding error is in the correct direction?\n leftTakerAssetFilledAmount = getPartialAmount(\n rightOrder.makerAssetAmount,\n rightOrder.takerAssetAmount,\n rightTakerAssetFilledAmount\n );\n }\n\n // Calculate fill results for left order\n matchedFillResults.left = calculateFillResults(\n leftOrder,\n leftTakerAssetFilledAmount\n );\n\n // Calculate fill results for right order\n matchedFillResults.right = calculateFillResults(\n rightOrder,\n rightTakerAssetFilledAmount\n );\n\n // Calculate amount given to taker\n matchedFillResults.leftMakerAssetSpreadAmount = safeSub(\n matchedFillResults.left.makerAssetFilledAmount,\n matchedFillResults.right.takerAssetFilledAmount\n );\n\n // Return fill results\n return matchedFillResults;\n }\n}\n", "current/protocol/Exchange/MixinSettlement.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./libs/LibMath.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MMatchOrders.sol\";\nimport \"./mixins/MSettlement.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\n\ncontract MixinSettlement is\n LibBytes,\n LibMath,\n LibExchangeErrors,\n MMatchOrders,\n MSettlement,\n MAssetProxyDispatcher\n{\n // ZRX address encoded as a byte array.\n // This will be constant throughout the life of the Exchange contract,\n // since ZRX will always be transferred via the ERC20 AssetProxy.\n bytes internal ZRX_ASSET_DATA;\n uint8 constant ZRX_PROXY_ID = 1;\n\n /// TODO: _zrxAssetData should be a constant in production.\n /// @dev Constructor sets the metadata that will be used for paying ZRX fees.\n /// @param _zrxAssetData Byte array containing ERC20 proxy id concatenated with address of ZRX.\n constructor (bytes memory _zrxAssetData)\n public\n {\n ZRX_ASSET_DATA = _zrxAssetData;\n }\n\n /// @dev Settles an order by transferring assets between counterparties.\n /// @param order Order struct containing order specifications.\n /// @param takerAddress Address selling takerAsset and buying makerAsset.\n /// @param fillResults Amounts to be filled and fees paid by maker and taker.\n function settleOrder(\n LibOrder.Order memory order,\n address takerAddress,\n LibFillResults.FillResults memory fillResults\n )\n internal\n {\n uint8 makerAssetProxyId = uint8(popLastByte(order.makerAssetData));\n uint8 takerAssetProxyId = uint8(popLastByte(order.takerAssetData));\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n dispatchTransferFrom(\n order.makerAssetData,\n makerAssetProxyId,\n order.makerAddress,\n takerAddress,\n fillResults.makerAssetFilledAmount\n );\n dispatchTransferFrom(\n order.takerAssetData,\n takerAssetProxyId,\n takerAddress,\n order.makerAddress,\n fillResults.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n zrxAssetData,\n ZRX_PROXY_ID,\n order.makerAddress,\n order.feeRecipientAddress,\n fillResults.makerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n ZRX_PROXY_ID,\n takerAddress,\n order.feeRecipientAddress,\n fillResults.takerFeePaid\n );\n }\n\n /// @dev Settles matched order by transferring appropriate funds between order makers, taker, and fee recipient.\n /// @param leftOrder First matched order.\n /// @param rightOrder Second matched order.\n /// @param takerAddress Address that matched the orders. The taker receives the spread between orders as profit.\n /// @param matchedFillResults Struct holding amounts to transfer between makers, taker, and fee recipients.\n function settleMatchedOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n address takerAddress,\n LibFillResults.MatchedFillResults memory matchedFillResults\n )\n internal\n {\n uint8 leftMakerAssetProxyId = uint8(popLastByte(leftOrder.makerAssetData));\n uint8 rightMakerAssetProxyId = uint8(popLastByte(rightOrder.makerAssetData));\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n // Order makers and taker\n dispatchTransferFrom(\n leftOrder.makerAssetData,\n leftMakerAssetProxyId,\n leftOrder.makerAddress,\n rightOrder.makerAddress,\n matchedFillResults.right.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n rightOrder.makerAssetData,\n rightMakerAssetProxyId,\n rightOrder.makerAddress,\n leftOrder.makerAddress,\n matchedFillResults.left.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n leftOrder.makerAssetData,\n leftMakerAssetProxyId,\n leftOrder.makerAddress,\n takerAddress,\n matchedFillResults.leftMakerAssetSpreadAmount\n );\n\n // Maker fees\n dispatchTransferFrom(\n zrxAssetData,\n ZRX_PROXY_ID,\n leftOrder.makerAddress,\n leftOrder.feeRecipientAddress,\n matchedFillResults.left.makerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n ZRX_PROXY_ID,\n rightOrder.makerAddress,\n rightOrder.feeRecipientAddress,\n matchedFillResults.right.makerFeePaid\n );\n\n // Taker fees\n if (leftOrder.feeRecipientAddress == rightOrder.feeRecipientAddress) {\n dispatchTransferFrom(\n zrxAssetData,\n ZRX_PROXY_ID,\n takerAddress,\n leftOrder.feeRecipientAddress,\n safeAdd(\n matchedFillResults.left.takerFeePaid,\n matchedFillResults.right.takerFeePaid\n )\n );\n } else {\n dispatchTransferFrom(\n zrxAssetData,\n ZRX_PROXY_ID,\n takerAddress,\n leftOrder.feeRecipientAddress,\n matchedFillResults.left.takerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n ZRX_PROXY_ID,\n takerAddress,\n rightOrder.feeRecipientAddress,\n matchedFillResults.right.takerFeePaid\n );\n }\n }\n}\n", - "current/protocol/Exchange/MixinSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./interfaces/IWallet.sol\";\nimport \"./interfaces/IValidator.sol\";\n\ncontract MixinSignatureValidator is\n LibBytes,\n LibExchangeErrors,\n MSignatureValidator,\n MTransactions\n{\n // Personal message headers\n string constant ETH_PERSONAL_MESSAGE = \"\\x19Ethereum Signed Message:\\n32\";\n string constant TREZOR_PERSONAL_MESSAGE = \"\\x19Ethereum Signed Message:\\n\\x41\";\n\n // Mapping of hash => signer => signed\n mapping (bytes32 => mapping (address => bool)) public preSigned;\n\n // Mapping of signer => validator => approved\n mapping (address => mapping (address => bool)) public allowedValidators;\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external\n {\n require(\n isValidSignature(hash, signer, signature),\n INVALID_SIGNATURE\n );\n preSigned[hash][signer] = true;\n }\n\n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validator Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validator,\n bool approval\n )\n external\n {\n address signer = getCurrentContextAddress();\n allowedValidators[signer][validator] = approval;\n }\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32 byte hash.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return True if the address recovered from the provided signature matches the input signer address.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n internal\n view\n returns (bool isValid)\n {\n // TODO: Domain separation: make hash depend on role. (Taker sig should not be valid as maker sig, etc.)\n require(\n signature.length > 0,\n LENGTH_GREATER_THAN_0_REQUIRED\n );\n\n // Pop last byte off of signature byte array.\n SignatureType signatureType = SignatureType(uint8(popLastByte(signature)));\n\n // Variables are not scoped in Solidity.\n uint8 v;\n bytes32 r;\n bytes32 s;\n address recovered;\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n revert(SIGNATURE_ILLEGAL);\n\n // Always invalid signature.\n // Like Illegal, this is always implicitly available and therefore\n // offered explicitly. It can be implicitly created by providing\n // a correctly formatted but incorrect signature.\n } else if (signatureType == SignatureType.Invalid) {\n require(\n signature.length == 0,\n LENGTH_0_REQUIRED\n );\n isValid = false;\n return isValid;\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(hash, v, r, s);\n isValid = signer == recovered;\n return isValid;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(ETH_PERSONAL_MESSAGE, hash)),\n v,\n r,\n s\n );\n isValid = signer == recovered;\n return isValid;\n\n // Implicitly signed by caller.\n // The signer has initiated the call. In the case of non-contract\n // accounts it means the transaction itself was signed.\n // Example: let's say for a particular operation three signatures\n // A, B and C are required. To submit the transaction, A and B can\n // give a signature to C, who can then submit the transaction using\n // `Caller` for his own signature. Or A and C can sign and B can\n // submit using `Caller`. Having `Caller` allows this flexibility.\n } else if (signatureType == SignatureType.Caller) {\n require(\n signature.length == 0,\n LENGTH_0_REQUIRED\n );\n isValid = signer == msg.sender;\n return isValid;\n\n // Signature verified by wallet contract.\n // If used with an order, the maker of the order is the wallet contract.\n } else if (signatureType == SignatureType.Wallet) {\n isValid = IWallet(signer).isValidSignature(hash, signature);\n return isValid;\n\n // Signature verified by validator contract.\n // If used with an order, the maker of the order can still be an EOA.\n // A signature using this type should be encoded as:\n // | Offset | Length | Contents |\n // | 0x00 | x | Signature to validate |\n // | 0x00 + x | 20 | Address of validator contract |\n // | 0x14 + x | 1 | Signature type is always \"\\x06\" |\n } else if (signatureType == SignatureType.Validator) {\n // Pop last 20 bytes off of signature byte array.\n address validator = popLast20Bytes(signature);\n // Ensure signer has approved validator.\n if (!allowedValidators[signer][validator]) {\n return false;\n }\n isValid = IValidator(validator).isValidSignature(\n hash,\n signer,\n signature\n );\n return isValid;\n\n // Signer signed hash previously using the preSign function.\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signer];\n return isValid;\n\n // Signature from Trezor hardware wallet.\n // It differs from web3.eth_sign in the encoding of message length\n // (Bitcoin varint encoding vs ascii-decimal, the latter is not\n // self-terminating which leads to ambiguities).\n // See also:\n // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36\n } else if (signatureType == SignatureType.Trezor) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(TREZOR_PERSONAL_MESSAGE, hash)),\n v,\n r,\n s\n );\n isValid = signer == recovered;\n return isValid;\n\n // Signer signed hash previously using the preSign function\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signer];\n return isValid;\n }\n\n // Anything else is illegal (We do not return false because\n // the signature may actually be valid, just not in a format\n // that we currently support. In this case returning false\n // may lead the caller to incorrectly believe that the\n // signature was invalid.)\n revert(SIGNATURE_UNSUPPORTED);\n }\n}\n", + "current/protocol/Exchange/MixinSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./interfaces/IWallet.sol\";\nimport \"./interfaces/IValidator.sol\";\n\ncontract MixinSignatureValidator is\n LibBytes,\n LibExchangeErrors,\n MSignatureValidator,\n MTransactions\n{\n // Personal message headers\n string constant ETH_PERSONAL_MESSAGE = \"\\x19Ethereum Signed Message:\\n32\";\n string constant TREZOR_PERSONAL_MESSAGE = \"\\x19Ethereum Signed Message:\\n\\x41\";\n\n // Mapping of hash => signer => signed\n mapping (bytes32 => mapping (address => bool)) public preSigned;\n\n // Mapping of signer => validator => approved\n mapping (address => mapping (address => bool)) public allowedValidators;\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external\n {\n require(\n isValidSignature(hash, signer, signature),\n INVALID_SIGNATURE\n );\n preSigned[hash][signer] = true;\n }\n\n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validator Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validator,\n bool approval\n )\n external\n {\n address signer = getCurrentContextAddress();\n allowedValidators[signer][validator] = approval;\n }\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32 byte hash.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return True if the address recovered from the provided signature matches the input signer address.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n // TODO: Domain separation: make hash depend on role. (Taker sig should not be valid as maker sig, etc.)\n require(\n signature.length > 0,\n LENGTH_GREATER_THAN_0_REQUIRED\n );\n\n // Pop last byte off of signature byte array.\n SignatureType signatureType = SignatureType(uint8(popLastByte(signature)));\n\n // Variables are not scoped in Solidity.\n uint8 v;\n bytes32 r;\n bytes32 s;\n address recovered;\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n revert(SIGNATURE_ILLEGAL);\n\n // Always invalid signature.\n // Like Illegal, this is always implicitly available and therefore\n // offered explicitly. It can be implicitly created by providing\n // a correctly formatted but incorrect signature.\n } else if (signatureType == SignatureType.Invalid) {\n require(\n signature.length == 0,\n LENGTH_0_REQUIRED\n );\n isValid = false;\n return isValid;\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(hash, v, r, s);\n isValid = signer == recovered;\n return isValid;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(ETH_PERSONAL_MESSAGE, hash)),\n v,\n r,\n s\n );\n isValid = signer == recovered;\n return isValid;\n\n // Implicitly signed by caller.\n // The signer has initiated the call. In the case of non-contract\n // accounts it means the transaction itself was signed.\n // Example: let's say for a particular operation three signatures\n // A, B and C are required. To submit the transaction, A and B can\n // give a signature to C, who can then submit the transaction using\n // `Caller` for his own signature. Or A and C can sign and B can\n // submit using `Caller`. Having `Caller` allows this flexibility.\n } else if (signatureType == SignatureType.Caller) {\n require(\n signature.length == 0,\n LENGTH_0_REQUIRED\n );\n isValid = signer == msg.sender;\n return isValid;\n\n // Signature verified by wallet contract.\n // If used with an order, the maker of the order is the wallet contract.\n } else if (signatureType == SignatureType.Wallet) {\n isValid = IWallet(signer).isValidSignature(hash, signature);\n return isValid;\n\n // Signature verified by validator contract.\n // If used with an order, the maker of the order can still be an EOA.\n // A signature using this type should be encoded as:\n // | Offset | Length | Contents |\n // | 0x00 | x | Signature to validate |\n // | 0x00 + x | 20 | Address of validator contract |\n // | 0x14 + x | 1 | Signature type is always \"\\x06\" |\n } else if (signatureType == SignatureType.Validator) {\n // Pop last 20 bytes off of signature byte array.\n address validator = popLast20Bytes(signature);\n // Ensure signer has approved validator.\n if (!allowedValidators[signer][validator]) {\n return false;\n }\n isValid = IValidator(validator).isValidSignature(\n hash,\n signer,\n signature\n );\n return isValid;\n\n // Signer signed hash previously using the preSign function.\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signer];\n return isValid;\n\n // Signature from Trezor hardware wallet.\n // It differs from web3.eth_sign in the encoding of message length\n // (Bitcoin varint encoding vs ascii-decimal, the latter is not\n // self-terminating which leads to ambiguities).\n // See also:\n // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36\n } else if (signatureType == SignatureType.Trezor) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(TREZOR_PERSONAL_MESSAGE, hash)),\n v,\n r,\n s\n );\n isValid = signer == recovered;\n return isValid;\n\n // Signer signed hash previously using the preSign function\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signer];\n return isValid;\n }\n\n // Anything else is illegal (We do not return false because\n // the signature may actually be valid, just not in a format\n // that we currently support. In this case returning false\n // may lead the caller to incorrectly believe that the\n // signature was invalid.)\n revert(SIGNATURE_UNSUPPORTED);\n }\n}\n", "current/protocol/Exchange/MixinTransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.4.24;\n\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\n\ncontract MixinTransactions is\n LibExchangeErrors,\n MSignatureValidator,\n MTransactions\n{\n\n // Mapping of transaction hash => executed\n // This prevents transactions from being executed more than once.\n mapping (bytes32 => bool) public transactions;\n\n // Address of current transaction signer\n address public currentContextAddress;\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signer Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signer,\n bytes data,\n bytes signature\n )\n external\n {\n // Prevent reentrancy\n require(\n currentContextAddress == address(0),\n REENTRANCY_ILLEGAL\n );\n\n // Calculate transaction hash\n bytes32 transactionHash = keccak256(abi.encodePacked(\n address(this),\n signer,\n salt,\n data\n ));\n\n // Validate transaction has not been executed\n require(\n !transactions[transactionHash],\n INVALID_TX_HASH\n );\n\n // Transaction always valid if signer is sender of transaction\n if (signer != msg.sender) {\n // Validate signature\n require(\n isValidSignature(transactionHash, signer, signature),\n INVALID_TX_SIGNATURE\n );\n\n // Set the current transaction signer\n currentContextAddress = signer;\n }\n\n // Execute transaction\n transactions[transactionHash] = true;\n require(\n address(this).delegatecall(data),\n FAILED_EXECUTION\n );\n\n // Reset current transaction signer\n // TODO: Check if gas is paid when currentContextAddress is already 0.\n currentContextAddress = address(0);\n }\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address)\n {\n address contextAddress = currentContextAddress == address(0) ? msg.sender : currentContextAddress;\n return contextAddress;\n }\n}\n", "current/protocol/Exchange/MixinWrapperFunctions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibMath.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MExchangeCore.sol\";\n\ncontract MixinWrapperFunctions is\n LibMath,\n LibFillResults,\n LibExchangeErrors,\n MExchangeCore\n{\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n fillResults = fillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n require(\n fillResults.takerAssetFilledAmount == takerAssetFillAmount,\n COMPLETE_FILL_FAILED\n );\n return fillResults;\n }\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n // We need to call MExchangeCore.fillOrder using a delegatecall in\n // assembly so that we can intercept a call that throws. For this, we\n // need the input encoded in memory in the Ethereum ABIv2 format [1].\n\n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0x00 | 4 | function selector |\n // | Params | | 3 * 32 | function parameters: |\n // | | 0x00 | | 1. offset to order (*) |\n // | | 0x20 | | 2. takerAssetFillAmount |\n // | | 0x40 | | 3. offset to signature (*) |\n // | Data | | 12 * 32 | order: |\n // | | 0x000 | | 1. senderAddress |\n // | | 0x020 | | 2. makerAddress |\n // | | 0x040 | | 3. takerAddress |\n // | | 0x060 | | 4. feeRecipientAddress |\n // | | 0x080 | | 5. makerAssetAmount |\n // | | 0x0A0 | | 6. takerAssetAmount |\n // | | 0x0C0 | | 7. makerFeeAmount |\n // | | 0x0E0 | | 8. takerFeeAmount |\n // | | 0x100 | | 9. expirationTimeSeconds |\n // | | 0x120 | | 10. salt |\n // | | 0x140 | | 11. Offset to makerAssetData (*) |\n // | | 0x160 | | 12. Offset to takerAssetData (*) |\n // | | 0x180 | 32 | makerAssetData Length |\n // | | 0x1A0 | ** | makerAssetData Contents |\n // | | 0x1C0 | 32 | takerAssetData Length |\n // | | 0x1E0 | ** | takerAssetData Contents |\n // | | 0x200 | 32 | signature Length |\n // | | 0x220 | ** | signature Contents |\n\n // * Offsets are calculated from the beginning of the current area: Header, Params, Data:\n // An offset stored in the Params area is calculated from the beginning of the Params section.\n // An offset stored in the Data area is calculated from the beginning of the Data section.\n\n // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.\n\n // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html\n\n bytes4 fillOrderSelector = this.fillOrder.selector;\n\n assembly {\n\n // Areas below may use the following variables:\n // 1. <area>Start -- Start of this area in memory\n // 2. <area>End -- End of this area in memory. This value may\n // be precomputed (before writing contents),\n // or it may be computed as contents are written.\n // 3. <area>Offset -- Current offset into area. If an area's End\n // is precomputed, this variable tracks the\n // offsets of contents as they are written.\n\n /////// Setup Header Area ///////\n // Load free memory pointer\n let headerAreaStart := mload(0x40)\n mstore(headerAreaStart, fillOrderSelector)\n let headerAreaEnd := add(headerAreaStart, 0x4)\n\n /////// Setup Params Area ///////\n // This area is preallocated and written to later.\n // This is because we need to fill in offsets that have not yet been calculated.\n let paramsAreaStart := headerAreaEnd\n let paramsAreaEnd := add(paramsAreaStart, 0x60)\n let paramsAreaOffset := paramsAreaStart\n\n /////// Setup Data Area ///////\n let dataAreaStart := paramsAreaEnd\n let dataAreaEnd := dataAreaStart\n\n // Offset from the source data we're reading from\n let sourceOffset := order\n // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.\n let arrayLenBytes := 0\n let arrayLenWords := 0\n\n /////// Write order Struct ///////\n // Write memory location of Order, relative to the start of the\n // parameter list, then increment the paramsAreaOffset respectively.\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n // Write values for each field in the order\n // It would be nice to use a loop, but we save on gas by writing\n // the stores sequentially.\n mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress\n mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress\n mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress\n mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress\n mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount\n mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount\n mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount\n mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount\n mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds\n mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt\n mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData\n mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData\n dataAreaEnd := add(dataAreaEnd, 0x180)\n sourceOffset := add(sourceOffset, 0x180)\n\n // Write offset to <order.makerAssetData>\n mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.makerAssetData>\n sourceOffset := mload(add(order, 0x140)) // makerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.makerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.makerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Write offset to <order.takerAssetData>\n mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.takerAssetData>\n sourceOffset := mload(add(order, 0x160)) // takerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.takerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.takerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n /////// Write takerAssetFillAmount ///////\n mstore(paramsAreaOffset, takerAssetFillAmount)\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n /////// Write signature ///////\n // Write offset to paramsArea\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n\n // Calculate length of signature\n sourceOffset := signature\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of signature\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of signature\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Execute delegatecall\n let success := delegatecall(\n gas, // forward all gas, TODO: look into gas consumption of assert/throw\n address, // call address of this contract\n headerAreaStart, // pointer to start of input\n sub(dataAreaEnd, headerAreaStart), // length of input\n headerAreaStart, // write output over input\n 128 // output size is 128 bytes\n )\n switch success\n case 0 {\n mstore(fillResults, 0)\n mstore(add(fillResults, 32), 0)\n mstore(add(fillResults, 64), 0)\n mstore(add(fillResults, 96), 0)\n }\n case 1 {\n mstore(fillResults, mload(headerAreaStart))\n mstore(add(fillResults, 32), mload(add(headerAreaStart, 32)))\n mstore(add(fillResults, 64), mload(add(headerAreaStart, 64)))\n mstore(add(fillResults, 96), mload(add(headerAreaStart, 96)))\n }\n }\n return fillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n {\n for (uint256 i = 0; i < orders.length; i++) {\n fillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n }\n }\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n {\n for (uint256 i = 0; i < orders.length; i++) {\n fillOrKillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n }\n }\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n {\n for (uint256 i = 0; i < orders.length; i++) {\n fillOrderNoThrow(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n }\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory takerAssetData = orders[0].takerAssetData;\n \n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being sold by taker is the same for each order.\n // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.\n orders[i].takerAssetData = takerAssetData;\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // HACK: the proxyId is \"popped\" from the byte array before a fill is settled\n // by subtracting from the length of the array. Since the popped byte is \n // still in memory, we can \"unpop\" it by incrementing the length of the byte array.\n assembly {\n let len := mload(takerAssetData)\n mstore(takerAssetData, add(len, 1))\n }\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount == takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory takerAssetData = orders[0].takerAssetData;\n\n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being sold by taker is the same for each order.\n // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.\n orders[i].takerAssetData = takerAssetData;\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount == takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n\n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[i].makerAssetData = makerAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // HACK: the proxyId is \"popped\" from the byte array before a fill is settled\n // by subtracting from the length of the array. Since the popped byte is \n // still in memory, we can \"unpop\" it by incrementing the length of the byte array.\n assembly {\n let len := mload(makerAssetData)\n mstore(makerAssetData, add(len, 1))\n }\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount == makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n\n for (uint256 i = 0; i < orders.length; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[i].makerAssetData = makerAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount == makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public\n {\n for (uint256 i = 0; i < orders.length; i++) {\n cancelOrder(orders[i]);\n }\n }\n}\n", "current/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract IAssetProxyDispatcher {\n\n /// @dev Registers an asset proxy to an asset proxy id.\n /// An id can only be assigned to a single proxy at a given time.\n /// @param assetProxyId Id to register`newAssetProxy` under.\n /// @param newAssetProxy Address of new asset proxy to register, or 0x0 to unset assetProxyId.\n /// @param oldAssetProxy Existing asset proxy to overwrite, or 0x0 if assetProxyId is currently unused.\n function registerAssetProxy(\n uint8 assetProxyId,\n address newAssetProxy,\n address oldAssetProxy\n )\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(uint8 assetProxyId)\n external\n view\n returns (address);\n}\n", "current/protocol/Exchange/interfaces/IExchangeCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\ncontract IExchangeCore {\n\n /// @dev Cancels all orders reated by sender with a salt less than or equal to the specified salt value.\n /// @param salt Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 salt)\n external;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n", "current/protocol/Exchange/interfaces/IMatchOrders.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n /// TODO: Make this function external once supported by Solidity (See Solidity Issues #3199, #1603)\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n", - "current/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validator Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validator,\n bool approval\n )\n external;\n}\n", + "current/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validator Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validator,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signer Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n", "current/protocol/Exchange/interfaces/ITransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.4.24;\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signer Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signer,\n bytes data,\n bytes signature\n )\n external;\n}\n", "current/protocol/Exchange/interfaces/IValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.23;\n\ncontract IValidator {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n", "current/protocol/Exchange/interfaces/IWallet.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract IWallet {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n", @@ -1873,7 +1900,7 @@ "current/protocol/Exchange/mixins/MExchangeCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\nimport \"../interfaces/IExchangeCore.sol\";\n\ncontract MExchangeCore is\n IExchangeCore\n{\n // Fill event is emitted whenever an order is filled.\n event Fill(\n address indexed makerAddress,\n address takerAddress,\n address indexed feeRecipientAddress,\n uint256 makerAssetFilledAmount,\n uint256 takerAssetFilledAmount,\n uint256 makerFeePaid,\n uint256 takerFeePaid,\n bytes32 indexed orderHash,\n bytes makerAssetData,\n bytes takerAssetData\n );\n\n // Cancel event is emitted whenever an individual order is cancelled.\n event Cancel(\n address indexed makerAddress,\n address indexed feeRecipientAddress,\n bytes32 indexed orderHash,\n bytes makerAssetData,\n bytes takerAssetData\n );\n\n // CancelUpTo event is emitted whenever `cancelOrdersUpTo` is executed succesfully.\n event CancelUpTo(\n address indexed makerAddress,\n uint256 makerEpoch\n );\n\n /// @dev Updates state with results of a fill order.\n /// @param order that was filled.\n /// @param takerAddress Address of taker who filled the order.\n /// @param orderTakerAssetFilledAmount Amount of order already filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function updateFilledState(\n LibOrder.Order memory order,\n address takerAddress,\n bytes32 orderHash,\n uint256 orderTakerAssetFilledAmount,\n LibFillResults.FillResults memory fillResults\n )\n internal;\n\n /// @dev Updates state with results of cancelling an order.\n /// State is only updated if the order is currently fillable.\n /// Otherwise, updating state would have no effect.\n /// @param order that was cancelled.\n /// @param orderHash Hash of order that was cancelled.\n function updateCancelledState(\n LibOrder.Order memory order,\n bytes32 orderHash\n )\n internal;\n\n /// @dev Validates context for fillOrder. Succeeds or throws.\n /// @param order to be filled.\n /// @param orderInfo Status, orderHash, and amount already filled of order.\n /// @param takerAddress Address of order taker.\n /// @param takerAssetFillAmount Desired amount of order to fill by taker.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param signature Proof that the orders was created by its maker.\n function assertValidFill(\n LibOrder.Order memory order,\n LibOrder.OrderInfo memory orderInfo,\n address takerAddress,\n uint256 takerAssetFillAmount,\n uint256 takerAssetFilledAmount,\n bytes memory signature\n )\n internal\n view;\n\n\n /// @dev Validates context for cancelOrder. Succeeds or throws.\n /// @param order to be cancelled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n function assertValidCancel(\n LibOrder.Order memory order,\n LibOrder.OrderInfo memory orderInfo\n )\n internal\n view;\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.FillResults memory fillResults);\n}\n", "current/protocol/Exchange/mixins/MMatchOrders.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\nimport \"../interfaces/IMatchOrders.sol\";\n\ncontract MMatchOrders is\n IMatchOrders\n{\n\n /// @dev Validates context for matchOrders. Succeeds or throws.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n function assertValidMatch(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder\n )\n internal\n pure;\n\n /// @dev Calculates fill amounts for the matched orders.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the leftOrder order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.\n /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n function calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftOrderTakerAssetFilledAmount,\n uint256 rightOrderTakerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n", "current/protocol/Exchange/mixins/MSettlement.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\ncontract MSettlement {\n\n /// @dev Settles an order by transferring assets between counterparties.\n /// @param order Order struct containing order specifications.\n /// @param takerAddress Address selling takerAsset and buying makerAsset.\n /// @param fillResults Amounts to be filled and fees paid by maker and taker.\n function settleOrder(\n LibOrder.Order memory order,\n address takerAddress,\n LibFillResults.FillResults memory fillResults\n )\n internal;\n\n /// @dev Settles matched order by transferring appropriate funds between order makers, taker, and fee recipient.\n /// @param leftOrder First matched order.\n /// @param rightOrder Second matched order.\n /// @param takerAddress Address that matched the orders. The taker receives the spread between orders as profit.\n /// @param matchedFillResults Struct holding amounts to transfer between makers, taker, and fee recipients.\n function settleMatchedOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n address takerAddress,\n LibFillResults.MatchedFillResults memory matchedFillResults\n )\n internal;\n}\n", - "current/protocol/Exchange/mixins/MSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../interfaces/ISignatureValidator.sol\";\n\ncontract MSignatureValidator is\n ISignatureValidator\n{\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n Invalid, // 0x01\n EIP712, // 0x02\n EthSign, // 0x03\n Caller, // 0x04\n Wallet, // 0x05\n Validator, // 0x06\n PreSigned, // 0x07\n Trezor // 0x08\n }\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signer Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n internal\n view\n returns (bool isValid);\n}\n", + "current/protocol/Exchange/mixins/MSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../interfaces/ISignatureValidator.sol\";\n\ncontract MSignatureValidator is\n ISignatureValidator\n{\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n Invalid, // 0x01\n EIP712, // 0x02\n EthSign, // 0x03\n Caller, // 0x04\n Wallet, // 0x05\n Validator, // 0x06\n PreSigned, // 0x07\n Trezor // 0x08\n }\n}\n", "current/protocol/Exchange/mixins/MTransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.4.24;\n\nimport \"../interfaces/ITransactions.sol\";\n\ncontract MTransactions is\n ITransactions\n{\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address);\n}\n", "current/utils/LibBytes/LibBytes.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../LibMem/LibMem.sol\";\n\ncontract LibBytes is\n LibMem\n{\n\n // Revert reasons\n string constant GREATER_THAN_ZERO_LENGTH_REQUIRED = \"GREATER_THAN_ZERO_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\";\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n GREATER_THAN_ZERO_LENGTH_REQUIRED\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(mload(add(b, index)), 0xffffffffffffffffffffffff0000000000000000000000000000000000000000)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads the first 4 bytes from a byte array of arbitrary length.\n /// @param b Byte array to read first 4 bytes from.\n /// @return First 4 bytes of data.\n function readFirst4(bytes memory b)\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= 4,\n GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\n );\n assembly {\n result := mload(add(b, 32))\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytes(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\n );\n\n // Allocate memory and copy value to result\n result = new bytes(nestedBytesLength);\n memCopy(\n getMemAddress(result) + 32, // +32 skips array length\n getMemAddress(b) + index + 32,\n nestedBytesLength\n );\n\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytes(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 /* 32 bytes to store length */ + input.length,\n GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\n );\n\n // Copy <input> into <b>\n memCopy(\n getMemAddress(b) + 32 + index, // +32 to skip length of <b>\n getMemAddress(input), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function areBytesEqual(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n assembly {\n // Get the number of words occupied by <lhs>\n let lenFullWords := div(add(mload(lhs), 0x1F), 0x20)\n\n // Add 1 to the number of words, to account for the length field\n lenFullWords := add(lenFullWords, 0x1)\n\n // Test equality word-by-word.\n // Terminates early if there is a mismatch.\n for {let i := 0} lt(i, lenFullWords) {i := add(i, 1)} {\n let lhsWord := mload(add(lhs, mul(i, 0x20)))\n let rhsWord := mload(add(rhs, mul(i, 0x20)))\n equal := eq(lhsWord, rhsWord)\n if eq(equal, 0) {\n // Break\n i := lenFullWords\n }\n }\n }\n\n return equal;\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\n );\n memCopy(\n getMemAddress(dest) + 32, // +32 to skip length of <dest>\n getMemAddress(source) + 32, // +32 to skip length of <source>\n sourceLen\n );\n }\n}\n", "current/utils/LibMem/LibMem.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract LibMem\n{\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array.\n function getMemAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // Record the total number of full words to copy\n let nWords := div(length, 32)\n\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n for {let i := 0} lt(i, nWords) {i := add(i, 1)} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n\n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // Record the total number of full words to copy\n let nWords := div(length, 32)\n\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n for {let i := 0} lt(i, nWords) {i := add(i, 1)} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n\n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n}\n", @@ -1881,7 +1908,7 @@ "current/utils/Ownable/Ownable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"Only contract owner is allowed to call this method.\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n", "current/utils/SafeMath/SafeMath.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\ncontract SafeMath {\n function safeMul(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a * b;\n assert(a == 0 || c / a == b);\n return c;\n }\n\n function safeDiv(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a / b;\n return c;\n }\n\n function safeSub(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n assert(b <= a);\n return a - b;\n }\n\n function safeAdd(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a + b;\n assert(c >= a);\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n" }, - "sourceTreeHashHex": "0xbdac7c99be8aae78da0caa243219509fe75794edc345f4abbff871d28f7f907c", + "sourceTreeHashHex": "0xfb8b5627857c1784cf38486f49cbd3cf813bdc44118cf9c3361db79d72e349e1", "compiler": { "name": "solc", "version": "soljson-v0.4.24+commit.e67f0147.js", diff --git a/packages/migrations/artifacts/2.0.0/MixinSignatureValidator.json b/packages/migrations/artifacts/2.0.0/MixinSignatureValidator.json new file mode 100644 index 000000000..de99296c9 --- /dev/null +++ b/packages/migrations/artifacts/2.0.0/MixinSignatureValidator.json @@ -0,0 +1,224 @@ +{ + "schemaVersion": "2.0.0", + "contractName": "MixinSignatureValidator", + "compilerOutput": { + "abi": [ + { + "constant": false, + "inputs": [ + { + "name": "hash", + "type": "bytes32" + }, + { + "name": "signer", + "type": "address" + }, + { + "name": "signature", + "type": "bytes" + } + ], + "name": "preSign", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "validator", + "type": "address" + }, + { + "name": "approval", + "type": "bool" + } + ], + "name": "setSignatureValidatorApproval", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "address" + } + ], + "name": "allowedValidators", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "bytes32" + }, + { + "name": "", + "type": "address" + } + ], + "name": "preSigned", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "hash", + "type": "bytes32" + }, + { + "name": "signer", + "type": "address" + }, + { + "name": "signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "name": "isValid", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "salt", + "type": "uint256" + }, + { + "name": "signer", + "type": "address" + }, + { + "name": "data", + "type": "bytes" + }, + { + "name": "signature", + "type": "bytes" + } + ], + "name": "executeTransaction", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "0x", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "0x", + "opcodes": "", + "sourceMap": "" + } + } + }, + "sources": { + "current/protocol/Exchange/MixinSignatureValidator.sol": { + "id": 0 + }, + "current/protocol/Exchange/interfaces/ISignatureValidator.sol": { + "id": 1 + }, + "current/protocol/Exchange/interfaces/ITransactions.sol": { + "id": 2 + }, + "current/protocol/Exchange/interfaces/IValidator.sol": { + "id": 3 + }, + "current/protocol/Exchange/interfaces/IWallet.sol": { + "id": 4 + }, + "current/protocol/Exchange/libs/LibExchangeErrors.sol": { + "id": 5 + }, + "current/protocol/Exchange/mixins/MTransactions.sol": { + "id": 6 + }, + "current/utils/LibBytes/LibBytes.sol": { + "id": 7 + }, + "current/utils/LibMem/LibMem.sol": { + "id": 8 + } + }, + "sourceCodes": { + "current/protocol/Exchange/MixinSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./interfaces/ISignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./interfaces/IWallet.sol\";\nimport \"./interfaces/IValidator.sol\";\n\ncontract MixinSignatureValidator is\n LibBytes,\n LibExchangeErrors,\n ISignatureValidator,\n MTransactions\n{\n // Personal message headers\n string constant ETH_PERSONAL_MESSAGE = \"\\x19Ethereum Signed Message:\\n32\";\n string constant TREZOR_PERSONAL_MESSAGE = \"\\x19Ethereum Signed Message:\\n\\x41\";\n\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n Invalid, // 0x01\n EIP712, // 0x02\n EthSign, // 0x03\n Caller, // 0x04\n Wallet, // 0x05\n Validator, // 0x06\n PreSigned, // 0x07\n Trezor // 0x08\n }\n\n // Mapping of hash => signer => signed\n mapping (bytes32 => mapping (address => bool)) public preSigned;\n\n // Mapping of signer => validator => approved\n mapping (address => mapping (address => bool)) public allowedValidators;\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external\n {\n require(\n isValidSignature(hash, signer, signature),\n INVALID_SIGNATURE\n );\n preSigned[hash][signer] = true;\n }\n\n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validator Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validator,\n bool approval\n )\n external\n {\n address signer = getCurrentContextAddress();\n allowedValidators[signer][validator] = approval;\n }\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32 byte hash.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return True if the address recovered from the provided signature matches the input signer address.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n // TODO: Domain separation: make hash depend on role. (Taker sig should not be valid as maker sig, etc.)\n require(\n signature.length > 0,\n LENGTH_GREATER_THAN_0_REQUIRED\n );\n\n // Pop last byte off of signature byte array.\n SignatureType signatureType = SignatureType(uint8(popLastByte(signature)));\n\n // Variables are not scoped in Solidity.\n uint8 v;\n bytes32 r;\n bytes32 s;\n address recovered;\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n revert(SIGNATURE_ILLEGAL);\n\n // Always invalid signature.\n // Like Illegal, this is always implicitly available and therefore\n // offered explicitly. It can be implicitly created by providing\n // a correctly formatted but incorrect signature.\n } else if (signatureType == SignatureType.Invalid) {\n require(\n signature.length == 0,\n LENGTH_0_REQUIRED\n );\n isValid = false;\n return isValid;\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(hash, v, r, s);\n isValid = signer == recovered;\n return isValid;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(ETH_PERSONAL_MESSAGE, hash)),\n v,\n r,\n s\n );\n isValid = signer == recovered;\n return isValid;\n\n // Implicitly signed by caller.\n // The signer has initiated the call. In the case of non-contract\n // accounts it means the transaction itself was signed.\n // Example: let's say for a particular operation three signatures\n // A, B and C are required. To submit the transaction, A and B can\n // give a signature to C, who can then submit the transaction using\n // `Caller` for his own signature. Or A and C can sign and B can\n // submit using `Caller`. Having `Caller` allows this flexibility.\n } else if (signatureType == SignatureType.Caller) {\n require(\n signature.length == 0,\n LENGTH_0_REQUIRED\n );\n isValid = signer == msg.sender;\n return isValid;\n\n // Signature verified by wallet contract.\n // If used with an order, the maker of the order is the wallet contract.\n } else if (signatureType == SignatureType.Wallet) {\n isValid = IWallet(signer).isValidSignature(hash, signature);\n return isValid;\n\n // Signature verified by validator contract.\n // If used with an order, the maker of the order can still be an EOA.\n // A signature using this type should be encoded as:\n // | Offset | Length | Contents |\n // | 0x00 | x | Signature to validate |\n // | 0x00 + x | 20 | Address of validator contract |\n // | 0x14 + x | 1 | Signature type is always \"\\x06\" |\n } else if (signatureType == SignatureType.Validator) {\n // Pop last 20 bytes off of signature byte array.\n address validator = popLast20Bytes(signature);\n // Ensure signer has approved validator.\n if (!allowedValidators[signer][validator]) {\n return false;\n }\n isValid = IValidator(validator).isValidSignature(\n hash,\n signer,\n signature\n );\n return isValid;\n\n // Signer signed hash previously using the preSign function.\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signer];\n return isValid;\n\n // Signature from Trezor hardware wallet.\n // It differs from web3.eth_sign in the encoding of message length\n // (Bitcoin varint encoding vs ascii-decimal, the latter is not\n // self-terminating which leads to ambiguities).\n // See also:\n // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36\n } else if (signatureType == SignatureType.Trezor) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(TREZOR_PERSONAL_MESSAGE, hash)),\n v,\n r,\n s\n );\n isValid = signer == recovered;\n return isValid;\n\n // Signer signed hash previously using the preSign function\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signer];\n return isValid;\n }\n\n // Anything else is illegal (We do not return false because\n // the signature may actually be valid, just not in a format\n // that we currently support. In this case returning false\n // may lead the caller to incorrectly believe that the\n // signature was invalid.)\n revert(SIGNATURE_UNSUPPORTED);\n }\n}\n", + "current/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validator Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validator,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signer Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n", + "current/protocol/Exchange/interfaces/ITransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.4.24;\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signer Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signer,\n bytes data,\n bytes signature\n )\n external;\n}\n", + "current/protocol/Exchange/interfaces/IValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.23;\n\ncontract IValidator {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n", + "current/protocol/Exchange/interfaces/IWallet.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract IWallet {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n", + "current/protocol/Exchange/libs/LibExchangeErrors.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract LibExchangeErrors {\n /// Order validation errors ///\n string constant ORDER_UNFILLABLE = \"ORDER_UNFILLABLE\"; // Order cannot be filled.\n string constant INVALID_MAKER = \"INVALID_MAKER\"; // Invalid makerAddress.\n string constant INVALID_TAKER = \"INVALID_TAKER\"; // Invalid takerAddress.\n string constant INVALID_SENDER = \"INVALID_SENDER\"; // Invalid `msg.sender`.\n string constant INVALID_ORDER_SIGNATURE = \"INVALID_ORDER_SIGNATURE\"; // Signature validation failed. \n \n /// fillOrder validation errors ///\n string constant INVALID_TAKER_AMOUNT = \"INVALID_TAKER_AMOUNT\"; // takerAssetFillAmount cannot equal 0.\n string constant ROUNDING_ERROR = \"ROUNDING_ERROR\"; // Rounding error greater than 0.1% of takerAssetFillAmount. \n \n /// Signature validation errors ///\n string constant INVALID_SIGNATURE = \"INVALID_SIGNATURE\"; // Signature validation failed. \n string constant SIGNATURE_ILLEGAL = \"SIGNATURE_ILLEGAL\"; // Signature type is illegal.\n string constant SIGNATURE_UNSUPPORTED = \"SIGNATURE_UNSUPPORTED\"; // Signature type unsupported.\n \n /// cancelOrdersUptTo errors ///\n string constant INVALID_NEW_MAKER_EPOCH = \"INVALID_NEW_MAKER_EPOCH\"; // Specified salt must be greater than or equal to existing makerEpoch.\n\n /// fillOrKillOrder errors ///\n string constant COMPLETE_FILL_FAILED = \"COMPLETE_FILL_FAILED\"; // Desired takerAssetFillAmount could not be completely filled. \n\n /// matchOrders errors ///\n string constant NEGATIVE_SPREAD_REQUIRED = \"NEGATIVE_SPREAD_REQUIRED\"; // Matched orders must have a negative spread.\n\n /// Transaction errors ///\n string constant REENTRANCY_ILLEGAL = \"REENTRANCY_ILLEGAL\"; // Recursive reentrancy is not allowed. \n string constant INVALID_TX_HASH = \"INVALID_TX_HASH\"; // Transaction has already been executed. \n string constant INVALID_TX_SIGNATURE = \"INVALID_TX_SIGNATURE\"; // Signature validation failed. \n string constant FAILED_EXECUTION = \"FAILED_EXECUTION\"; // Transaction execution failed. \n \n /// registerAssetProxy errors ///\n string constant ASSET_PROXY_MISMATCH = \"ASSET_PROXY_MISMATCH\"; // oldAssetProxy proxy does not match currentAssetProxy. \n string constant ASSET_PROXY_ID_MISMATCH = \"ASSET_PROXY_ID_MISMATCH\"; // newAssetProxyId does not match given assetProxyId.\n\n /// Length validation errors ///\n string constant LENGTH_GREATER_THAN_0_REQUIRED = \"LENGTH_GREATER_THAN_0_REQUIRED\"; // Byte array must have a length greater than 0.\n string constant LENGTH_0_REQUIRED = \"LENGTH_1_REQUIRED\"; // Byte array must have a length of 1.\n string constant LENGTH_65_REQUIRED = \"LENGTH_66_REQUIRED\"; // Byte array must have a length of 66.\n}\n", + "current/protocol/Exchange/mixins/MTransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.4.24;\n\nimport \"../interfaces/ITransactions.sol\";\n\ncontract MTransactions is\n ITransactions\n{\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address);\n}\n", + "current/utils/LibBytes/LibBytes.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../LibMem/LibMem.sol\";\n\ncontract LibBytes is\n LibMem\n{\n\n // Revert reasons\n string constant GREATER_THAN_ZERO_LENGTH_REQUIRED = \"GREATER_THAN_ZERO_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\";\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n GREATER_THAN_ZERO_LENGTH_REQUIRED\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(mload(add(b, index)), 0xffffffffffffffffffffffff0000000000000000000000000000000000000000)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads the first 4 bytes from a byte array of arbitrary length.\n /// @param b Byte array to read first 4 bytes from.\n /// @return First 4 bytes of data.\n function readFirst4(bytes memory b)\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= 4,\n GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\n );\n assembly {\n result := mload(add(b, 32))\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytes(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\n );\n\n // Allocate memory and copy value to result\n result = new bytes(nestedBytesLength);\n memCopy(\n getMemAddress(result) + 32, // +32 skips array length\n getMemAddress(b) + index + 32,\n nestedBytesLength\n );\n\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytes(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 /* 32 bytes to store length */ + input.length,\n GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\n );\n\n // Copy <input> into <b>\n memCopy(\n getMemAddress(b) + 32 + index, // +32 to skip length of <b>\n getMemAddress(input), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function areBytesEqual(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n assembly {\n // Get the number of words occupied by <lhs>\n let lenFullWords := div(add(mload(lhs), 0x1F), 0x20)\n\n // Add 1 to the number of words, to account for the length field\n lenFullWords := add(lenFullWords, 0x1)\n\n // Test equality word-by-word.\n // Terminates early if there is a mismatch.\n for {let i := 0} lt(i, lenFullWords) {i := add(i, 1)} {\n let lhsWord := mload(add(lhs, mul(i, 0x20)))\n let rhsWord := mload(add(rhs, mul(i, 0x20)))\n equal := eq(lhsWord, rhsWord)\n if eq(equal, 0) {\n // Break\n i := lenFullWords\n }\n }\n }\n\n return equal;\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\n );\n memCopy(\n getMemAddress(dest) + 32, // +32 to skip length of <dest>\n getMemAddress(source) + 32, // +32 to skip length of <source>\n sourceLen\n );\n }\n}\n", + "current/utils/LibMem/LibMem.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract LibMem\n{\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array.\n function getMemAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // Record the total number of full words to copy\n let nWords := div(length, 32)\n\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n for {let i := 0} lt(i, nWords) {i := add(i, 1)} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n\n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // Record the total number of full words to copy\n let nWords := div(length, 32)\n\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n for {let i := 0} lt(i, nWords) {i := add(i, 1)} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n\n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n}\n" + }, + "sourceTreeHashHex": "0x27d8cf9ba24d5435c87f0770658d8623c87b8a0a601d5b3d483b2aab5d7824a8", + "compiler": { + "name": "solc", + "version": "soljson-v0.4.24+commit.e67f0147.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + } + } + }, + "networks": {} +}
\ No newline at end of file diff --git a/packages/migrations/artifacts/2.0.0/TestAssetDataDecoders.json b/packages/migrations/artifacts/2.0.0/TestAssetDataDecoders.json index 376c8dd95..d5d043761 100644 --- a/packages/migrations/artifacts/2.0.0/TestAssetDataDecoders.json +++ b/packages/migrations/artifacts/2.0.0/TestAssetDataDecoders.json @@ -260,14 +260,14 @@ "evm": { "bytecode": { "linkReferences": {}, - "object": "0x608060405260008054600160a060020a0319163317905561161f806100256000396000f3006080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100be578063494503d4146100e0578063563c875d14610116578063707129391461013657806372c2f527146101565780638da5cb5b146101855780639ad267441461019a578063a85e59e4146101ba578063ae25532e146101da578063b9181611146101fc578063d39de6e914610229578063f2fde38b1461024b575b600080fd5b3480156100ca57600080fd5b506100de6100d9366004611114565b61026b565b005b3480156100ec57600080fd5b506101006100fb3660046112e6565b6103b2565b60405161010d9190611410565b60405180910390f35b34801561012257600080fd5b506100de610131366004611174565b6103da565b34801561014257600080fd5b506100de610151366004611114565b6104cd565b34801561016257600080fd5b506101766101713660046112b1565b61069b565b60405161010d9392919061148a565b34801561019157600080fd5b506101006106b6565b3480156101a657600080fd5b506100de6101b536600461113a565b6106c5565b3480156101c657600080fd5b506100de6101d5366004611234565b610887565b3480156101e657600080fd5b506101ef610933565b60405161010d9190611500565b34801561020857600080fd5b5061021c610217366004611114565b610939565b60405161010d91906114d1565b34801561023557600080fd5b5061023e61094e565b60405161010d91906114c0565b34801561025757600080fd5b506100de610266366004611114565b6109b0565b600054600160a060020a031633146102a15760405160e560020a62461bcd028152600401610298906114f0565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156103165760405160e560020a62461bcd02815260040161029891906114df565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106103c057fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff1615156104475760405160e560020a62461bcd02815260040161029891906114df565b50600090505b84518110156104c6576104be858281518110151561046757fe5b90602001906020020151858381518110151561047f57fe5b90602001906020020151858481518110151561049757fe5b9060200190602002015185858151811015156104af57fe5b90602001906020020151610a18565b60010161044d565b5050505050565b60008054600160a060020a031633146104fb5760405160e560020a62461bcd028152600401610298906114f0565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105715760405160e560020a62461bcd02815260040161029891906114df565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b6002548110156106615781600160a060020a03166002828154811015156105b757fe5b600091825260209091200154600160a060020a03161415610659576002805460001981019081106105e457fe5b60009182526020909120015460028054600160a060020a03909216918390811061060a57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906106539082610edb565b50610661565b600101610594565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60008060606106a984610b99565b9196909550909350915050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000602082015290821061071f5760405160e560020a62461bcd02815260040161029891906114df565b5081600160a060020a031660028281548110151561073957fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107aa5760405160e560020a62461bcd02815260040161029891906114df565b50600160a060020a0382166000908152600160205260409020805460ff191690556002805460001981019081106107dd57fe5b60009182526020909120015460028054600160a060020a03909216918390811061080357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560028054600019019061084c9082610edb565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156108f45760405160e560020a62461bcd02815260040161029891906114df565b506104c685858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050848484610a18565b60025b90565b60016020526000908152604090205460ff1681565b606060028054806020026020016040519081016040528092919081815260200182805480156109a657602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610988575b5050505050905090565b600054600160a060020a031633146109dd5760405160e560020a62461bcd028152600401610298906114f0565b600160a060020a03811615610a15576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60408051808201909152600e81527f494e56414c49445f414d4f554e540000000000000000000000000000000000006020820152600090819060609060018514610a785760405160e560020a62461bcd02815260040161029891906114df565b50610a8287610b99565b925092509250600081511115610b14576040517fb88d4fde000000000000000000000000000000000000000000000000000000008152600160a060020a0384169063b88d4fde90610add908990899087908790600401611446565b600060405180830381600087803b158015610af757600080fd5b505af1158015610b0b573d6000803e3d6000fd5b50505050610b90565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038416906323b872dd90610b5d9089908990879060040161141e565b600060405180830381600087803b158015610b7757600080fd5b505af1158015610b8b573d6000803e3d6000fd5b505050505b50505050505050565b6000806060610ba9846000610bd7565b9250610bb6846014610c7e565b9150603484511115610bd057610bcd846034610c91565b90505b9193909250565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610c615760405160e560020a62461bcd02815260040161029891906114df565b50506014818301810151910190600160a060020a03165b92915050565b6000610c8a8383610d8a565b9392505050565b60606000610c9f8484610c7e565b905060208301925080830184511015606060405190810160405280603081526020017f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455381526020017f5f4c454e4754485f524551554952454400000000000000000000000000000000815250901515610d2e5760405160e560020a62461bcd02815260040161029891906114df565b50806040519080825280601f01601f191660200182016040528015610d5d578160200160208202803883390190505b509150610d83610d6c83610936565b60200184610d7987610936565b0160200183610e1e565b5092915050565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610e145760405160e560020a62461bcd02815260040161029891906114df565b5050016020015190565b6020811015610e48576001816020036101000a038019835116818551168082178652505050610ed6565b82821415610e5557610ed6565b82821115610e9b5760208104602082039150818301828501815160005b84811015610e90578651885260209788019790960195600101610e72565b50905250610ed69050565b60208104602082039150818301828501845160005b84811015610ecf5783518352601f199384019390920191600101610eb0565b5086525050505b505050565b815481835581811115610ed657600083815260209020610ed691810190830161093691905b80821115610f145760008155600101610f00565b5090565b6000610c8a8235611588565b6000601f82018313610f3557600080fd5b8135610f48610f4382611535565b61150e565b91508181835260208401935060208101905083856020840282011115610f6d57600080fd5b60005b83811015610f995781610f838882610f18565b8452506020928301929190910190600101610f70565b5050505092915050565b6000601f82018313610fb457600080fd5b8135610fc2610f4382611535565b81815260209384019390925082018360005b83811015610f995781358601610fea88826110b9565b8452506020928301929190910190600101610fd4565b6000601f8201831361101157600080fd5b813561101f610f4382611535565b9150818183526020840193506020810190508385602084028201111561104457600080fd5b60005b83811015610f99578161105a8882611108565b8452506020928301929190910190600101611047565b600080601f8301841361108257600080fd5b50813567ffffffffffffffff81111561109a57600080fd5b6020830191508360018202830111156110b257600080fd5b9250929050565b6000601f820183136110ca57600080fd5b81356110d8610f4382611556565b915080825260208301602083018583830111156110f457600080fd5b6110ff83828461159f565b50505092915050565b6000610c8a8235610936565b60006020828403121561112657600080fd5b60006111328484610f18565b949350505050565b6000806040838503121561114d57600080fd5b60006111598585610f18565b925050602061116a85828601611108565b9150509250929050565b6000806000806080858703121561118a57600080fd5b843567ffffffffffffffff8111156111a157600080fd5b6111ad87828801610fa3565b945050602085013567ffffffffffffffff8111156111ca57600080fd5b6111d687828801610f24565b935050604085013567ffffffffffffffff8111156111f357600080fd5b6111ff87828801610f24565b925050606085013567ffffffffffffffff81111561121c57600080fd5b61122887828801611000565b91505092959194509250565b60008060008060006080868803121561124c57600080fd5b853567ffffffffffffffff81111561126357600080fd5b61126f88828901611070565b9550955050602061128288828901610f18565b935050604061129388828901610f18565b92505060606112a488828901611108565b9150509295509295909350565b6000602082840312156112c357600080fd5b813567ffffffffffffffff8111156112da57600080fd5b611132848285016110b9565b6000602082840312156112f857600080fd5b60006111328484611108565b61130d81611588565b82525050565b600061131e82611584565b8084526020840193506113308361157e565b60005b8281101561136057611346868351611304565b61134f8261157e565b602096909601959150600101611333565b5093949350505050565b61130d81611594565b600061137e82611584565b8084526113928160208601602086016115ab565b61139b816115db565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b61130d81610936565b61130d81611599565b60208101610c788284611304565b6060810161142c8286611304565b6114396020830185611304565b61113260408301846113fe565b608081016114548287611304565b6114616020830186611304565b61146e60408301856113fe565b81810360608301526114808184611373565b9695505050505050565b606081016114988286611304565b6114a560208301856113fe565b81810360408301526114b78184611373565b95945050505050565b60208082528101610c8a8184611313565b60208101610c78828461136a565b60208082528101610c8a8184611373565b60208082528101610c78816113a8565b60208101610c788284611407565b60405181810167ffffffffffffffff8111828210171561152d57600080fd5b604052919050565b600067ffffffffffffffff82111561154c57600080fd5b5060209081020190565b600067ffffffffffffffff82111561156d57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156115c65781810151838201526020016115ae565b838111156115d5576000848401525b50505050565b601f01601f1916905600a265627a7a72305820104836f2297bede9af7cc5e4ad922029c0c46e1ab76cceef39647079414c70786c6578706572696d656e74616cf50037", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x161F DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xE0 JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0x72C2F527 EQ PUSH2 0x156 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x185 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x1BA JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1DA JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x24B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0xD9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x26B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0xFB CALLDATASIZE PUSH1 0x4 PUSH2 0x12E6 JUMP JUMPDEST PUSH2 0x3B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1410 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x1174 JUMP JUMPDEST PUSH2 0x3DA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x4CD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x162 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x171 CALLDATASIZE PUSH1 0x4 PUSH2 0x12B1 JUMP JUMPDEST PUSH2 0x69B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x148A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0x6B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x113A JUMP JUMPDEST PUSH2 0x6C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1234 JUMP JUMPDEST PUSH2 0x887 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EF PUSH2 0x933 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1500 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21C PUSH2 0x217 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x939 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x14D1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x235 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x94E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x14C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x9B0 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2A1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x316 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x3C0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x447 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x4C6 JUMPI PUSH2 0x4BE DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x467 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x47F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x497 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4AF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x44D JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4FB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x571 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x661 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5B7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x659 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x5E4 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x60A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x653 SWAP1 DUP3 PUSH2 0xEDB JUMP JUMPDEST POP PUSH2 0x661 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x594 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x6A9 DUP5 PUSH2 0xB99 JUMP JUMPDEST SWAP2 SWAP7 SWAP1 SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x71F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x739 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x7AA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x7DD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x803 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x84C SWAP1 DUP3 PUSH2 0xEDB JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8F4 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH2 0x4C6 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x2 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x9A6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x988 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x9DD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0xA15 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x60 SWAP1 PUSH1 0x1 DUP6 EQ PUSH2 0xA78 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH2 0xA82 DUP8 PUSH2 0xB99 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0xB14 JUMPI PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0xADD SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1446 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB0B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0xB90 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0xB5D SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x141E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0xBA9 DUP5 PUSH1 0x0 PUSH2 0xBD7 JUMP JUMPDEST SWAP3 POP PUSH2 0xBB6 DUP5 PUSH1 0x14 PUSH2 0xC7E JUMP JUMPDEST SWAP2 POP PUSH1 0x34 DUP5 MLOAD GT ISZERO PUSH2 0xBD0 JUMPI PUSH2 0xBCD DUP5 PUSH1 0x34 PUSH2 0xC91 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xC61 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP4 DUP4 PUSH2 0xD8A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xC9F DUP5 DUP5 PUSH2 0xC7E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xD2E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xD5D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH2 0xD83 PUSH2 0xD6C DUP4 PUSH2 0x936 JUMP JUMPDEST PUSH1 0x20 ADD DUP5 PUSH2 0xD79 DUP8 PUSH2 0x936 JUMP JUMPDEST ADD PUSH1 0x20 ADD DUP4 PUSH2 0xE1E JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xE14 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE48 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0xED6 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0xE55 JUMPI PUSH2 0xED6 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0xE9B JUMPI PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP2 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xE90 JUMPI DUP7 MLOAD DUP9 MSTORE PUSH1 0x20 SWAP8 DUP9 ADD SWAP8 SWAP1 SWAP7 ADD SWAP6 PUSH1 0x1 ADD PUSH2 0xE72 JUMP JUMPDEST POP SWAP1 MSTORE POP PUSH2 0xED6 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP5 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xECF JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xEB0 JUMP JUMPDEST POP DUP7 MSTORE POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xED6 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xED6 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x936 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF14 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF00 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP3 CALLDATALOAD PUSH2 0x1588 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xF35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xF48 PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST PUSH2 0x150E JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xF6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 PUSH2 0xF83 DUP9 DUP3 PUSH2 0xF18 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xF70 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xFB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xFC2 PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xFEA DUP9 DUP3 PUSH2 0x10B9 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xFD4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1011 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x101F PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x1044 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 PUSH2 0x105A DUP9 DUP3 PUSH2 0x1108 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1047 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x1082 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x109A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x10B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x10CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x10D8 PUSH2 0xF43 DUP3 PUSH2 0x1556 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x10F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10FF DUP4 DUP3 DUP5 PUSH2 0x159F JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP3 CALLDATALOAD PUSH2 0x936 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1126 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1132 DUP5 DUP5 PUSH2 0xF18 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x114D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1159 DUP6 DUP6 PUSH2 0xF18 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x116A DUP6 DUP3 DUP7 ADD PUSH2 0x1108 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x118A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11AD DUP8 DUP3 DUP9 ADD PUSH2 0xFA3 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11D6 DUP8 DUP3 DUP9 ADD PUSH2 0xF24 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11FF DUP8 DUP3 DUP9 ADD PUSH2 0xF24 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x121C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1228 DUP8 DUP3 DUP9 ADD PUSH2 0x1000 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x124C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x126F DUP9 DUP3 DUP10 ADD PUSH2 0x1070 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0x1282 DUP9 DUP3 DUP10 ADD PUSH2 0xF18 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x1293 DUP9 DUP3 DUP10 ADD PUSH2 0xF18 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x12A4 DUP9 DUP3 DUP10 ADD PUSH2 0x1108 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1132 DUP5 DUP3 DUP6 ADD PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1132 DUP5 DUP5 PUSH2 0x1108 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1588 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x131E DUP3 PUSH2 0x1584 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x1330 DUP4 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1360 JUMPI PUSH2 0x1346 DUP7 DUP4 MLOAD PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x134F DUP3 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1333 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1594 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x137E DUP3 PUSH2 0x1584 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1392 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x15AB JUMP JUMPDEST PUSH2 0x139B DUP2 PUSH2 0x15DB JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x936 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1599 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x1304 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x142C DUP3 DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1439 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1132 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x1454 DUP3 DUP8 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1461 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x146E PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x13FE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x1480 DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x1498 DUP3 DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x14A5 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x13FE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x14B7 DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC8A DUP2 DUP5 PUSH2 0x1313 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x136A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC8A DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC78 DUP2 PUSH2 0x13A8 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x1407 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x152D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x154C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x156D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x15C6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x15AE JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x15D5 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 LT 0x48 CALLDATASIZE CALLCODE 0x29 PUSH28 0xEDE9AF7CC5E4AD922029C0C46E1AB76CCEEF39647079414C70786C65 PUSH25 0x706572696D656E74616CF50037000000000000000000000000 ", + "object": "0x608060405260008054600160a060020a0319163317905561161f806100256000396000f3006080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100be578063494503d4146100e0578063563c875d14610116578063707129391461013657806372c2f527146101565780638da5cb5b146101855780639ad267441461019a578063a85e59e4146101ba578063ae25532e146101da578063b9181611146101fc578063d39de6e914610229578063f2fde38b1461024b575b600080fd5b3480156100ca57600080fd5b506100de6100d9366004611114565b61026b565b005b3480156100ec57600080fd5b506101006100fb3660046112e6565b6103b2565b60405161010d9190611410565b60405180910390f35b34801561012257600080fd5b506100de610131366004611174565b6103da565b34801561014257600080fd5b506100de610151366004611114565b6104cd565b34801561016257600080fd5b506101766101713660046112b1565b61069b565b60405161010d9392919061148a565b34801561019157600080fd5b506101006106b6565b3480156101a657600080fd5b506100de6101b536600461113a565b6106c5565b3480156101c657600080fd5b506100de6101d5366004611234565b610887565b3480156101e657600080fd5b506101ef610933565b60405161010d9190611500565b34801561020857600080fd5b5061021c610217366004611114565b610939565b60405161010d91906114d1565b34801561023557600080fd5b5061023e61094e565b60405161010d91906114c0565b34801561025757600080fd5b506100de610266366004611114565b6109b0565b600054600160a060020a031633146102a15760405160e560020a62461bcd028152600401610298906114f0565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156103165760405160e560020a62461bcd02815260040161029891906114df565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106103c057fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff1615156104475760405160e560020a62461bcd02815260040161029891906114df565b50600090505b84518110156104c6576104be858281518110151561046757fe5b90602001906020020151858381518110151561047f57fe5b90602001906020020151858481518110151561049757fe5b9060200190602002015185858151811015156104af57fe5b90602001906020020151610a18565b60010161044d565b5050505050565b60008054600160a060020a031633146104fb5760405160e560020a62461bcd028152600401610298906114f0565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105715760405160e560020a62461bcd02815260040161029891906114df565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b6002548110156106615781600160a060020a03166002828154811015156105b757fe5b600091825260209091200154600160a060020a03161415610659576002805460001981019081106105e457fe5b60009182526020909120015460028054600160a060020a03909216918390811061060a57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906106539082610edb565b50610661565b600101610594565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60008060606106a984610b99565b9196909550909350915050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000602082015290821061071f5760405160e560020a62461bcd02815260040161029891906114df565b5081600160a060020a031660028281548110151561073957fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107aa5760405160e560020a62461bcd02815260040161029891906114df565b50600160a060020a0382166000908152600160205260409020805460ff191690556002805460001981019081106107dd57fe5b60009182526020909120015460028054600160a060020a03909216918390811061080357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560028054600019019061084c9082610edb565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156108f45760405160e560020a62461bcd02815260040161029891906114df565b506104c685858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050848484610a18565b60025b90565b60016020526000908152604090205460ff1681565b606060028054806020026020016040519081016040528092919081815260200182805480156109a657602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610988575b5050505050905090565b600054600160a060020a031633146109dd5760405160e560020a62461bcd028152600401610298906114f0565b600160a060020a03811615610a15576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60408051808201909152600e81527f494e56414c49445f414d4f554e540000000000000000000000000000000000006020820152600090819060609060018514610a785760405160e560020a62461bcd02815260040161029891906114df565b50610a8287610b99565b925092509250600081511115610b14576040517fb88d4fde000000000000000000000000000000000000000000000000000000008152600160a060020a0384169063b88d4fde90610add908990899087908790600401611446565b600060405180830381600087803b158015610af757600080fd5b505af1158015610b0b573d6000803e3d6000fd5b50505050610b90565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038416906323b872dd90610b5d9089908990879060040161141e565b600060405180830381600087803b158015610b7757600080fd5b505af1158015610b8b573d6000803e3d6000fd5b505050505b50505050505050565b6000806060610ba9846000610bd7565b9250610bb6846014610c7e565b9150603484511115610bd057610bcd846034610c91565b90505b9193909250565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610c615760405160e560020a62461bcd02815260040161029891906114df565b50506014818301810151910190600160a060020a03165b92915050565b6000610c8a8383610d8a565b9392505050565b60606000610c9f8484610c7e565b905060208301925080830184511015606060405190810160405280603081526020017f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455381526020017f5f4c454e4754485f524551554952454400000000000000000000000000000000815250901515610d2e5760405160e560020a62461bcd02815260040161029891906114df565b50806040519080825280601f01601f191660200182016040528015610d5d578160200160208202803883390190505b509150610d83610d6c83610936565b60200184610d7987610936565b0160200183610e1e565b5092915050565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610e145760405160e560020a62461bcd02815260040161029891906114df565b5050016020015190565b6020811015610e48576001816020036101000a038019835116818551168082178652505050610ed6565b82821415610e5557610ed6565b82821115610e9b5760208104602082039150818301828501815160005b84811015610e90578651885260209788019790960195600101610e72565b50905250610ed69050565b60208104602082039150818301828501845160005b84811015610ecf5783518352601f199384019390920191600101610eb0565b5086525050505b505050565b815481835581811115610ed657600083815260209020610ed691810190830161093691905b80821115610f145760008155600101610f00565b5090565b6000610c8a8235611588565b6000601f82018313610f3557600080fd5b8135610f48610f4382611535565b61150e565b91508181835260208401935060208101905083856020840282011115610f6d57600080fd5b60005b83811015610f995781610f838882610f18565b8452506020928301929190910190600101610f70565b5050505092915050565b6000601f82018313610fb457600080fd5b8135610fc2610f4382611535565b81815260209384019390925082018360005b83811015610f995781358601610fea88826110b9565b8452506020928301929190910190600101610fd4565b6000601f8201831361101157600080fd5b813561101f610f4382611535565b9150818183526020840193506020810190508385602084028201111561104457600080fd5b60005b83811015610f99578161105a8882611108565b8452506020928301929190910190600101611047565b600080601f8301841361108257600080fd5b50813567ffffffffffffffff81111561109a57600080fd5b6020830191508360018202830111156110b257600080fd5b9250929050565b6000601f820183136110ca57600080fd5b81356110d8610f4382611556565b915080825260208301602083018583830111156110f457600080fd5b6110ff83828461159f565b50505092915050565b6000610c8a8235610936565b60006020828403121561112657600080fd5b60006111328484610f18565b949350505050565b6000806040838503121561114d57600080fd5b60006111598585610f18565b925050602061116a85828601611108565b9150509250929050565b6000806000806080858703121561118a57600080fd5b843567ffffffffffffffff8111156111a157600080fd5b6111ad87828801610fa3565b945050602085013567ffffffffffffffff8111156111ca57600080fd5b6111d687828801610f24565b935050604085013567ffffffffffffffff8111156111f357600080fd5b6111ff87828801610f24565b925050606085013567ffffffffffffffff81111561121c57600080fd5b61122887828801611000565b91505092959194509250565b60008060008060006080868803121561124c57600080fd5b853567ffffffffffffffff81111561126357600080fd5b61126f88828901611070565b9550955050602061128288828901610f18565b935050604061129388828901610f18565b92505060606112a488828901611108565b9150509295509295909350565b6000602082840312156112c357600080fd5b813567ffffffffffffffff8111156112da57600080fd5b611132848285016110b9565b6000602082840312156112f857600080fd5b60006111328484611108565b61130d81611588565b82525050565b600061131e82611584565b8084526020840193506113308361157e565b60005b8281101561136057611346868351611304565b61134f8261157e565b602096909601959150600101611333565b5093949350505050565b61130d81611594565b600061137e82611584565b8084526113928160208601602086016115ab565b61139b816115db565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b61130d81610936565b61130d81611599565b60208101610c788284611304565b6060810161142c8286611304565b6114396020830185611304565b61113260408301846113fe565b608081016114548287611304565b6114616020830186611304565b61146e60408301856113fe565b81810360608301526114808184611373565b9695505050505050565b606081016114988286611304565b6114a560208301856113fe565b81810360408301526114b78184611373565b95945050505050565b60208082528101610c8a8184611313565b60208101610c78828461136a565b60208082528101610c8a8184611373565b60208082528101610c78816113a8565b60208101610c788284611407565b60405181810167ffffffffffffffff8111828210171561152d57600080fd5b604052919050565b600067ffffffffffffffff82111561154c57600080fd5b5060209081020190565b600067ffffffffffffffff82111561156d57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156115c65781810151838201526020016115ae565b838111156115d5576000848401525b50505050565b601f01601f1916905600a265627a7a723058205e6e02635caf7f511415c73a52e49706d73ee7ad23f2bc71fc3f3a04a13a07686c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x161F DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xE0 JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0x72C2F527 EQ PUSH2 0x156 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x185 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x1BA JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1DA JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x24B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0xD9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x26B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0xFB CALLDATASIZE PUSH1 0x4 PUSH2 0x12E6 JUMP JUMPDEST PUSH2 0x3B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1410 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x1174 JUMP JUMPDEST PUSH2 0x3DA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x4CD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x162 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x171 CALLDATASIZE PUSH1 0x4 PUSH2 0x12B1 JUMP JUMPDEST PUSH2 0x69B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x148A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0x6B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x113A JUMP JUMPDEST PUSH2 0x6C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1234 JUMP JUMPDEST PUSH2 0x887 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EF PUSH2 0x933 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1500 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21C PUSH2 0x217 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x939 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x14D1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x235 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x94E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x14C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x9B0 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2A1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x316 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x3C0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x447 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x4C6 JUMPI PUSH2 0x4BE DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x467 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x47F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x497 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4AF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x44D JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4FB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x571 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x661 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5B7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x659 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x5E4 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x60A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x653 SWAP1 DUP3 PUSH2 0xEDB JUMP JUMPDEST POP PUSH2 0x661 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x594 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x6A9 DUP5 PUSH2 0xB99 JUMP JUMPDEST SWAP2 SWAP7 SWAP1 SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x71F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x739 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x7AA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x7DD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x803 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x84C SWAP1 DUP3 PUSH2 0xEDB JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8F4 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH2 0x4C6 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x2 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x9A6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x988 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x9DD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0xA15 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x60 SWAP1 PUSH1 0x1 DUP6 EQ PUSH2 0xA78 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH2 0xA82 DUP8 PUSH2 0xB99 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0xB14 JUMPI PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0xADD SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1446 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB0B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0xB90 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0xB5D SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x141E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0xBA9 DUP5 PUSH1 0x0 PUSH2 0xBD7 JUMP JUMPDEST SWAP3 POP PUSH2 0xBB6 DUP5 PUSH1 0x14 PUSH2 0xC7E JUMP JUMPDEST SWAP2 POP PUSH1 0x34 DUP5 MLOAD GT ISZERO PUSH2 0xBD0 JUMPI PUSH2 0xBCD DUP5 PUSH1 0x34 PUSH2 0xC91 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xC61 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP4 DUP4 PUSH2 0xD8A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xC9F DUP5 DUP5 PUSH2 0xC7E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xD2E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xD5D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH2 0xD83 PUSH2 0xD6C DUP4 PUSH2 0x936 JUMP JUMPDEST PUSH1 0x20 ADD DUP5 PUSH2 0xD79 DUP8 PUSH2 0x936 JUMP JUMPDEST ADD PUSH1 0x20 ADD DUP4 PUSH2 0xE1E JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xE14 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE48 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0xED6 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0xE55 JUMPI PUSH2 0xED6 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0xE9B JUMPI PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP2 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xE90 JUMPI DUP7 MLOAD DUP9 MSTORE PUSH1 0x20 SWAP8 DUP9 ADD SWAP8 SWAP1 SWAP7 ADD SWAP6 PUSH1 0x1 ADD PUSH2 0xE72 JUMP JUMPDEST POP SWAP1 MSTORE POP PUSH2 0xED6 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP5 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xECF JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xEB0 JUMP JUMPDEST POP DUP7 MSTORE POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xED6 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xED6 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x936 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF14 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF00 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP3 CALLDATALOAD PUSH2 0x1588 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xF35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xF48 PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST PUSH2 0x150E JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xF6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 PUSH2 0xF83 DUP9 DUP3 PUSH2 0xF18 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xF70 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xFB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xFC2 PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xFEA DUP9 DUP3 PUSH2 0x10B9 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xFD4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1011 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x101F PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x1044 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 PUSH2 0x105A DUP9 DUP3 PUSH2 0x1108 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1047 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x1082 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x109A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x10B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x10CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x10D8 PUSH2 0xF43 DUP3 PUSH2 0x1556 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x10F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10FF DUP4 DUP3 DUP5 PUSH2 0x159F JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP3 CALLDATALOAD PUSH2 0x936 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1126 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1132 DUP5 DUP5 PUSH2 0xF18 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x114D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1159 DUP6 DUP6 PUSH2 0xF18 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x116A DUP6 DUP3 DUP7 ADD PUSH2 0x1108 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x118A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11AD DUP8 DUP3 DUP9 ADD PUSH2 0xFA3 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11D6 DUP8 DUP3 DUP9 ADD PUSH2 0xF24 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11FF DUP8 DUP3 DUP9 ADD PUSH2 0xF24 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x121C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1228 DUP8 DUP3 DUP9 ADD PUSH2 0x1000 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x124C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x126F DUP9 DUP3 DUP10 ADD PUSH2 0x1070 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0x1282 DUP9 DUP3 DUP10 ADD PUSH2 0xF18 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x1293 DUP9 DUP3 DUP10 ADD PUSH2 0xF18 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x12A4 DUP9 DUP3 DUP10 ADD PUSH2 0x1108 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1132 DUP5 DUP3 DUP6 ADD PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1132 DUP5 DUP5 PUSH2 0x1108 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1588 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x131E DUP3 PUSH2 0x1584 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x1330 DUP4 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1360 JUMPI PUSH2 0x1346 DUP7 DUP4 MLOAD PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x134F DUP3 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1333 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1594 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x137E DUP3 PUSH2 0x1584 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1392 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x15AB JUMP JUMPDEST PUSH2 0x139B DUP2 PUSH2 0x15DB JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x936 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1599 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x1304 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x142C DUP3 DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1439 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1132 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x1454 DUP3 DUP8 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1461 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x146E PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x13FE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x1480 DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x1498 DUP3 DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x14A5 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x13FE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x14B7 DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC8A DUP2 DUP5 PUSH2 0x1313 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x136A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC8A DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC78 DUP2 PUSH2 0x13A8 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x1407 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x152D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x154C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x156D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x15C6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x15AE JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x15D5 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0x5e PUSH15 0x2635CAF7F511415C73A52E49706D7 RETURNDATACOPY 0xe7 0xad 0x23 CALLCODE 0xbc PUSH18 0xFC3F3A04A13A07686C6578706572696D656E PUSH21 0x616CF5003700000000000000000000000000000000 ", "sourceMap": "744:871:9:-;;;363:5:17;:18;;-1:-1:-1;;;;;;363:18:17;371:10;363:18;;;744:871:9;;;;;;" }, "deployedBytecode": { "linkReferences": {}, - "object": "0x6080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100be578063494503d4146100e0578063563c875d14610116578063707129391461013657806372c2f527146101565780638da5cb5b146101855780639ad267441461019a578063a85e59e4146101ba578063ae25532e146101da578063b9181611146101fc578063d39de6e914610229578063f2fde38b1461024b575b600080fd5b3480156100ca57600080fd5b506100de6100d9366004611114565b61026b565b005b3480156100ec57600080fd5b506101006100fb3660046112e6565b6103b2565b60405161010d9190611410565b60405180910390f35b34801561012257600080fd5b506100de610131366004611174565b6103da565b34801561014257600080fd5b506100de610151366004611114565b6104cd565b34801561016257600080fd5b506101766101713660046112b1565b61069b565b60405161010d9392919061148a565b34801561019157600080fd5b506101006106b6565b3480156101a657600080fd5b506100de6101b536600461113a565b6106c5565b3480156101c657600080fd5b506100de6101d5366004611234565b610887565b3480156101e657600080fd5b506101ef610933565b60405161010d9190611500565b34801561020857600080fd5b5061021c610217366004611114565b610939565b60405161010d91906114d1565b34801561023557600080fd5b5061023e61094e565b60405161010d91906114c0565b34801561025757600080fd5b506100de610266366004611114565b6109b0565b600054600160a060020a031633146102a15760405160e560020a62461bcd028152600401610298906114f0565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156103165760405160e560020a62461bcd02815260040161029891906114df565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106103c057fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff1615156104475760405160e560020a62461bcd02815260040161029891906114df565b50600090505b84518110156104c6576104be858281518110151561046757fe5b90602001906020020151858381518110151561047f57fe5b90602001906020020151858481518110151561049757fe5b9060200190602002015185858151811015156104af57fe5b90602001906020020151610a18565b60010161044d565b5050505050565b60008054600160a060020a031633146104fb5760405160e560020a62461bcd028152600401610298906114f0565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105715760405160e560020a62461bcd02815260040161029891906114df565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b6002548110156106615781600160a060020a03166002828154811015156105b757fe5b600091825260209091200154600160a060020a03161415610659576002805460001981019081106105e457fe5b60009182526020909120015460028054600160a060020a03909216918390811061060a57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906106539082610edb565b50610661565b600101610594565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60008060606106a984610b99565b9196909550909350915050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000602082015290821061071f5760405160e560020a62461bcd02815260040161029891906114df565b5081600160a060020a031660028281548110151561073957fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107aa5760405160e560020a62461bcd02815260040161029891906114df565b50600160a060020a0382166000908152600160205260409020805460ff191690556002805460001981019081106107dd57fe5b60009182526020909120015460028054600160a060020a03909216918390811061080357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560028054600019019061084c9082610edb565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156108f45760405160e560020a62461bcd02815260040161029891906114df565b506104c685858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050848484610a18565b60025b90565b60016020526000908152604090205460ff1681565b606060028054806020026020016040519081016040528092919081815260200182805480156109a657602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610988575b5050505050905090565b600054600160a060020a031633146109dd5760405160e560020a62461bcd028152600401610298906114f0565b600160a060020a03811615610a15576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60408051808201909152600e81527f494e56414c49445f414d4f554e540000000000000000000000000000000000006020820152600090819060609060018514610a785760405160e560020a62461bcd02815260040161029891906114df565b50610a8287610b99565b925092509250600081511115610b14576040517fb88d4fde000000000000000000000000000000000000000000000000000000008152600160a060020a0384169063b88d4fde90610add908990899087908790600401611446565b600060405180830381600087803b158015610af757600080fd5b505af1158015610b0b573d6000803e3d6000fd5b50505050610b90565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038416906323b872dd90610b5d9089908990879060040161141e565b600060405180830381600087803b158015610b7757600080fd5b505af1158015610b8b573d6000803e3d6000fd5b505050505b50505050505050565b6000806060610ba9846000610bd7565b9250610bb6846014610c7e565b9150603484511115610bd057610bcd846034610c91565b90505b9193909250565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610c615760405160e560020a62461bcd02815260040161029891906114df565b50506014818301810151910190600160a060020a03165b92915050565b6000610c8a8383610d8a565b9392505050565b60606000610c9f8484610c7e565b905060208301925080830184511015606060405190810160405280603081526020017f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455381526020017f5f4c454e4754485f524551554952454400000000000000000000000000000000815250901515610d2e5760405160e560020a62461bcd02815260040161029891906114df565b50806040519080825280601f01601f191660200182016040528015610d5d578160200160208202803883390190505b509150610d83610d6c83610936565b60200184610d7987610936565b0160200183610e1e565b5092915050565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610e145760405160e560020a62461bcd02815260040161029891906114df565b5050016020015190565b6020811015610e48576001816020036101000a038019835116818551168082178652505050610ed6565b82821415610e5557610ed6565b82821115610e9b5760208104602082039150818301828501815160005b84811015610e90578651885260209788019790960195600101610e72565b50905250610ed69050565b60208104602082039150818301828501845160005b84811015610ecf5783518352601f199384019390920191600101610eb0565b5086525050505b505050565b815481835581811115610ed657600083815260209020610ed691810190830161093691905b80821115610f145760008155600101610f00565b5090565b6000610c8a8235611588565b6000601f82018313610f3557600080fd5b8135610f48610f4382611535565b61150e565b91508181835260208401935060208101905083856020840282011115610f6d57600080fd5b60005b83811015610f995781610f838882610f18565b8452506020928301929190910190600101610f70565b5050505092915050565b6000601f82018313610fb457600080fd5b8135610fc2610f4382611535565b81815260209384019390925082018360005b83811015610f995781358601610fea88826110b9565b8452506020928301929190910190600101610fd4565b6000601f8201831361101157600080fd5b813561101f610f4382611535565b9150818183526020840193506020810190508385602084028201111561104457600080fd5b60005b83811015610f99578161105a8882611108565b8452506020928301929190910190600101611047565b600080601f8301841361108257600080fd5b50813567ffffffffffffffff81111561109a57600080fd5b6020830191508360018202830111156110b257600080fd5b9250929050565b6000601f820183136110ca57600080fd5b81356110d8610f4382611556565b915080825260208301602083018583830111156110f457600080fd5b6110ff83828461159f565b50505092915050565b6000610c8a8235610936565b60006020828403121561112657600080fd5b60006111328484610f18565b949350505050565b6000806040838503121561114d57600080fd5b60006111598585610f18565b925050602061116a85828601611108565b9150509250929050565b6000806000806080858703121561118a57600080fd5b843567ffffffffffffffff8111156111a157600080fd5b6111ad87828801610fa3565b945050602085013567ffffffffffffffff8111156111ca57600080fd5b6111d687828801610f24565b935050604085013567ffffffffffffffff8111156111f357600080fd5b6111ff87828801610f24565b925050606085013567ffffffffffffffff81111561121c57600080fd5b61122887828801611000565b91505092959194509250565b60008060008060006080868803121561124c57600080fd5b853567ffffffffffffffff81111561126357600080fd5b61126f88828901611070565b9550955050602061128288828901610f18565b935050604061129388828901610f18565b92505060606112a488828901611108565b9150509295509295909350565b6000602082840312156112c357600080fd5b813567ffffffffffffffff8111156112da57600080fd5b611132848285016110b9565b6000602082840312156112f857600080fd5b60006111328484611108565b61130d81611588565b82525050565b600061131e82611584565b8084526020840193506113308361157e565b60005b8281101561136057611346868351611304565b61134f8261157e565b602096909601959150600101611333565b5093949350505050565b61130d81611594565b600061137e82611584565b8084526113928160208601602086016115ab565b61139b816115db565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b61130d81610936565b61130d81611599565b60208101610c788284611304565b6060810161142c8286611304565b6114396020830185611304565b61113260408301846113fe565b608081016114548287611304565b6114616020830186611304565b61146e60408301856113fe565b81810360608301526114808184611373565b9695505050505050565b606081016114988286611304565b6114a560208301856113fe565b81810360408301526114b78184611373565b95945050505050565b60208082528101610c8a8184611313565b60208101610c78828461136a565b60208082528101610c8a8184611373565b60208082528101610c78816113a8565b60208101610c788284611407565b60405181810167ffffffffffffffff8111828210171561152d57600080fd5b604052919050565b600067ffffffffffffffff82111561154c57600080fd5b5060209081020190565b600067ffffffffffffffff82111561156d57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156115c65781810151838201526020016115ae565b838111156115d5576000848401525b50505050565b601f01601f1916905600a265627a7a72305820104836f2297bede9af7cc5e4ad922029c0c46e1ab76cceef39647079414c70786c6578706572696d656e74616cf50037", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xE0 JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0x72C2F527 EQ PUSH2 0x156 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x185 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x1BA JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1DA JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x24B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0xD9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x26B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0xFB CALLDATASIZE PUSH1 0x4 PUSH2 0x12E6 JUMP JUMPDEST PUSH2 0x3B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1410 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x1174 JUMP JUMPDEST PUSH2 0x3DA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x4CD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x162 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x171 CALLDATASIZE PUSH1 0x4 PUSH2 0x12B1 JUMP JUMPDEST PUSH2 0x69B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x148A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0x6B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x113A JUMP JUMPDEST PUSH2 0x6C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1234 JUMP JUMPDEST PUSH2 0x887 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EF PUSH2 0x933 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1500 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21C PUSH2 0x217 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x939 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x14D1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x235 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x94E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x14C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x9B0 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2A1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x316 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x3C0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x447 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x4C6 JUMPI PUSH2 0x4BE DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x467 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x47F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x497 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4AF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x44D JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4FB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x571 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x661 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5B7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x659 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x5E4 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x60A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x653 SWAP1 DUP3 PUSH2 0xEDB JUMP JUMPDEST POP PUSH2 0x661 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x594 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x6A9 DUP5 PUSH2 0xB99 JUMP JUMPDEST SWAP2 SWAP7 SWAP1 SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x71F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x739 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x7AA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x7DD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x803 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x84C SWAP1 DUP3 PUSH2 0xEDB JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8F4 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH2 0x4C6 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x2 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x9A6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x988 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x9DD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0xA15 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x60 SWAP1 PUSH1 0x1 DUP6 EQ PUSH2 0xA78 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH2 0xA82 DUP8 PUSH2 0xB99 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0xB14 JUMPI PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0xADD SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1446 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB0B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0xB90 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0xB5D SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x141E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0xBA9 DUP5 PUSH1 0x0 PUSH2 0xBD7 JUMP JUMPDEST SWAP3 POP PUSH2 0xBB6 DUP5 PUSH1 0x14 PUSH2 0xC7E JUMP JUMPDEST SWAP2 POP PUSH1 0x34 DUP5 MLOAD GT ISZERO PUSH2 0xBD0 JUMPI PUSH2 0xBCD DUP5 PUSH1 0x34 PUSH2 0xC91 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xC61 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP4 DUP4 PUSH2 0xD8A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xC9F DUP5 DUP5 PUSH2 0xC7E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xD2E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xD5D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH2 0xD83 PUSH2 0xD6C DUP4 PUSH2 0x936 JUMP JUMPDEST PUSH1 0x20 ADD DUP5 PUSH2 0xD79 DUP8 PUSH2 0x936 JUMP JUMPDEST ADD PUSH1 0x20 ADD DUP4 PUSH2 0xE1E JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xE14 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE48 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0xED6 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0xE55 JUMPI PUSH2 0xED6 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0xE9B JUMPI PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP2 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xE90 JUMPI DUP7 MLOAD DUP9 MSTORE PUSH1 0x20 SWAP8 DUP9 ADD SWAP8 SWAP1 SWAP7 ADD SWAP6 PUSH1 0x1 ADD PUSH2 0xE72 JUMP JUMPDEST POP SWAP1 MSTORE POP PUSH2 0xED6 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP5 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xECF JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xEB0 JUMP JUMPDEST POP DUP7 MSTORE POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xED6 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xED6 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x936 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF14 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF00 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP3 CALLDATALOAD PUSH2 0x1588 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xF35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xF48 PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST PUSH2 0x150E JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xF6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 PUSH2 0xF83 DUP9 DUP3 PUSH2 0xF18 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xF70 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xFB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xFC2 PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xFEA DUP9 DUP3 PUSH2 0x10B9 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xFD4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1011 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x101F PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x1044 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 PUSH2 0x105A DUP9 DUP3 PUSH2 0x1108 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1047 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x1082 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x109A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x10B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x10CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x10D8 PUSH2 0xF43 DUP3 PUSH2 0x1556 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x10F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10FF DUP4 DUP3 DUP5 PUSH2 0x159F JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP3 CALLDATALOAD PUSH2 0x936 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1126 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1132 DUP5 DUP5 PUSH2 0xF18 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x114D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1159 DUP6 DUP6 PUSH2 0xF18 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x116A DUP6 DUP3 DUP7 ADD PUSH2 0x1108 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x118A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11AD DUP8 DUP3 DUP9 ADD PUSH2 0xFA3 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11D6 DUP8 DUP3 DUP9 ADD PUSH2 0xF24 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11FF DUP8 DUP3 DUP9 ADD PUSH2 0xF24 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x121C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1228 DUP8 DUP3 DUP9 ADD PUSH2 0x1000 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x124C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x126F DUP9 DUP3 DUP10 ADD PUSH2 0x1070 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0x1282 DUP9 DUP3 DUP10 ADD PUSH2 0xF18 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x1293 DUP9 DUP3 DUP10 ADD PUSH2 0xF18 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x12A4 DUP9 DUP3 DUP10 ADD PUSH2 0x1108 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1132 DUP5 DUP3 DUP6 ADD PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1132 DUP5 DUP5 PUSH2 0x1108 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1588 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x131E DUP3 PUSH2 0x1584 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x1330 DUP4 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1360 JUMPI PUSH2 0x1346 DUP7 DUP4 MLOAD PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x134F DUP3 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1333 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1594 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x137E DUP3 PUSH2 0x1584 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1392 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x15AB JUMP JUMPDEST PUSH2 0x139B DUP2 PUSH2 0x15DB JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x936 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1599 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x1304 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x142C DUP3 DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1439 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1132 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x1454 DUP3 DUP8 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1461 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x146E PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x13FE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x1480 DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x1498 DUP3 DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x14A5 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x13FE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x14B7 DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC8A DUP2 DUP5 PUSH2 0x1313 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x136A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC8A DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC78 DUP2 PUSH2 0x13A8 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x1407 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x152D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x154C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x156D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x15C6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x15AE JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x15D5 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 LT 0x48 CALLDATASIZE CALLCODE 0x29 PUSH28 0xEDE9AF7CC5E4AD922029C0C46E1AB76CCEEF39647079414C70786C65 PUSH25 0x706572696D656E74616CF50037000000000000000000000000 ", + "object": "0x6080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100be578063494503d4146100e0578063563c875d14610116578063707129391461013657806372c2f527146101565780638da5cb5b146101855780639ad267441461019a578063a85e59e4146101ba578063ae25532e146101da578063b9181611146101fc578063d39de6e914610229578063f2fde38b1461024b575b600080fd5b3480156100ca57600080fd5b506100de6100d9366004611114565b61026b565b005b3480156100ec57600080fd5b506101006100fb3660046112e6565b6103b2565b60405161010d9190611410565b60405180910390f35b34801561012257600080fd5b506100de610131366004611174565b6103da565b34801561014257600080fd5b506100de610151366004611114565b6104cd565b34801561016257600080fd5b506101766101713660046112b1565b61069b565b60405161010d9392919061148a565b34801561019157600080fd5b506101006106b6565b3480156101a657600080fd5b506100de6101b536600461113a565b6106c5565b3480156101c657600080fd5b506100de6101d5366004611234565b610887565b3480156101e657600080fd5b506101ef610933565b60405161010d9190611500565b34801561020857600080fd5b5061021c610217366004611114565b610939565b60405161010d91906114d1565b34801561023557600080fd5b5061023e61094e565b60405161010d91906114c0565b34801561025757600080fd5b506100de610266366004611114565b6109b0565b600054600160a060020a031633146102a15760405160e560020a62461bcd028152600401610298906114f0565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156103165760405160e560020a62461bcd02815260040161029891906114df565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106103c057fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff1615156104475760405160e560020a62461bcd02815260040161029891906114df565b50600090505b84518110156104c6576104be858281518110151561046757fe5b90602001906020020151858381518110151561047f57fe5b90602001906020020151858481518110151561049757fe5b9060200190602002015185858151811015156104af57fe5b90602001906020020151610a18565b60010161044d565b5050505050565b60008054600160a060020a031633146104fb5760405160e560020a62461bcd028152600401610298906114f0565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105715760405160e560020a62461bcd02815260040161029891906114df565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b6002548110156106615781600160a060020a03166002828154811015156105b757fe5b600091825260209091200154600160a060020a03161415610659576002805460001981019081106105e457fe5b60009182526020909120015460028054600160a060020a03909216918390811061060a57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906106539082610edb565b50610661565b600101610594565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60008060606106a984610b99565b9196909550909350915050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000602082015290821061071f5760405160e560020a62461bcd02815260040161029891906114df565b5081600160a060020a031660028281548110151561073957fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107aa5760405160e560020a62461bcd02815260040161029891906114df565b50600160a060020a0382166000908152600160205260409020805460ff191690556002805460001981019081106107dd57fe5b60009182526020909120015460028054600160a060020a03909216918390811061080357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560028054600019019061084c9082610edb565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156108f45760405160e560020a62461bcd02815260040161029891906114df565b506104c685858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050848484610a18565b60025b90565b60016020526000908152604090205460ff1681565b606060028054806020026020016040519081016040528092919081815260200182805480156109a657602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610988575b5050505050905090565b600054600160a060020a031633146109dd5760405160e560020a62461bcd028152600401610298906114f0565b600160a060020a03811615610a15576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60408051808201909152600e81527f494e56414c49445f414d4f554e540000000000000000000000000000000000006020820152600090819060609060018514610a785760405160e560020a62461bcd02815260040161029891906114df565b50610a8287610b99565b925092509250600081511115610b14576040517fb88d4fde000000000000000000000000000000000000000000000000000000008152600160a060020a0384169063b88d4fde90610add908990899087908790600401611446565b600060405180830381600087803b158015610af757600080fd5b505af1158015610b0b573d6000803e3d6000fd5b50505050610b90565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038416906323b872dd90610b5d9089908990879060040161141e565b600060405180830381600087803b158015610b7757600080fd5b505af1158015610b8b573d6000803e3d6000fd5b505050505b50505050505050565b6000806060610ba9846000610bd7565b9250610bb6846014610c7e565b9150603484511115610bd057610bcd846034610c91565b90505b9193909250565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610c615760405160e560020a62461bcd02815260040161029891906114df565b50506014818301810151910190600160a060020a03165b92915050565b6000610c8a8383610d8a565b9392505050565b60606000610c9f8484610c7e565b905060208301925080830184511015606060405190810160405280603081526020017f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455381526020017f5f4c454e4754485f524551554952454400000000000000000000000000000000815250901515610d2e5760405160e560020a62461bcd02815260040161029891906114df565b50806040519080825280601f01601f191660200182016040528015610d5d578160200160208202803883390190505b509150610d83610d6c83610936565b60200184610d7987610936565b0160200183610e1e565b5092915050565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610e145760405160e560020a62461bcd02815260040161029891906114df565b5050016020015190565b6020811015610e48576001816020036101000a038019835116818551168082178652505050610ed6565b82821415610e5557610ed6565b82821115610e9b5760208104602082039150818301828501815160005b84811015610e90578651885260209788019790960195600101610e72565b50905250610ed69050565b60208104602082039150818301828501845160005b84811015610ecf5783518352601f199384019390920191600101610eb0565b5086525050505b505050565b815481835581811115610ed657600083815260209020610ed691810190830161093691905b80821115610f145760008155600101610f00565b5090565b6000610c8a8235611588565b6000601f82018313610f3557600080fd5b8135610f48610f4382611535565b61150e565b91508181835260208401935060208101905083856020840282011115610f6d57600080fd5b60005b83811015610f995781610f838882610f18565b8452506020928301929190910190600101610f70565b5050505092915050565b6000601f82018313610fb457600080fd5b8135610fc2610f4382611535565b81815260209384019390925082018360005b83811015610f995781358601610fea88826110b9565b8452506020928301929190910190600101610fd4565b6000601f8201831361101157600080fd5b813561101f610f4382611535565b9150818183526020840193506020810190508385602084028201111561104457600080fd5b60005b83811015610f99578161105a8882611108565b8452506020928301929190910190600101611047565b600080601f8301841361108257600080fd5b50813567ffffffffffffffff81111561109a57600080fd5b6020830191508360018202830111156110b257600080fd5b9250929050565b6000601f820183136110ca57600080fd5b81356110d8610f4382611556565b915080825260208301602083018583830111156110f457600080fd5b6110ff83828461159f565b50505092915050565b6000610c8a8235610936565b60006020828403121561112657600080fd5b60006111328484610f18565b949350505050565b6000806040838503121561114d57600080fd5b60006111598585610f18565b925050602061116a85828601611108565b9150509250929050565b6000806000806080858703121561118a57600080fd5b843567ffffffffffffffff8111156111a157600080fd5b6111ad87828801610fa3565b945050602085013567ffffffffffffffff8111156111ca57600080fd5b6111d687828801610f24565b935050604085013567ffffffffffffffff8111156111f357600080fd5b6111ff87828801610f24565b925050606085013567ffffffffffffffff81111561121c57600080fd5b61122887828801611000565b91505092959194509250565b60008060008060006080868803121561124c57600080fd5b853567ffffffffffffffff81111561126357600080fd5b61126f88828901611070565b9550955050602061128288828901610f18565b935050604061129388828901610f18565b92505060606112a488828901611108565b9150509295509295909350565b6000602082840312156112c357600080fd5b813567ffffffffffffffff8111156112da57600080fd5b611132848285016110b9565b6000602082840312156112f857600080fd5b60006111328484611108565b61130d81611588565b82525050565b600061131e82611584565b8084526020840193506113308361157e565b60005b8281101561136057611346868351611304565b61134f8261157e565b602096909601959150600101611333565b5093949350505050565b61130d81611594565b600061137e82611584565b8084526113928160208601602086016115ab565b61139b816115db565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b61130d81610936565b61130d81611599565b60208101610c788284611304565b6060810161142c8286611304565b6114396020830185611304565b61113260408301846113fe565b608081016114548287611304565b6114616020830186611304565b61146e60408301856113fe565b81810360608301526114808184611373565b9695505050505050565b606081016114988286611304565b6114a560208301856113fe565b81810360408301526114b78184611373565b95945050505050565b60208082528101610c8a8184611313565b60208101610c78828461136a565b60208082528101610c8a8184611373565b60208082528101610c78816113a8565b60208101610c788284611407565b60405181810167ffffffffffffffff8111828210171561152d57600080fd5b604052919050565b600067ffffffffffffffff82111561154c57600080fd5b5060209081020190565b600067ffffffffffffffff82111561156d57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156115c65781810151838201526020016115ae565b838111156115d5576000848401525b50505050565b601f01601f1916905600a265627a7a723058205e6e02635caf7f511415c73a52e49706d73ee7ad23f2bc71fc3f3a04a13a07686c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xE0 JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0x72C2F527 EQ PUSH2 0x156 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x185 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x1BA JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1DA JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x24B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0xD9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x26B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0xFB CALLDATASIZE PUSH1 0x4 PUSH2 0x12E6 JUMP JUMPDEST PUSH2 0x3B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1410 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x1174 JUMP JUMPDEST PUSH2 0x3DA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x4CD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x162 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x171 CALLDATASIZE PUSH1 0x4 PUSH2 0x12B1 JUMP JUMPDEST PUSH2 0x69B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x148A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0x6B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x113A JUMP JUMPDEST PUSH2 0x6C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1234 JUMP JUMPDEST PUSH2 0x887 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EF PUSH2 0x933 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1500 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21C PUSH2 0x217 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x939 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x14D1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x235 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x94E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x14C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x9B0 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2A1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x316 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x3C0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x447 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x4C6 JUMPI PUSH2 0x4BE DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x467 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x47F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x497 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4AF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x44D JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4FB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x571 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x661 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5B7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x659 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x5E4 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x60A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x653 SWAP1 DUP3 PUSH2 0xEDB JUMP JUMPDEST POP PUSH2 0x661 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x594 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x6A9 DUP5 PUSH2 0xB99 JUMP JUMPDEST SWAP2 SWAP7 SWAP1 SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x71F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x739 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x7AA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x7DD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x803 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x84C SWAP1 DUP3 PUSH2 0xEDB JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8F4 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH2 0x4C6 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x2 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x9A6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x988 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x9DD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0xA15 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x60 SWAP1 PUSH1 0x1 DUP6 EQ PUSH2 0xA78 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH2 0xA82 DUP8 PUSH2 0xB99 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0xB14 JUMPI PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0xADD SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1446 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB0B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0xB90 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0xB5D SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x141E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0xBA9 DUP5 PUSH1 0x0 PUSH2 0xBD7 JUMP JUMPDEST SWAP3 POP PUSH2 0xBB6 DUP5 PUSH1 0x14 PUSH2 0xC7E JUMP JUMPDEST SWAP2 POP PUSH1 0x34 DUP5 MLOAD GT ISZERO PUSH2 0xBD0 JUMPI PUSH2 0xBCD DUP5 PUSH1 0x34 PUSH2 0xC91 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xC61 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP4 DUP4 PUSH2 0xD8A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xC9F DUP5 DUP5 PUSH2 0xC7E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xD2E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xD5D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH2 0xD83 PUSH2 0xD6C DUP4 PUSH2 0x936 JUMP JUMPDEST PUSH1 0x20 ADD DUP5 PUSH2 0xD79 DUP8 PUSH2 0x936 JUMP JUMPDEST ADD PUSH1 0x20 ADD DUP4 PUSH2 0xE1E JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xE14 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE48 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0xED6 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0xE55 JUMPI PUSH2 0xED6 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0xE9B JUMPI PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP2 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xE90 JUMPI DUP7 MLOAD DUP9 MSTORE PUSH1 0x20 SWAP8 DUP9 ADD SWAP8 SWAP1 SWAP7 ADD SWAP6 PUSH1 0x1 ADD PUSH2 0xE72 JUMP JUMPDEST POP SWAP1 MSTORE POP PUSH2 0xED6 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP5 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xECF JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xEB0 JUMP JUMPDEST POP DUP7 MSTORE POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xED6 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xED6 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x936 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF14 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF00 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP3 CALLDATALOAD PUSH2 0x1588 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xF35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xF48 PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST PUSH2 0x150E JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xF6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 PUSH2 0xF83 DUP9 DUP3 PUSH2 0xF18 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xF70 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xFB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xFC2 PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xFEA DUP9 DUP3 PUSH2 0x10B9 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xFD4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1011 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x101F PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x1044 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 PUSH2 0x105A DUP9 DUP3 PUSH2 0x1108 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1047 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x1082 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x109A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x10B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x10CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x10D8 PUSH2 0xF43 DUP3 PUSH2 0x1556 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x10F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10FF DUP4 DUP3 DUP5 PUSH2 0x159F JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP3 CALLDATALOAD PUSH2 0x936 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1126 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1132 DUP5 DUP5 PUSH2 0xF18 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x114D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1159 DUP6 DUP6 PUSH2 0xF18 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x116A DUP6 DUP3 DUP7 ADD PUSH2 0x1108 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x118A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11AD DUP8 DUP3 DUP9 ADD PUSH2 0xFA3 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11D6 DUP8 DUP3 DUP9 ADD PUSH2 0xF24 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11FF DUP8 DUP3 DUP9 ADD PUSH2 0xF24 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x121C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1228 DUP8 DUP3 DUP9 ADD PUSH2 0x1000 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x124C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x126F DUP9 DUP3 DUP10 ADD PUSH2 0x1070 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0x1282 DUP9 DUP3 DUP10 ADD PUSH2 0xF18 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x1293 DUP9 DUP3 DUP10 ADD PUSH2 0xF18 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x12A4 DUP9 DUP3 DUP10 ADD PUSH2 0x1108 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1132 DUP5 DUP3 DUP6 ADD PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1132 DUP5 DUP5 PUSH2 0x1108 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1588 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x131E DUP3 PUSH2 0x1584 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x1330 DUP4 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1360 JUMPI PUSH2 0x1346 DUP7 DUP4 MLOAD PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x134F DUP3 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1333 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1594 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x137E DUP3 PUSH2 0x1584 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1392 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x15AB JUMP JUMPDEST PUSH2 0x139B DUP2 PUSH2 0x15DB JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x936 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1599 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x1304 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x142C DUP3 DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1439 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1132 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x1454 DUP3 DUP8 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1461 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x146E PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x13FE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x1480 DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x1498 DUP3 DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x14A5 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x13FE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x14B7 DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC8A DUP2 DUP5 PUSH2 0x1313 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x136A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC8A DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC78 DUP2 PUSH2 0x13A8 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x1407 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x152D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x154C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x156D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x15C6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x15AE JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x15D5 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0x5e PUSH15 0x2635CAF7F511415C73A52E49706D7 RETURNDATACOPY 0xe7 0xad 0x23 CALLCODE 0xbc PUSH18 0xFC3F3A04A13A07686C6578706572696D656E PUSH21 0x616CF5003700000000000000000000000000000000 ", "sourceMap": "744:871:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1244:318:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1244:318:3;;;;;;;;;;;1129:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1129:28:3;;;;;;;;;;;;;;;;;;;;;;;;;1679:431:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1679:431:2;;;;;;;;;1676:542:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1676:542:3;;;;;;;;;1181:432:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1181:432:9;;;;;;;;;;;;;;;;;;;292:20:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;292:20:17;;;;2391:525:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2391:525:3;;;;;;;;;1037:287:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1037:287:2;;;;;;;;;2122:112:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2122:112:1;;;;;;;;;;;;1080:43:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1080:43:3;;;;;;;;;;;;;;;;;3013:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3013:138:3;;;;;;;;;;;;566:167:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;566:167:17;;;;;;;;;1244:318:3;460:5:17;;-1:-1:-1;;;;;460:5:17;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:17;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1361:18:3;;;;;;:10;:18;;;;;;;;;;1393:25;;;;;;;;;;;;;;;;;;;1361:18;;1360:19;1339:89;;;;-1:-1:-1;;;;;1339:89:3;;;;;;;;;;-1:-1:-1;;;;;;1439:18:3;;;;;;1460:4;1439:18;;;;;;;;:25;;-1:-1:-1;;1439:25:3;;;;;1474:11;27:10:-1;;23:18;;;45:23;;1474:24:3;;;;;;;;-1:-1:-1;;1474:24:3;;;;;1513:42;1544:10;;1439:18;1513:42;;;1244:318;:::o;1129:28::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1129:28:3;;-1:-1:-1;1129:28:3;:::o;1679:431:2:-;1000:10:3;1897:9:2;989:22:3;;;:10;:22;;;;;;;;;1025:21;;;;;;;;;;;;;;;;;;;;989:22;;968:88;;;;;;-1:-1:-1;;;;;968:88:3;;;;;;;;;;;1909:1:2;1897:13;;1892:212;1916:9;:16;1912:1;:20;1892:212;;;1953:140;1991:9;2001:1;1991:12;;;;;;;;;;;;;;;;;;2021:4;2026:1;2021:7;;;;;;;;;;;;;;;;;;2046:2;2049:1;2046:5;;;;;;;;;;;;;;;;;;2069:7;2077:1;2069:10;;;;;;;;;;;;;;;;;;1953:20;:140::i;:::-;1934:3;;1892:212;;;1679:431;;;;;:::o;1676:542:3:-;1909:6;460:5:17;;-1:-1:-1;;;;;460:5:17;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:17;;;;;;;;;-1:-1:-1;;;;;1795:18:3;;;;;;:10;:18;;;;;;;;;;1827:21;;;;;;;;;;;;;;;;;;;1795:18;;1774:84;;;;;;-1:-1:-1;;;;;1774:84:3;;;;;;;;;;-1:-1:-1;;;;;;;1876:18:3;;;;;;:10;:18;;;;;1869:25;;-1:-1:-1;;1869:25:3;;;1904:249;1925:11;:18;1921:22;;1904:249;;;1986:6;-1:-1:-1;;;;;1968:24:3;:11;1980:1;1968:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1968:14:3;:24;1964:179;;;2029:11;2041:18;;-1:-1:-1;;2041:22:3;;;2029:35;;;;;;;;;;;;;;;;2012:11;:14;;-1:-1:-1;;;;;2029:35:3;;;;2024:1;;2012:14;;;;;;;;;;;;;;;:52;;-1:-1:-1;;2012:52:3;-1:-1:-1;;;;;2012:52:3;;;;;;;;;;2082:11;:23;;-1:-1:-1;;2082:23:3;;;;;;:::i;:::-;;2123:5;;1964:179;1945:3;;1904:249;;;2167:44;;2200:10;;-1:-1:-1;;;;;2167:44:3;;;;;;;;1676:542;;:::o;1181:432:9:-;1295:13;1322:15;1351:25;1480:32;1502:9;1480:21;:32::i;:::-;1401:111;;;;-1:-1:-1;1401:111:9;;-1:-1:-1;1181:432:9;-1:-1:-1;;1181:432:9:o;292:20:17:-;;;-1:-1:-1;;;;;292:20:17;;:::o;2391:525:3:-;2544:11;:18;2576:19;;;;;;;;;;;;;;;;;;2536:26;;2515:90;;;;-1:-1:-1;;;;;2515:90:3;;;;;;;;;;;2658:6;-1:-1:-1;;;;;2636:28:3;:11;2648:5;2636:18;;;;;;;;;;;;;;;;;;;;;2678:27;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2636:18:3;;;:28;2615:100;;;;-1:-1:-1;;;;;2615:100:3;;;;;;;;;;-1:-1:-1;;;;;;2733:18:3;;;;;;:10;:18;;;;;2726:25;;-1:-1:-1;;2726:25:3;;;2782:11;2794:18;;-1:-1:-1;;2794:22:3;;;2782:35;;;;;;;;;;;;;;;;2761:11;:18;;-1:-1:-1;;;;;2782:35:3;;;;2773:5;;2761:18;;;;;;;;;;;;;;;:56;;-1:-1:-1;;2761:56:3;-1:-1:-1;;;;;2761:56:3;;;;;;;;;;2827:11;:23;;-1:-1:-1;;2827:23:3;;;;;;:::i;:::-;-1:-1:-1;2865:44:3;;2898:10;;-1:-1:-1;;;;;2865:44:3;;;;;;;;2391:525;;:::o;1037:287:2:-;1000:10:3;989:22;;;;:10;:22;;;;;;;;;;1025:21;;;;;;;;;;;;;;;;;;;989:22;;968:88;;;;;;-1:-1:-1;;;;;968:88:3;;;;;;;;;;;1210:107:2;1244:9;;1210:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1267:4;1285:2;1301:6;1210:20;:107::i;2122:112:1:-;941:1;2122:112;;:::o;1080:43:3:-;;;;;;;;;;;;;;;:::o;3013:138::-;3094:9;3133:11;3126:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3126:18:3;;;;;;;;;;;;;;;;;;;;;;;3013:138;:::o;566:167:17:-;460:5;;-1:-1:-1;;;;;460:5:17;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:17;;;;;;;;;-1:-1:-1;;;;;662:22:17;;;658:69;;700:5;:16;;-1:-1:-1;;700:16:17;-1:-1:-1;;;;;700:16:17;;;;;658:69;566:167;:::o;1194:830:1:-;1451:14;;;;;;;;;;;;;;;;;1534:13;;;;1590:25;;1436:1;1426:11;;1405:70;;;;-1:-1:-1;;;;;1405:70:1;;;;;;;;;;;1628:32;1650:9;1628:21;:32::i;:::-;1520:140;;;;;;1841:1;1819:12;:19;:23;1815:203;;;1858:68;;;;;-1:-1:-1;;;;;1858:35:1;;;;;:68;;1894:4;;1900:2;;1904:7;;1913:12;;1858:68;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1858:68:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1858:68:1;;;;1815:203;;;1957:50;;;;;-1:-1:-1;;;;;1957:31:1;;;;;:50;;1989:4;;1995:2;;1999:7;;1957:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1957:50:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1957:50:1;;;;1815:203;1194:830;;;;;;;:::o;2621:531::-;2736:13;2763:15;2792:25;2880;2892:9;2903:1;2880:11;:25::i;:::-;2872:33;;2925:26;2937:9;2948:2;2925:11;:26::i;:::-;2915:36;;2984:2;2965:9;:16;:21;2961:91;;;3017:24;3027:9;3038:2;3017:9;:24::i;:::-;3002:39;;2961:91;2621:531;;;;;:::o;2855:884:14:-;2976:14;3039:5;3047:2;3039:10;3027:1;:8;:22;;3091:38;;;;;;;;;;;;;;;;;;;;;;;3006:133;;;;;;;-1:-1:-1;;;;;3006:133:14;;;;;;;;;;-1:-1:-1;;3386:2:14;3641:13;;;;;3635:20;3377:11;;;-1:-1:-1;;;;;3631:69:14;2855:884;;;;;:::o;7053:195::-;7174:14;7219:21;7231:1;7234:5;7219:11;:21::i;:::-;7211:30;7053:195;-1:-1:-1;;;7053:195:14:o;8352:784::-;8471:19;8545:25;8573:21;8585:1;8588:5;8573:11;:21::i;:::-;8545:49;;8613:2;8604:11;;;;8749:17;8741:5;:25;8729:1;:8;:37;;8780:48;;;;;;;;;;;;;;;;;;;;;;;8708:130;;;;;;;-1:-1:-1;;;;;8708:130:14;;;;;;;;;;;8920:17;8910:28;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;8910:28:14;;8901:37;;8948:157;8969:21;8983:6;8969:13;:21::i;:::-;8993:2;8969:26;9054:5;9035:16;9049:1;9035:13;:16::i;:::-;:24;9062:2;9035:29;9078:17;8948:7;:157::i;:::-;8352:784;;;;;:::o;5639:488::-;5760:14;5823:5;5831:2;5823:10;5811:1;:8;:22;;5847:38;;;;;;;;;;;;;;;;;;;;;;;5790:105;;;;;;;-1:-1:-1;;;;;5790:105:14;;;;;;;;;;-1:-1:-1;;6074:13:14;5976:2;6074:13;6068:20;;5639:488::o;1244:3897:15:-;1394:2;1385:6;:11;1381:3754;;;1683:1;1673:6;1669:2;1665:15;1660:3;1656:25;1652:33;1734:4;1730:9;1721:6;1715:13;1711:29;1783:4;1776;1770:11;1766:22;1824:1;1821;1818:8;1812:4;1805:22;1622:219;;;;;;1945:4;1935:6;:14;1931:59;;;1969:7;;1931:59;2679:4;2670:6;:13;2666:2459;;;2829:2;2821:6;2817:15;3125:2;3117:6;3113:15;3103:25;;3173:6;3165;3161:19;3223:6;3217:4;3213:17;3530:4;3524:11;3625:1;3611:219;3634:6;3631:1;3628:13;3611:219;;;3698:13;;3685:27;;3759:2;3795:13;;;;3747:15;;;;3655:1;3648:9;3611:219;;;-1:-1:-1;3899:18:15;;-1:-1:-1;2712:1223:15;;-1:-1:-1;2712:1223:15;;4099:2;4091:6;4087:15;4300:2;4292:6;4288:15;4278:25;;4348:6;4340;4336:19;4398:6;4392:4;4388:17;4708:6;4702:13;4805:1;4791:213;4814:6;4811:1;4808:13;4791:213;;;4878:11;;4865:25;;-1:-1:-1;;4923:13:15;;;;4969;;;;4835:1;4828:9;4791:213;;;-1:-1:-1;5074:19:15;;-1:-1:-1;;;3982:1129:15;1244:3897;;;:::o;744:871:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:118:-1;;72:46;110:6;97:20;72:46;;148:707;;258:4;246:17;;242:27;-1:-1;232:2;;283:1;280;273:12;232:2;320:6;307:20;342:80;357:64;414:6;357:64;;;342:80;;;333:89;;439:5;464:6;457:5;450:21;494:4;486:6;482:17;472:27;;516:4;511:3;507:14;500:21;;569:6;616:3;608:4;600:6;596:17;591:3;587:27;584:36;581:2;;;633:1;630;623:12;581:2;658:1;643:206;668:6;665:1;662:13;643:206;;;726:3;748:37;781:3;769:10;748:37;;;736:50;;-1:-1;809:4;800:14;;;;828;;;;;690:1;683:9;643:206;;;647:14;225:630;;;;;;;;879:693;;994:4;982:17;;978:27;-1:-1;968:2;;1019:1;1016;1009:12;968:2;1056:6;1043:20;1078:85;1093:69;1155:6;1093:69;;1078:85;1191:21;;;1235:4;1223:17;;;;1069:94;;-1:-1;1248:14;;1223:17;1343:1;1328:238;1353:6;1350:1;1347:13;1328:238;;;1436:3;1423:17;1415:6;1411:30;1460:42;1498:3;1486:10;1460:42;;;1448:55;;-1:-1;1526:4;1517:14;;;;1545;;;;;1375:1;1368:9;1328:238;;1598:707;;1708:4;1696:17;;1692:27;-1:-1;1682:2;;1733:1;1730;1723:12;1682:2;1770:6;1757:20;1792:80;1807:64;1864:6;1807:64;;1792:80;1783:89;;1889:5;1914:6;1907:5;1900:21;1944:4;1936:6;1932:17;1922:27;;1966:4;1961:3;1957:14;1950:21;;2019:6;2066:3;2058:4;2050:6;2046:17;2041:3;2037:27;2034:36;2031:2;;;2083:1;2080;2073:12;2031:2;2108:1;2093:206;2118:6;2115:1;2112:13;2093:206;;;2176:3;2198:37;2231:3;2219:10;2198:37;;;2186:50;;-1:-1;2259:4;2250:14;;;;2278;;;;;2140:1;2133:9;2093:206;;2327:335;;;2434:4;2422:17;;2418:27;-1:-1;2408:2;;2459:1;2456;2449:12;2408:2;-1:-1;2479:20;;2519:18;2508:30;;2505:2;;;2551:1;2548;2541:12;2505:2;2585:4;2577:6;2573:17;2561:29;;2635:3;2628;2620:6;2616:16;2606:8;2602:31;2599:40;2596:2;;;2652:1;2649;2642:12;2596:2;2401:261;;;;;;2671:432;;2761:4;2749:17;;2745:27;-1:-1;2735:2;;2786:1;2783;2776:12;2735:2;2823:6;2810:20;2845:60;2860:44;2897:6;2860:44;;2845:60;2836:69;;2925:6;2918:5;2911:21;2961:4;2953:6;2949:17;2994:4;2987:5;2983:16;3029:3;3020:6;3015:3;3011:16;3008:25;3005:2;;;3046:1;3043;3036:12;3005:2;3056:41;3090:6;3085:3;3080;3056:41;;;2728:375;;;;;;;;3560:118;;3627:46;3665:6;3652:20;3627:46;;3685:241;;3789:2;3777:9;3768:7;3764:23;3760:32;3757:2;;;3805:1;3802;3795:12;3757:2;3840:1;3857:53;3902:7;3882:9;3857:53;;;3847:63;3751:175;-1:-1;;;;3751:175;3933:366;;;4054:2;4042:9;4033:7;4029:23;4025:32;4022:2;;;4070:1;4067;4060:12;4022:2;4105:1;4122:53;4167:7;4147:9;4122:53;;;4112:63;;4084:97;4212:2;4230:53;4275:7;4266:6;4255:9;4251:22;4230:53;;;4220:63;;4191:98;4016:283;;;;;;4306:1171;;;;;4566:3;4554:9;4545:7;4541:23;4537:33;4534:2;;;4583:1;4580;4573:12;4534:2;4618:31;;4669:18;4658:30;;4655:2;;;4701:1;4698;4691:12;4655:2;4721:83;4796:7;4787:6;4776:9;4772:22;4721:83;;;4711:93;;4597:213;4869:2;4858:9;4854:18;4841:32;4893:18;4885:6;4882:30;4879:2;;;4925:1;4922;4915:12;4879:2;4945:78;5015:7;5006:6;4995:9;4991:22;4945:78;;;4935:88;;4820:209;5088:2;5077:9;5073:18;5060:32;5112:18;5104:6;5101:30;5098:2;;;5144:1;5141;5134:12;5098:2;5164:78;5234:7;5225:6;5214:9;5210:22;5164:78;;;5154:88;;5039:209;5307:2;5296:9;5292:18;5279:32;5331:18;5323:6;5320:30;5317:2;;;5363:1;5360;5353:12;5317:2;5383:78;5453:7;5444:6;5433:9;5429:22;5383:78;;;5373:88;;5258:209;4528:949;;;;;;;;5484:741;;;;;;5658:3;5646:9;5637:7;5633:23;5629:33;5626:2;;;5675:1;5672;5665:12;5626:2;5710:31;;5761:18;5750:30;;5747:2;;;5793:1;5790;5783:12;5747:2;5821:64;5877:7;5868:6;5857:9;5853:22;5821:64;;;5803:82;;;;5689:202;5922:2;5940:53;5985:7;5976:6;5965:9;5961:22;5940:53;;;5930:63;;5901:98;6030:2;6048:53;6093:7;6084:6;6073:9;6069:22;6048:53;;;6038:63;;6009:98;6138:2;6156:53;6201:7;6192:6;6181:9;6177:22;6156:53;;;6146:63;;6117:98;5620:605;;;;;;;;;6232:345;;6345:2;6333:9;6324:7;6320:23;6316:32;6313:2;;;6361:1;6358;6351:12;6313:2;6396:31;;6447:18;6436:30;;6433:2;;;6479:1;6476;6469:12;6433:2;6499:62;6553:7;6544:6;6533:9;6529:22;6499:62;;6584:241;;6688:2;6676:9;6667:7;6663:23;6659:32;6656:2;;;6704:1;6701;6694:12;6656:2;6739:1;6756:53;6801:7;6781:9;6756:53;;6832:110;6905:31;6930:5;6905:31;;;6900:3;6893:44;6887:55;;;6980:590;;7115:54;7163:5;7115:54;;;7187:6;7182:3;7175:19;7211:4;7206:3;7202:14;7195:21;;7256:56;7306:5;7256:56;;;7333:1;7318:230;7343:6;7340:1;7337:13;7318:230;;;7383:53;7432:3;7423:6;7417:13;7383:53;;;7453:60;7506:6;7453:60;;;7536:4;7527:14;;;;;7443:70;-1:-1;7365:1;7358:9;7318:230;;;-1:-1;7561:3;;7094:476;-1:-1;;;;7094:476;7578:101;7645:28;7667:5;7645:28;;7686:297;;7786:38;7818:5;7786:38;;;7841:6;7836:3;7829:19;7853:63;7909:6;7902:4;7897:3;7893:14;7886:4;7879:5;7875:16;7853:63;;;7948:29;7970:6;7948:29;;;7928:50;;;7941:4;7928:50;;7766:217;-1:-1;;;7766:217;8290:397;8445:2;8433:15;;8482:66;8477:2;8468:12;;8461:88;8583:66;8578:2;8569:12;;8562:88;8678:2;8669:12;;8426:261;8695:110;8768:31;8793:5;8768:31;;8812:104;8881:29;8904:5;8881:29;;8923:193;9031:2;9016:18;;9045:61;9020:9;9079:6;9045:61;;9123:395;9287:2;9272:18;;9301:61;9276:9;9335:6;9301:61;;;9373:62;9431:2;9420:9;9416:18;9407:6;9373:62;;;9446;9504:2;9493:9;9489:18;9480:6;9446:62;;9525:581;9735:3;9720:19;;9750:61;9724:9;9784:6;9750:61;;;9822:62;9880:2;9869:9;9865:18;9856:6;9822:62;;;9895;9953:2;9942:9;9938:18;9929:6;9895:62;;;10005:9;9999:4;9995:20;9990:2;9979:9;9975:18;9968:48;10030:66;10091:4;10082:6;10030:66;;;10022:74;9706:400;-1:-1;;;;;;9706:400;10113:479;10295:2;10280:18;;10309:61;10284:9;10343:6;10309:61;;;10381:62;10439:2;10428:9;10424:18;10415:6;10381:62;;;10491:9;10485:4;10481:20;10476:2;10465:9;10461:18;10454:48;10516:66;10577:4;10568:6;10516:66;;;10508:74;10266:326;-1:-1;;;;;10266:326;10599:341;10757:2;10771:47;;;10742:18;;10832:98;10742:18;10916:6;10832:98;;10947:181;11049:2;11034:18;;11063:55;11038:9;11091:6;11063:55;;11135:273;11259:2;11273:47;;;11244:18;;11334:64;11244:18;11384:6;11334:64;;11415:387;11596:2;11610:47;;;11581:18;;11671:121;11581:18;11671:121;;11809:185;11913:2;11898:18;;11927:57;11902:9;11957:6;11927:57;;12001:256;12063:2;12057:9;12089:17;;;12164:18;12149:34;;12185:22;;;12146:62;12143:2;;;12221:1;12218;12211:12;12143:2;12237;12230:22;12041:216;;-1:-1;12041:216;12264:258;;12423:18;12415:6;12412:30;12409:2;;;12455:1;12452;12445:12;12409:2;-1:-1;12484:4;12472:17;;;12502:15;;12346:176;13064:254;;13203:18;13195:6;13192:30;13189:2;;;13235:1;13232;13225:12;13189:2;-1:-1;13308:4;13279;13256:17;;;;-1:-1;;13252:33;13298:15;;13126:192;13592:121;13701:4;13689:17;;13670:43;13722:107;13812:12;;13796:33;14160:128;-1:-1;;;;;14229:54;;14212:76;14295:92;14368:13;14361:21;;14344:43;14480:88;14558:4;14547:16;;14530:38;14797:145;14878:6;14873:3;14868;14855:30;-1:-1;14934:1;14916:16;;14909:27;14848:94;14951:268;15016:1;15023:101;15037:6;15034:1;15031:13;15023:101;;;15104:11;;;15098:18;15085:11;;;15078:39;15059:2;15052:10;15023:101;;;15139:6;15136:1;15133:13;15130:2;;;15204:1;15195:6;15190:3;15186:16;15179:27;15130:2;15000:219;;;;;15227:97;15315:2;15295:14;-1:-1;;15291:28;;15275:49" } } @@ -332,7 +332,7 @@ } }, "sourceCodes": { - "current/protocol/AssetProxy/ERC20Proxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAssetProxy.sol\";\nimport \"./MixinAuthorizable.sol\";\nimport \"../../tokens/ERC20Token/IERC20Token.sol\";\n\ncontract ERC20Proxy is\n LibBytes,\n MixinAssetProxy,\n MixinAuthorizable\n{\n\n // Id of this proxy.\n uint8 constant PROXY_ID = 1;\n\n /// @dev Internal version of `transferFrom`.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFromInternal(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Decode asset data.\n address token = readAddress(assetData, 0);\n\n // Transfer tokens.\n bool success = IERC20Token(token).transferFrom(from, to, amount);\n require(\n success,\n TRANSFER_FAILED\n );\n }\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n view\n returns (uint8)\n {\n return PROXY_ID;\n }\n}\n", + "current/protocol/AssetProxy/ERC20Proxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAssetProxy.sol\";\nimport \"./MixinAuthorizable.sol\";\nimport \"../../tokens/ERC20Token/IERC20Token.sol\";\n\ncontract ERC20Proxy is\n LibBytes,\n MixinAssetProxy,\n MixinAuthorizable\n{\n\n // Id of this proxy.\n uint8 constant PROXY_ID = 1;\n\n /// @dev Internal version of `transferFrom`.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFromInternal(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Decode asset data.\n address token = readAddress(assetData, 0);\n\n // Transfer tokens.\n // We do a raw call so we can check the success separate\n // from the return data.\n bool success = token.call(abi.encodeWithSelector(\n IERC20Token(token).transferFrom.selector,\n from,\n to,\n amount\n ));\n require(\n success,\n TRANSFER_FAILED\n );\n \n // Check return data.\n // If there is no return data, we assume the token incorrectly\n // does not return a bool. In this case we expect it to revert\n // on failure, which was handled above.\n // If the token does return data, we require that it is a single\n // value that evaluates to true.\n assembly {\n if returndatasize {\n success := 0\n if eq(returndatasize, 32) {\n // First 64 bytes of memory are reserved scratch space\n returndatacopy(0, 0, 32)\n success := mload(0)\n }\n }\n }\n require(\n success,\n TRANSFER_FAILED\n );\n }\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n view\n returns (uint8)\n {\n return PROXY_ID;\n }\n}\n", "current/protocol/AssetProxy/ERC721Proxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAssetProxy.sol\";\nimport \"./MixinAuthorizable.sol\";\nimport \"../../tokens/ERC721Token/ERC721Token.sol\";\n\ncontract ERC721Proxy is\n LibBytes,\n MixinAssetProxy,\n MixinAuthorizable\n{\n\n // Id of this proxy.\n uint8 constant PROXY_ID = 2;\n\n /// @dev Internal version of `transferFrom`.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFromInternal(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // There exists only 1 of each token.\n require(\n amount == 1,\n INVALID_AMOUNT\n );\n \n // Decode asset data.\n (\n address token,\n uint256 tokenId,\n bytes memory receiverData\n ) = decodeERC721AssetData(assetData);\n\n // Transfer token. Saves gas by calling safeTransferFrom only\n // when there is receiverData present. Either succeeds or throws.\n if (receiverData.length > 0) {\n ERC721Token(token).safeTransferFrom(from, to, tokenId, receiverData);\n } else {\n ERC721Token(token).transferFrom(from, to, tokenId);\n }\n }\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n view\n returns (uint8)\n {\n return PROXY_ID;\n }\n\n /// @dev Decodes ERC721 Asset data.\n /// @param assetData Encoded byte array.\n /// @return proxyId Intended ERC721 proxy id.\n /// @return token ERC721 token address.\n /// @return tokenId ERC721 token id.\n /// @return receiverData Additional data with no specific format, which\n /// is passed to the receiving contract's onERC721Received.\n function decodeERC721AssetData(bytes memory assetData)\n internal\n pure\n returns (\n address token,\n uint256 tokenId,\n bytes memory receiverData\n )\n {\n // Decode asset data.\n token = readAddress(assetData, 0);\n tokenId = readUint256(assetData, 20);\n if (assetData.length > 52) {\n receiverData = readBytes(assetData, 52);\n }\n\n return (\n token,\n tokenId,\n receiverData\n );\n }\n}\n", "current/protocol/AssetProxy/MixinAssetProxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./mixins/MAuthorizable.sol\";\nimport \"./mixins/MAssetProxy.sol\";\n\ncontract MixinAssetProxy is\n MAuthorizable,\n MAssetProxy\n{\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes assetData,\n address from,\n address to,\n uint256 amount\n )\n external\n onlyAuthorized\n {\n transferFromInternal(\n assetData,\n from,\n to,\n amount\n );\n }\n\n /// @dev Makes multiple transfers of assets. Either succeeds or throws.\n /// @param assetData Array of byte arrays encoded for the respective asset proxy.\n /// @param from Array of addresses to transfer assets from.\n /// @param to Array of addresses to transfer assets to.\n /// @param amounts Array of amounts of assets to transfer.\n function batchTransferFrom(\n bytes[] memory assetData,\n address[] memory from,\n address[] memory to,\n uint256[] memory amounts\n )\n public\n onlyAuthorized\n {\n for (uint256 i = 0; i < assetData.length; i++) {\n transferFromInternal(\n assetData[i],\n from[i],\n to[i],\n amounts[i]\n );\n }\n }\n}\n", "current/protocol/AssetProxy/MixinAuthorizable.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibAssetProxyErrors.sol\";\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"./mixins/MAuthorizable.sol\";\n\ncontract MixinAuthorizable is\n LibAssetProxyErrors,\n Ownable,\n MAuthorizable\n{\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n require(\n authorized[msg.sender],\n SENDER_NOT_AUTHORIZED\n );\n _;\n }\n\n mapping (address => bool) public authorized;\n address[] public authorities;\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n !authorized[target],\n TARGET_ALREADY_AUTHORIZED\n );\n\n authorized[target] = true;\n authorities.push(target);\n emit AuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n authorized[target],\n TARGET_NOT_AUTHORIZED\n );\n\n delete authorized[target];\n for (uint i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n authorities[i] = authorities[authorities.length - 1];\n authorities.length -= 1;\n break;\n }\n }\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external\n {\n require(\n index < authorities.length,\n INDEX_OUT_OF_BOUNDS\n );\n require(\n authorities[index] == target,\n AUTHORIZED_ADDRESS_MISMATCH\n );\n\n delete authorized[target];\n authorities[index] = authorities[authorities.length - 1];\n authorities.length -= 1;\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory)\n {\n return authorities;\n }\n}\n", @@ -352,7 +352,7 @@ "current/utils/Ownable/Ownable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"Only contract owner is allowed to call this method.\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n", "current/utils/SafeMath/SafeMath.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\ncontract SafeMath {\n function safeMul(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a * b;\n assert(a == 0 || c / a == b);\n return c;\n }\n\n function safeDiv(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a / b;\n return c;\n }\n\n function safeSub(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n assert(b <= a);\n return a - b;\n }\n\n function safeAdd(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a + b;\n assert(c >= a);\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n" }, - "sourceTreeHashHex": "0xe13f23b83348f91049ed2e0ccaadb552f980ad27da2f620219c0cef2a5bdd77a", + "sourceTreeHashHex": "0xd0be67a7643194e2fea3aaa4e9a3d50f944884d90bf6a4517138786ef0e4d9c8", "compiler": { "name": "solc", "version": "soljson-v0.4.24+commit.e67f0147.js", diff --git a/packages/migrations/artifacts/2.0.0/TestSignatureValidator.json b/packages/migrations/artifacts/2.0.0/TestSignatureValidator.json index 90595ed89..7cc7ec315 100644 --- a/packages/migrations/artifacts/2.0.0/TestSignatureValidator.json +++ b/packages/migrations/artifacts/2.0.0/TestSignatureValidator.json @@ -124,6 +124,33 @@ "type": "bytes" } ], + "name": "isValidSignature", + "outputs": [ + { + "name": "isValid", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "hash", + "type": "bytes32" + }, + { + "name": "signer", + "type": "address" + }, + { + "name": "signature", + "type": "bytes" + } + ], "name": "publicIsValidSignature", "outputs": [ { @@ -179,15 +206,15 @@ "evm": { "bytecode": { "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b506115f9806100206000396000f30060806040526004361061008d5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633683ef8e8114610092578063642f2eaf146100b457806377fcce68146100ea5780637b8e35141461010a57806382c174d01461012a578063abba41cc1461014a578063bfc8bfce1461016a578063eea086ba1461018a575b600080fd5b34801561009e57600080fd5b506100b26100ad36600461128f565b6101ac565b005b3480156100c057600080fd5b506100d46100cf366004611252565b610278565b6040516100e19190611462565b60405180910390f35b3480156100f657600080fd5b506100b2610105366004611204565b61028d565b34801561011657600080fd5b506100d46101253660046111ca565b6102d2565b34801561013657600080fd5b506100d4610145366004611270565b6102f2565b34801561015657600080fd5b506100d46101653660046112f7565b61030f565b34801561017657600080fd5b506100b261018536600461135c565b610324565b34801561019657600080fd5b5061019f610656565b6040516100e19190611454565b6101e7848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750610665945050505050565b60408051808201909152601181527f494e56414c49445f5349474e415455524500000000000000000000000000000060208201529015156102475760405160e560020a62461bcd02815260040161023e91906114fb565b60405180910390fd5b505050600091825260208281526040808420600160a060020a0390931684529190529020805460ff19166001179055565b60026020526000908152604090205460ff1681565b6000610297610e3d565b600160a060020a03908116600090815260016020908152604080832096909316825294909452909220805460ff191691151591909117905550565b600160209081526000928352604080842090915290825290205460ff1681565b600060208181529281526040808220909352908152205460ff1681565b600061031c848484610665565b949350505050565b60035460408051808201909152601281527f5245454e5452414e43595f494c4c4547414c00000000000000000000000000006020820152600091600160a060020a0316156103885760405160e560020a62461bcd02815260040161023e91906114fb565b5030868887876040516020018086600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018481526020018383808284378201915050955050505050506040516020818303038152906040526040518082805190602001908083835b602083106104395780518252601f19909201916020918201910161041a565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008181526002835285902054838601909552600f83527f494e56414c49445f54585f48415348000000000000000000000000000000000091830191909152955093505060ff161590506104ca5760405160e560020a62461bcd02815260040161023e91906114fb565b50600160a060020a038616331461059757610516818785858080601f01602080910402602001604051908101604052809392919081815260200183838082843750610665945050505050565b60408051808201909152601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015290151561056d5760405160e560020a62461bcd02815260040161023e91906114fb565b506003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161790555b60008181526002602052604090819020805460ff191660011790555130908690869080838380828437820191505092505050600060405180830381855af460408051808201909152601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015292501515905061062f5760405160e560020a62461bcd02815260040161023e91906114fb565b50506003805473ffffffffffffffffffffffffffffffffffffffff19169055505050505050565b600354600160a060020a031681565b6000806000806000806000808851116040805190810160405280601e81526020017f4c454e4754485f475245415445525f5448414e5f305f524551554952454400008152509015156106cd5760405160e560020a62461bcd02815260040161023e91906114fb565b506106d788610e6c565b60f860020a900460ff1660088111156106ec57fe5b955060008660088111156106fc57fe5b141561075057604080518082018252601181527f5349474e41545552455f494c4c4547414c0000000000000000000000000000006020820152905160e560020a62461bcd02815261023e91906004016114fb565b600186600881111561075e57fe5b14156107c657875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156107bc5760405160e560020a62461bcd02815260040161023e91906114fb565b5060009650610e30565b60028660088111156107d457fe5b14156108dc57875160408051808201909152601281527f4c454e4754485f36365f524551554952454400000000000000000000000000006020820152906041146108345760405160e560020a62461bcd02815260040161023e91906114fb565b5087600081518110151561084457fe5b016020015160f860020a908190048102049450610862886001610f21565b935061086f886021610f21565b925060018a8686866040516000815260200160405260405161089494939291906114c6565b60206040516020810390808403906000865af11580156108b8573d6000803e3d6000fd5b5050604051601f190151600160a060020a038b81169082161498509250610e309050565b60038660088111156108ea57fe5b1415610a9657875160408051808201909152601281527f4c454e4754485f36365f5245515549524544000000000000000000000000000060208201529060411461094a5760405160e560020a62461bcd02815260040161023e91906114fb565b5087600081518110151561095a57fe5b016020015160f860020a908190048102049450610978886001610f21565b9350610985886021610f21565b925060016040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152508b6040516020018083805190602001908083835b602083106109f25780518252601f1990920191602091820191016109d3565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b60208310610a525780518252601f199092019160209182019101610a33565b51815160209384036101000a6000190180199092169116179052604080519290940182900382206000835291019283905261089494509250899189915088906114c6565b6004866008811115610aa457fe5b1415610b1657875160408051808201909152601181527f4c454e4754485f315f524551554952454400000000000000000000000000000060208201529015610b025760405160e560020a62461bcd02815260040161023e91906114fb565b50600160a060020a03891633149650610e30565b6005866008811115610b2457fe5b1415610bca576040517f1626ba7e000000000000000000000000000000000000000000000000000000008152600160a060020a038a1690631626ba7e90610b71908d908c906004016114a6565b602060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bc39190810190611234565b9650610e30565b6006866008811115610bd857fe5b1415610c6b57610be788610fb5565b600160a060020a03808b1660009081526001602090815260408083209385168352929052205490915060ff161515610c225760009650610e30565b6040517f93634702000000000000000000000000000000000000000000000000000000008152600160a060020a03821690639363470290610b71908d908d908d90600401611470565b6007866008811115610c7957fe5b1415610caa5760008a815260208181526040808320600160a060020a038d16845290915290205460ff169650610e30565b6008866008811115610cb857fe5b1415610da357875160408051808201909152601281527f4c454e4754485f36365f52455155495245440000000000000000000000000000602082015290604114610d185760405160e560020a62461bcd02815260040161023e91906114fb565b50876000815181101515610d2857fe5b016020015160f860020a908190048102049450610d46886001610f21565b9350610d53886021610f21565b604080518082018252601b8082527f19457468657265756d205369676e6564204d6573736167653a0a4100000000006020808401918252935194975060019492938f9301918291908083836109f2565b6007866008811115610db157fe5b1415610de25760008a815260208181526040808320600160a060020a038d16845290915290205460ff169650610e30565b604080518082018252601581527f5349474e41545552455f554e535550504f5254454400000000000000000000006020820152905160e560020a62461bcd02815261023e91906004016114fb565b5050505050509392505050565b6003546000908190600160a060020a031615610e6457600354600160a060020a0316610e66565b335b92915050565b600080825111606060405190810160405280602181526020017f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524581526020017f4400000000000000000000000000000000000000000000000000000000000000815250901515610ef25760405160e560020a62461bcd02815260040161023e91906114fb565b50815182906000198101908110610f0557fe5b01602001518251600019019092525060f860020a908190040290565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610fab5760405160e560020a62461bcd02815260040161023e91906114fb565b5050016020015190565b6000601482511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f515549524544000000000000000000000000000000000000000000000000000081525090151561103d5760405160e560020a62461bcd02815260040161023e91906114fb565b5061104c826014845103611059565b8251601319019092525090565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f51554952454400000000000000000000000000000000000000000000000000008152509015156110e35760405160e560020a62461bcd02815260040161023e91906114fb565b50500160140151600160a060020a031690565b6000611102823561155f565b9392505050565b6000611102823561156b565b6000611102825161156b565b60006111028235611570565b600080601f8301841361113f57600080fd5b50813567ffffffffffffffff81111561115757600080fd5b60208301915083600182028301111561116f57600080fd5b9250929050565b6000601f8201831361118757600080fd5b813561119a61119582611533565b61150c565b915080825260208301602083018583830111156111b657600080fd5b6111c1838284611579565b50505092915050565b600080604083850312156111dd57600080fd5b60006111e985856110f6565b92505060206111fa858286016110f6565b9150509250929050565b6000806040838503121561121757600080fd5b600061122385856110f6565b92505060206111fa85828601611109565b60006020828403121561124657600080fd5b600061031c8484611115565b60006020828403121561126457600080fd5b600061031c8484611121565b6000806040838503121561128357600080fd5b60006111e98585611121565b600080600080606085870312156112a557600080fd5b60006112b18787611121565b94505060206112c2878288016110f6565b935050604085013567ffffffffffffffff8111156112df57600080fd5b6112eb8782880161112d565b95989497509550505050565b60008060006060848603121561130c57600080fd5b60006113188686611121565b9350506020611329868287016110f6565b925050604084013567ffffffffffffffff81111561134657600080fd5b61135286828701611176565b9150509250925092565b6000806000806000806080878903121561137557600080fd5b60006113818989611121565b965050602061139289828a016110f6565b955050604087013567ffffffffffffffff8111156113af57600080fd5b6113bb89828a0161112d565b9450945050606087013567ffffffffffffffff8111156113da57600080fd5b6113e689828a0161112d565b92509250509295509295509295565b6113fe8161155f565b82525050565b6113fe8161156b565b6113fe81611570565b60006114218261155b565b808452611435816020860160208601611585565b61143e816115b5565b9093016020019392505050565b6113fe81611573565b60208101610e6682846113f5565b60208101610e668284611404565b6060810161147e828661140d565b61148b60208301856113f5565b818103604083015261149d8184611416565b95945050505050565b604081016114b4828561140d565b818103602083015261031c8184611416565b608081016114d4828761140d565b6114e1602083018661144b565b6114ee604083018561140d565b61149d606083018461140d565b602080825281016111028184611416565b60405181810167ffffffffffffffff8111828210171561152b57600080fd5b604052919050565b600067ffffffffffffffff82111561154a57600080fd5b506020601f91909101601f19160190565b5190565b600160a060020a031690565b151590565b90565b60ff1690565b82818337506000910152565b60005b838110156115a0578181015183820152602001611588565b838111156115af576000848401525b50505050565b601f01601f1916905600a265627a7a7230582070e5c063e1fc970c5b091155b9cae44ab7b9144b1f58be405bd746290a0a55056c6578706572696d656e74616cf50037", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15F9 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3683EF8E DUP2 EQ PUSH2 0x92 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0xB4 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x10A JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x12A JUMPI DUP1 PUSH4 0xABBA41CC EQ PUSH2 0x14A JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x16A JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x18A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0xAD CALLDATASIZE PUSH1 0x4 PUSH2 0x128F JUMP JUMPDEST PUSH2 0x1AC JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0xCF CALLDATASIZE PUSH1 0x4 PUSH2 0x1252 JUMP JUMPDEST PUSH2 0x278 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE1 SWAP2 SWAP1 PUSH2 0x1462 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x105 CALLDATASIZE PUSH1 0x4 PUSH2 0x1204 JUMP JUMPDEST PUSH2 0x28D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x116 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0x125 CALLDATASIZE PUSH1 0x4 PUSH2 0x11CA JUMP JUMPDEST PUSH2 0x2D2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x136 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0x145 CALLDATASIZE PUSH1 0x4 PUSH2 0x1270 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x156 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0x165 CALLDATASIZE PUSH1 0x4 PUSH2 0x12F7 JUMP JUMPDEST PUSH2 0x30F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x176 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x185 CALLDATASIZE PUSH1 0x4 PUSH2 0x135C JUMP JUMPDEST PUSH2 0x324 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19F PUSH2 0x656 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE1 SWAP2 SWAP1 PUSH2 0x1454 JUMP JUMPDEST PUSH2 0x1E7 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x665 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x247 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x297 PUSH2 0xE3D JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP7 SWAP1 SWAP4 AND DUP3 MSTORE SWAP5 SWAP1 SWAP5 MSTORE SWAP1 SWAP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 MSTORE SWAP1 DUP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31C DUP5 DUP5 DUP5 PUSH2 0x665 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x388 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP ADDRESS DUP7 DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x439 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x41A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 DUP4 MSTORE DUP6 SWAP1 KECCAK256 SLOAD DUP4 DUP7 ADD SWAP1 SWAP6 MSTORE PUSH1 0xF DUP4 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP6 POP SWAP4 POP POP PUSH1 0xFF AND ISZERO SWAP1 POP PUSH2 0x4CA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND CALLER EQ PUSH2 0x597 JUMPI PUSH2 0x516 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x665 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x56D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP3 POP ISZERO ISZERO SWAP1 POP PUSH2 0x62F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP POP PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP9 MLOAD GT PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x6CD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP PUSH2 0x6D7 DUP9 PUSH2 0xE6C JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x6EC JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x6FC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x750 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x23E SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x14FB JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x75E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x7C6 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x7BC JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP PUSH1 0x0 SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x7D4 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x8DC JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x834 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x844 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x862 DUP9 PUSH1 0x1 PUSH2 0xF21 JUMP JUMPDEST SWAP4 POP PUSH2 0x86F DUP9 PUSH1 0x21 PUSH2 0xF21 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP11 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x894 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8B8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP12 DUP2 AND SWAP1 DUP3 AND EQ SWAP9 POP SWAP3 POP PUSH2 0xE30 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x8EA JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xA96 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x94A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x95A JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x978 DUP9 PUSH1 0x1 PUSH2 0xF21 JUMP JUMPDEST SWAP4 POP PUSH2 0x985 DUP9 PUSH1 0x21 PUSH2 0xF21 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x9F2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x9D3 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP4 DUP5 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 SUB DUP2 MSTORE SWAP4 DUP3 ADD SWAP1 DUP2 SWAP1 MSTORE DUP4 MLOAD SWAP4 SWAP5 POP SWAP3 DUP4 SWAP3 POP SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xA52 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA33 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x894 SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xAA4 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xB16 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0xB02 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND CALLER EQ SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xB24 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xBCA JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP11 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0xB71 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x14A6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xBC3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1234 JUMP JUMPDEST SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xBD8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xC6B JUMPI PUSH2 0xBE7 DUP9 PUSH2 0xFB5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xC22 JUMPI PUSH1 0x0 SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0xB71 SWAP1 DUP14 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x1470 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xC79 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xCAA JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xCB8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xDA3 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0xD18 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD28 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0xD46 DUP9 PUSH1 0x1 PUSH2 0xF21 JUMP JUMPDEST SWAP4 POP PUSH2 0xD53 DUP9 PUSH1 0x21 PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1B DUP1 DUP3 MSTORE PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A410000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE SWAP4 MLOAD SWAP5 SWAP8 POP PUSH1 0x1 SWAP5 SWAP3 SWAP4 DUP16 SWAP4 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH2 0x9F2 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xDB1 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xDE2 JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x23E SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x14FB JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0xE64 JUMPI PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0xE66 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xEF2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP DUP2 MLOAD DUP3 SWAP1 PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0xF05 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH1 0x0 NOT ADD SWAP1 SWAP3 MSTORE POP PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xFAB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x103D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP PUSH2 0x104C DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x1059 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x13 NOT ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x10E3 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP POP ADD PUSH1 0x14 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1102 DUP3 CALLDATALOAD PUSH2 0x155F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1102 DUP3 CALLDATALOAD PUSH2 0x156B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1102 DUP3 MLOAD PUSH2 0x156B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1102 DUP3 CALLDATALOAD PUSH2 0x1570 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x113F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x116F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x119A PUSH2 0x1195 DUP3 PUSH2 0x1533 JUMP JUMPDEST PUSH2 0x150C JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x11B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11C1 DUP4 DUP3 DUP5 PUSH2 0x1579 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x11DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11E9 DUP6 DUP6 PUSH2 0x10F6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x11FA DUP6 DUP3 DUP7 ADD PUSH2 0x10F6 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1223 DUP6 DUP6 PUSH2 0x10F6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x11FA DUP6 DUP3 DUP7 ADD PUSH2 0x1109 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1246 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x31C DUP5 DUP5 PUSH2 0x1115 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1264 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x31C DUP5 DUP5 PUSH2 0x1121 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1283 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11E9 DUP6 DUP6 PUSH2 0x1121 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x12A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x12B1 DUP8 DUP8 PUSH2 0x1121 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x12C2 DUP8 DUP3 DUP9 ADD PUSH2 0x10F6 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12EB DUP8 DUP3 DUP9 ADD PUSH2 0x112D JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x130C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1318 DUP7 DUP7 PUSH2 0x1121 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x1329 DUP7 DUP3 DUP8 ADD PUSH2 0x10F6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1346 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1352 DUP7 DUP3 DUP8 ADD PUSH2 0x1176 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1375 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1381 DUP10 DUP10 PUSH2 0x1121 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x1392 DUP10 DUP3 DUP11 ADD PUSH2 0x10F6 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13BB DUP10 DUP3 DUP11 ADD PUSH2 0x112D JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13E6 DUP10 DUP3 DUP11 ADD PUSH2 0x112D JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x13FE DUP2 PUSH2 0x155F JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x13FE DUP2 PUSH2 0x156B JUMP JUMPDEST PUSH2 0x13FE DUP2 PUSH2 0x1570 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1421 DUP3 PUSH2 0x155B JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1435 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1585 JUMP JUMPDEST PUSH2 0x143E DUP2 PUSH2 0x15B5 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x13FE DUP2 PUSH2 0x1573 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE66 DUP3 DUP5 PUSH2 0x13F5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE66 DUP3 DUP5 PUSH2 0x1404 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x147E DUP3 DUP7 PUSH2 0x140D JUMP JUMPDEST PUSH2 0x148B PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x13F5 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x149D DUP2 DUP5 PUSH2 0x1416 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x14B4 DUP3 DUP6 PUSH2 0x140D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x31C DUP2 DUP5 PUSH2 0x1416 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x14D4 DUP3 DUP8 PUSH2 0x140D JUMP JUMPDEST PUSH2 0x14E1 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x144B JUMP JUMPDEST PUSH2 0x14EE PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x140D JUMP JUMPDEST PUSH2 0x149D PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x140D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1102 DUP2 DUP5 PUSH2 0x1416 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x152B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x154A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x15A0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1588 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x15AF JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 PUSH17 0xE5C063E1FC970C5B091155B9CAE44AB7B9 EQ 0x4b 0x1f PC 0xbe BLOCKHASH JUMPDEST 0xd7 0x46 0x29 EXP EXP SSTORE SDIV PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ", + "object": "0x608060405234801561001057600080fd5b50611624806100206000396000f3006080604052600436106100985763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633683ef8e811461009d578063642f2eaf146100bf57806377fcce68146100f55780637b8e35141461011557806382c174d0146101355780639363470214610155578063abba41cc14610175578063bfc8bfce14610195578063eea086ba146101b5575b600080fd5b3480156100a957600080fd5b506100bd6100b83660046112ba565b6101d7565b005b3480156100cb57600080fd5b506100df6100da36600461127d565b6102a3565b6040516100ec919061148d565b60405180910390f35b34801561010157600080fd5b506100bd61011036600461122f565b6102b8565b34801561012157600080fd5b506100df6101303660046111f5565b6102fd565b34801561014157600080fd5b506100df61015036600461129b565b61031d565b34801561016157600080fd5b506100df610170366004611322565b61033a565b34801561018157600080fd5b506100df610190366004611322565b610b12565b3480156101a157600080fd5b506100bd6101b0366004611387565b610b27565b3480156101c157600080fd5b506101ca610e59565b6040516100ec919061147f565b610212848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375061033a945050505050565b60408051808201909152601181527f494e56414c49445f5349474e415455524500000000000000000000000000000060208201529015156102725760405160e560020a62461bcd0281526004016102699190611526565b60405180910390fd5b505050600091825260208281526040808420600160a060020a0390931684529190529020805460ff19166001179055565b60026020526000908152604090205460ff1681565b60006102c2610e68565b600160a060020a03908116600090815260016020908152604080832096909316825294909452909220805460ff191691151591909117905550565b600160209081526000928352604080842090915290825290205460ff1681565b600060208181529281526040808220909352908152205460ff1681565b6000806000806000806000808851116040805190810160405280601e81526020017f4c454e4754485f475245415445525f5448414e5f305f524551554952454400008152509015156103a25760405160e560020a62461bcd0281526004016102699190611526565b506103ac88610e97565b60f860020a900460ff1660088111156103c157fe5b955060008660088111156103d157fe5b141561042557604080518082018252601181527f5349474e41545552455f494c4c4547414c0000000000000000000000000000006020820152905160e560020a62461bcd0281526102699190600401611526565b600186600881111561043357fe5b141561049b57875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156104915760405160e560020a62461bcd0281526004016102699190611526565b5060009650610b05565b60028660088111156104a957fe5b14156105b157875160408051808201909152601281527f4c454e4754485f36365f524551554952454400000000000000000000000000006020820152906041146105095760405160e560020a62461bcd0281526004016102699190611526565b5087600081518110151561051957fe5b016020015160f860020a908190048102049450610537886001610f4c565b9350610544886021610f4c565b925060018a8686866040516000815260200160405260405161056994939291906114f1565b60206040516020810390808403906000865af115801561058d573d6000803e3d6000fd5b5050604051601f190151600160a060020a038b81169082161498509250610b059050565b60038660088111156105bf57fe5b141561076b57875160408051808201909152601281527f4c454e4754485f36365f5245515549524544000000000000000000000000000060208201529060411461061f5760405160e560020a62461bcd0281526004016102699190611526565b5087600081518110151561062f57fe5b016020015160f860020a90819004810204945061064d886001610f4c565b935061065a886021610f4c565b925060016040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152508b6040516020018083805190602001908083835b602083106106c75780518252601f1990920191602091820191016106a8565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b602083106107275780518252601f199092019160209182019101610708565b51815160209384036101000a6000190180199092169116179052604080519290940182900382206000835291019283905261056994509250899189915088906114f1565b600486600881111561077957fe5b14156107eb57875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156107d75760405160e560020a62461bcd0281526004016102699190611526565b50600160a060020a03891633149650610b05565b60058660088111156107f957fe5b141561089f576040517f1626ba7e000000000000000000000000000000000000000000000000000000008152600160a060020a038a1690631626ba7e90610846908d908c906004016114d1565b602060405180830381600087803b15801561086057600080fd5b505af1158015610874573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610898919081019061125f565b9650610b05565b60068660088111156108ad57fe5b1415610940576108bc88610fe0565b600160a060020a03808b1660009081526001602090815260408083209385168352929052205490915060ff1615156108f75760009650610b05565b6040517f93634702000000000000000000000000000000000000000000000000000000008152600160a060020a03821690639363470290610846908d908d908d9060040161149b565b600786600881111561094e57fe5b141561097f5760008a815260208181526040808320600160a060020a038d16845290915290205460ff169650610b05565b600886600881111561098d57fe5b1415610a7857875160408051808201909152601281527f4c454e4754485f36365f524551554952454400000000000000000000000000006020820152906041146109ed5760405160e560020a62461bcd0281526004016102699190611526565b508760008151811015156109fd57fe5b016020015160f860020a908190048102049450610a1b886001610f4c565b9350610a28886021610f4c565b604080518082018252601b8082527f19457468657265756d205369676e6564204d6573736167653a0a4100000000006020808401918252935194975060019492938f9301918291908083836106c7565b6007866008811115610a8657fe5b1415610ab75760008a815260208181526040808320600160a060020a038d16845290915290205460ff169650610b05565b604080518082018252601581527f5349474e41545552455f554e535550504f5254454400000000000000000000006020820152905160e560020a62461bcd0281526102699190600401611526565b5050505050509392505050565b6000610b1f84848461033a565b949350505050565b60035460408051808201909152601281527f5245454e5452414e43595f494c4c4547414c00000000000000000000000000006020820152600091600160a060020a031615610b8b5760405160e560020a62461bcd0281526004016102699190611526565b5030868887876040516020018086600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018481526020018383808284378201915050955050505050506040516020818303038152906040526040518082805190602001908083835b60208310610c3c5780518252601f199092019160209182019101610c1d565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008181526002835285902054838601909552600f83527f494e56414c49445f54585f48415348000000000000000000000000000000000091830191909152955093505060ff16159050610ccd5760405160e560020a62461bcd0281526004016102699190611526565b50600160a060020a0386163314610d9a57610d19818785858080601f0160208091040260200160405190810160405280939291908181526020018383808284375061033a945050505050565b60408051808201909152601481527f494e56414c49445f54585f5349474e41545552450000000000000000000000006020820152901515610d705760405160e560020a62461bcd0281526004016102699190611526565b506003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161790555b60008181526002602052604090819020805460ff191660011790555130908690869080838380828437820191505092505050600060405180830381855af460408051808201909152601081527f4641494c45445f455845435554494f4e000000000000000000000000000000006020820152925015159050610e325760405160e560020a62461bcd0281526004016102699190611526565b50506003805473ffffffffffffffffffffffffffffffffffffffff19169055505050505050565b600354600160a060020a031681565b6003546000908190600160a060020a031615610e8f57600354600160a060020a0316610e91565b335b92915050565b600080825111606060405190810160405280602181526020017f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524581526020017f4400000000000000000000000000000000000000000000000000000000000000815250901515610f1d5760405160e560020a62461bcd0281526004016102699190611526565b50815182906000198101908110610f3057fe5b01602001518251600019019092525060f860020a908190040290565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610fd65760405160e560020a62461bcd0281526004016102699190611526565b5050016020015190565b6000601482511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f51554952454400000000000000000000000000000000000000000000000000008152509015156110685760405160e560020a62461bcd0281526004016102699190611526565b50611077826014845103611084565b8251601319019092525090565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f515549524544000000000000000000000000000000000000000000000000000081525090151561110e5760405160e560020a62461bcd0281526004016102699190611526565b50500160140151600160a060020a031690565b600061112d823561158a565b9392505050565b600061112d8235611596565b600061112d8251611596565b600061112d823561159b565b600080601f8301841361116a57600080fd5b50813567ffffffffffffffff81111561118257600080fd5b60208301915083600182028301111561119a57600080fd5b9250929050565b6000601f820183136111b257600080fd5b81356111c56111c08261155e565b611537565b915080825260208301602083018583830111156111e157600080fd5b6111ec8382846115a4565b50505092915050565b6000806040838503121561120857600080fd5b60006112148585611121565b925050602061122585828601611121565b9150509250929050565b6000806040838503121561124257600080fd5b600061124e8585611121565b925050602061122585828601611134565b60006020828403121561127157600080fd5b6000610b1f8484611140565b60006020828403121561128f57600080fd5b6000610b1f848461114c565b600080604083850312156112ae57600080fd5b6000611214858561114c565b600080600080606085870312156112d057600080fd5b60006112dc878761114c565b94505060206112ed87828801611121565b935050604085013567ffffffffffffffff81111561130a57600080fd5b61131687828801611158565b95989497509550505050565b60008060006060848603121561133757600080fd5b6000611343868661114c565b935050602061135486828701611121565b925050604084013567ffffffffffffffff81111561137157600080fd5b61137d868287016111a1565b9150509250925092565b600080600080600080608087890312156113a057600080fd5b60006113ac898961114c565b96505060206113bd89828a01611121565b955050604087013567ffffffffffffffff8111156113da57600080fd5b6113e689828a01611158565b9450945050606087013567ffffffffffffffff81111561140557600080fd5b61141189828a01611158565b92509250509295509295509295565b6114298161158a565b82525050565b61142981611596565b6114298161159b565b600061144c82611586565b8084526114608160208601602086016115b0565b611469816115e0565b9093016020019392505050565b6114298161159e565b60208101610e918284611420565b60208101610e91828461142f565b606081016114a98286611438565b6114b66020830185611420565b81810360408301526114c88184611441565b95945050505050565b604081016114df8285611438565b8181036020830152610b1f8184611441565b608081016114ff8287611438565b61150c6020830186611476565b6115196040830185611438565b6114c86060830184611438565b6020808252810161112d8184611441565b60405181810167ffffffffffffffff8111828210171561155657600080fd5b604052919050565b600067ffffffffffffffff82111561157557600080fd5b506020601f91909101601f19160190565b5190565b600160a060020a031690565b151590565b90565b60ff1690565b82818337506000910152565b60005b838110156115cb5781810151838201526020016115b3565b838111156115da576000848401525b50505050565b601f01601f1916905600a265627a7a72305820a31be282370e9cd42607a999ad8d6fb8e33282b5ca17efe4e6e21deff1fcd3c26c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1624 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x98 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3683EF8E DUP2 EQ PUSH2 0x9D JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0xBF JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0xF5 JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x115 JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0xABBA41CC EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x195 JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x1B5 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBD PUSH2 0xB8 CALLDATASIZE PUSH1 0x4 PUSH2 0x12BA JUMP JUMPDEST PUSH2 0x1D7 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0xDA CALLDATASIZE PUSH1 0x4 PUSH2 0x127D JUMP JUMPDEST PUSH2 0x2A3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEC SWAP2 SWAP1 PUSH2 0x148D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x101 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBD PUSH2 0x110 CALLDATASIZE PUSH1 0x4 PUSH2 0x122F JUMP JUMPDEST PUSH2 0x2B8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x121 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x130 CALLDATASIZE PUSH1 0x4 PUSH2 0x11F5 JUMP JUMPDEST PUSH2 0x2FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x141 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x150 CALLDATASIZE PUSH1 0x4 PUSH2 0x129B JUMP JUMPDEST PUSH2 0x31D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x161 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0x1322 JUMP JUMPDEST PUSH2 0x33A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x190 CALLDATASIZE PUSH1 0x4 PUSH2 0x1322 JUMP JUMPDEST PUSH2 0xB12 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBD PUSH2 0x1B0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1387 JUMP JUMPDEST PUSH2 0xB27 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CA PUSH2 0xE59 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEC SWAP2 SWAP1 PUSH2 0x147F JUMP JUMPDEST PUSH2 0x212 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x33A SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x272 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2C2 PUSH2 0xE68 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP7 SWAP1 SWAP4 AND DUP3 MSTORE SWAP5 SWAP1 SWAP5 MSTORE SWAP1 SWAP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 MSTORE SWAP1 DUP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP9 MLOAD GT PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x3A2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP PUSH2 0x3AC DUP9 PUSH2 0xE97 JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x3C1 JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x3D1 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x425 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x269 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x1526 JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x433 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x49B JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x491 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP PUSH1 0x0 SWAP7 POP PUSH2 0xB05 JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x4A9 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x5B1 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x509 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x519 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x537 DUP9 PUSH1 0x1 PUSH2 0xF4C JUMP JUMPDEST SWAP4 POP PUSH2 0x544 DUP9 PUSH1 0x21 PUSH2 0xF4C JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP11 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x569 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x14F1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x58D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP12 DUP2 AND SWAP1 DUP3 AND EQ SWAP9 POP SWAP3 POP PUSH2 0xB05 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x5BF JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x76B JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x61F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x62F JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x64D DUP9 PUSH1 0x1 PUSH2 0xF4C JUMP JUMPDEST SWAP4 POP PUSH2 0x65A DUP9 PUSH1 0x21 PUSH2 0xF4C JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x6C7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x6A8 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP4 DUP5 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 SUB DUP2 MSTORE SWAP4 DUP3 ADD SWAP1 DUP2 SWAP1 MSTORE DUP4 MLOAD SWAP4 SWAP5 POP SWAP3 DUP4 SWAP3 POP SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x727 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x708 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x569 SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x14F1 JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x779 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x7EB JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x7D7 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND CALLER EQ SWAP7 POP PUSH2 0xB05 JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x7F9 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x89F JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP11 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x846 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x14D1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x860 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x874 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x898 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x125F JUMP JUMPDEST SWAP7 POP PUSH2 0xB05 JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x8AD JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x940 JUMPI PUSH2 0x8BC DUP9 PUSH2 0xFE0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8F7 JUMPI PUSH1 0x0 SWAP7 POP PUSH2 0xB05 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x846 SWAP1 DUP14 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x149B JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x94E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x97F JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0xB05 JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x98D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xA78 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x9ED JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9FD JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0xA1B DUP9 PUSH1 0x1 PUSH2 0xF4C JUMP JUMPDEST SWAP4 POP PUSH2 0xA28 DUP9 PUSH1 0x21 PUSH2 0xF4C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1B DUP1 DUP3 MSTORE PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A410000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE SWAP4 MLOAD SWAP5 SWAP8 POP PUSH1 0x1 SWAP5 SWAP3 SWAP4 DUP16 SWAP4 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH2 0x6C7 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xA86 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xAB7 JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0xB05 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x269 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x1526 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB1F DUP5 DUP5 DUP5 PUSH2 0x33A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0xB8B JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP ADDRESS DUP7 DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xC3C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xC1D JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 DUP4 MSTORE DUP6 SWAP1 KECCAK256 SLOAD DUP4 DUP7 ADD SWAP1 SWAP6 MSTORE PUSH1 0xF DUP4 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP6 POP SWAP4 POP POP PUSH1 0xFF AND ISZERO SWAP1 POP PUSH2 0xCCD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND CALLER EQ PUSH2 0xD9A JUMPI PUSH2 0xD19 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x33A SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0xD70 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP3 POP ISZERO ISZERO SWAP1 POP PUSH2 0xE32 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP POP PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0xE8F JUMPI PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0xE91 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xF1D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP DUP2 MLOAD DUP3 SWAP1 PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0xF30 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH1 0x0 NOT ADD SWAP1 SWAP3 MSTORE POP PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xFD6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x1068 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP PUSH2 0x1077 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x1084 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x13 NOT ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x110E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP POP ADD PUSH1 0x14 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x112D DUP3 CALLDATALOAD PUSH2 0x158A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x112D DUP3 CALLDATALOAD PUSH2 0x1596 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x112D DUP3 MLOAD PUSH2 0x1596 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x112D DUP3 CALLDATALOAD PUSH2 0x159B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x116A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1182 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x119A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x11B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x11C5 PUSH2 0x11C0 DUP3 PUSH2 0x155E JUMP JUMPDEST PUSH2 0x1537 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x11E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11EC DUP4 DUP3 DUP5 PUSH2 0x15A4 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1214 DUP6 DUP6 PUSH2 0x1121 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1225 DUP6 DUP3 DUP7 ADD PUSH2 0x1121 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1242 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x124E DUP6 DUP6 PUSH2 0x1121 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1225 DUP6 DUP3 DUP7 ADD PUSH2 0x1134 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1271 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xB1F DUP5 DUP5 PUSH2 0x1140 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x128F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xB1F DUP5 DUP5 PUSH2 0x114C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x12AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1214 DUP6 DUP6 PUSH2 0x114C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x12D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x12DC DUP8 DUP8 PUSH2 0x114C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x12ED DUP8 DUP3 DUP9 ADD PUSH2 0x1121 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x130A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1316 DUP8 DUP3 DUP9 ADD PUSH2 0x1158 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1337 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1343 DUP7 DUP7 PUSH2 0x114C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x1354 DUP7 DUP3 DUP8 ADD PUSH2 0x1121 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1371 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x137D DUP7 DUP3 DUP8 ADD PUSH2 0x11A1 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x13A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x13AC DUP10 DUP10 PUSH2 0x114C JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x13BD DUP10 DUP3 DUP11 ADD PUSH2 0x1121 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13E6 DUP10 DUP3 DUP11 ADD PUSH2 0x1158 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1405 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1411 DUP10 DUP3 DUP11 ADD PUSH2 0x1158 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x1429 DUP2 PUSH2 0x158A JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1429 DUP2 PUSH2 0x1596 JUMP JUMPDEST PUSH2 0x1429 DUP2 PUSH2 0x159B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x144C DUP3 PUSH2 0x1586 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1460 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x15B0 JUMP JUMPDEST PUSH2 0x1469 DUP2 PUSH2 0x15E0 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1429 DUP2 PUSH2 0x159E JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE91 DUP3 DUP5 PUSH2 0x1420 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE91 DUP3 DUP5 PUSH2 0x142F JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x14A9 DUP3 DUP7 PUSH2 0x1438 JUMP JUMPDEST PUSH2 0x14B6 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1420 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x14C8 DUP2 DUP5 PUSH2 0x1441 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x14DF DUP3 DUP6 PUSH2 0x1438 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0xB1F DUP2 DUP5 PUSH2 0x1441 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x14FF DUP3 DUP8 PUSH2 0x1438 JUMP JUMPDEST PUSH2 0x150C PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1476 JUMP JUMPDEST PUSH2 0x1519 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1438 JUMP JUMPDEST PUSH2 0x14C8 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x1438 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x112D DUP2 DUP5 PUSH2 0x1441 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1556 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1575 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x15CB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x15B3 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x15DA JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 LOG3 SHL 0xe2 DUP3 CALLDATACOPY 0xe SWAP13 0xd4 0x26 SMOD 0xa9 SWAP10 0xad DUP14 PUSH16 0xB8E33282B5CA17EFE4E6E21DEFF1FCD3 0xc2 PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ", "sourceMap": "759:412:9:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;759:412:9;;;;;;;" }, "deployedBytecode": { "linkReferences": {}, - "object": "0x60806040526004361061008d5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633683ef8e8114610092578063642f2eaf146100b457806377fcce68146100ea5780637b8e35141461010a57806382c174d01461012a578063abba41cc1461014a578063bfc8bfce1461016a578063eea086ba1461018a575b600080fd5b34801561009e57600080fd5b506100b26100ad36600461128f565b6101ac565b005b3480156100c057600080fd5b506100d46100cf366004611252565b610278565b6040516100e19190611462565b60405180910390f35b3480156100f657600080fd5b506100b2610105366004611204565b61028d565b34801561011657600080fd5b506100d46101253660046111ca565b6102d2565b34801561013657600080fd5b506100d4610145366004611270565b6102f2565b34801561015657600080fd5b506100d46101653660046112f7565b61030f565b34801561017657600080fd5b506100b261018536600461135c565b610324565b34801561019657600080fd5b5061019f610656565b6040516100e19190611454565b6101e7848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750610665945050505050565b60408051808201909152601181527f494e56414c49445f5349474e415455524500000000000000000000000000000060208201529015156102475760405160e560020a62461bcd02815260040161023e91906114fb565b60405180910390fd5b505050600091825260208281526040808420600160a060020a0390931684529190529020805460ff19166001179055565b60026020526000908152604090205460ff1681565b6000610297610e3d565b600160a060020a03908116600090815260016020908152604080832096909316825294909452909220805460ff191691151591909117905550565b600160209081526000928352604080842090915290825290205460ff1681565b600060208181529281526040808220909352908152205460ff1681565b600061031c848484610665565b949350505050565b60035460408051808201909152601281527f5245454e5452414e43595f494c4c4547414c00000000000000000000000000006020820152600091600160a060020a0316156103885760405160e560020a62461bcd02815260040161023e91906114fb565b5030868887876040516020018086600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018481526020018383808284378201915050955050505050506040516020818303038152906040526040518082805190602001908083835b602083106104395780518252601f19909201916020918201910161041a565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008181526002835285902054838601909552600f83527f494e56414c49445f54585f48415348000000000000000000000000000000000091830191909152955093505060ff161590506104ca5760405160e560020a62461bcd02815260040161023e91906114fb565b50600160a060020a038616331461059757610516818785858080601f01602080910402602001604051908101604052809392919081815260200183838082843750610665945050505050565b60408051808201909152601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015290151561056d5760405160e560020a62461bcd02815260040161023e91906114fb565b506003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161790555b60008181526002602052604090819020805460ff191660011790555130908690869080838380828437820191505092505050600060405180830381855af460408051808201909152601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015292501515905061062f5760405160e560020a62461bcd02815260040161023e91906114fb565b50506003805473ffffffffffffffffffffffffffffffffffffffff19169055505050505050565b600354600160a060020a031681565b6000806000806000806000808851116040805190810160405280601e81526020017f4c454e4754485f475245415445525f5448414e5f305f524551554952454400008152509015156106cd5760405160e560020a62461bcd02815260040161023e91906114fb565b506106d788610e6c565b60f860020a900460ff1660088111156106ec57fe5b955060008660088111156106fc57fe5b141561075057604080518082018252601181527f5349474e41545552455f494c4c4547414c0000000000000000000000000000006020820152905160e560020a62461bcd02815261023e91906004016114fb565b600186600881111561075e57fe5b14156107c657875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156107bc5760405160e560020a62461bcd02815260040161023e91906114fb565b5060009650610e30565b60028660088111156107d457fe5b14156108dc57875160408051808201909152601281527f4c454e4754485f36365f524551554952454400000000000000000000000000006020820152906041146108345760405160e560020a62461bcd02815260040161023e91906114fb565b5087600081518110151561084457fe5b016020015160f860020a908190048102049450610862886001610f21565b935061086f886021610f21565b925060018a8686866040516000815260200160405260405161089494939291906114c6565b60206040516020810390808403906000865af11580156108b8573d6000803e3d6000fd5b5050604051601f190151600160a060020a038b81169082161498509250610e309050565b60038660088111156108ea57fe5b1415610a9657875160408051808201909152601281527f4c454e4754485f36365f5245515549524544000000000000000000000000000060208201529060411461094a5760405160e560020a62461bcd02815260040161023e91906114fb565b5087600081518110151561095a57fe5b016020015160f860020a908190048102049450610978886001610f21565b9350610985886021610f21565b925060016040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152508b6040516020018083805190602001908083835b602083106109f25780518252601f1990920191602091820191016109d3565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b60208310610a525780518252601f199092019160209182019101610a33565b51815160209384036101000a6000190180199092169116179052604080519290940182900382206000835291019283905261089494509250899189915088906114c6565b6004866008811115610aa457fe5b1415610b1657875160408051808201909152601181527f4c454e4754485f315f524551554952454400000000000000000000000000000060208201529015610b025760405160e560020a62461bcd02815260040161023e91906114fb565b50600160a060020a03891633149650610e30565b6005866008811115610b2457fe5b1415610bca576040517f1626ba7e000000000000000000000000000000000000000000000000000000008152600160a060020a038a1690631626ba7e90610b71908d908c906004016114a6565b602060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bc39190810190611234565b9650610e30565b6006866008811115610bd857fe5b1415610c6b57610be788610fb5565b600160a060020a03808b1660009081526001602090815260408083209385168352929052205490915060ff161515610c225760009650610e30565b6040517f93634702000000000000000000000000000000000000000000000000000000008152600160a060020a03821690639363470290610b71908d908d908d90600401611470565b6007866008811115610c7957fe5b1415610caa5760008a815260208181526040808320600160a060020a038d16845290915290205460ff169650610e30565b6008866008811115610cb857fe5b1415610da357875160408051808201909152601281527f4c454e4754485f36365f52455155495245440000000000000000000000000000602082015290604114610d185760405160e560020a62461bcd02815260040161023e91906114fb565b50876000815181101515610d2857fe5b016020015160f860020a908190048102049450610d46886001610f21565b9350610d53886021610f21565b604080518082018252601b8082527f19457468657265756d205369676e6564204d6573736167653a0a4100000000006020808401918252935194975060019492938f9301918291908083836109f2565b6007866008811115610db157fe5b1415610de25760008a815260208181526040808320600160a060020a038d16845290915290205460ff169650610e30565b604080518082018252601581527f5349474e41545552455f554e535550504f5254454400000000000000000000006020820152905160e560020a62461bcd02815261023e91906004016114fb565b5050505050509392505050565b6003546000908190600160a060020a031615610e6457600354600160a060020a0316610e66565b335b92915050565b600080825111606060405190810160405280602181526020017f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524581526020017f4400000000000000000000000000000000000000000000000000000000000000815250901515610ef25760405160e560020a62461bcd02815260040161023e91906114fb565b50815182906000198101908110610f0557fe5b01602001518251600019019092525060f860020a908190040290565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610fab5760405160e560020a62461bcd02815260040161023e91906114fb565b5050016020015190565b6000601482511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f515549524544000000000000000000000000000000000000000000000000000081525090151561103d5760405160e560020a62461bcd02815260040161023e91906114fb565b5061104c826014845103611059565b8251601319019092525090565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f51554952454400000000000000000000000000000000000000000000000000008152509015156110e35760405160e560020a62461bcd02815260040161023e91906114fb565b50500160140151600160a060020a031690565b6000611102823561155f565b9392505050565b6000611102823561156b565b6000611102825161156b565b60006111028235611570565b600080601f8301841361113f57600080fd5b50813567ffffffffffffffff81111561115757600080fd5b60208301915083600182028301111561116f57600080fd5b9250929050565b6000601f8201831361118757600080fd5b813561119a61119582611533565b61150c565b915080825260208301602083018583830111156111b657600080fd5b6111c1838284611579565b50505092915050565b600080604083850312156111dd57600080fd5b60006111e985856110f6565b92505060206111fa858286016110f6565b9150509250929050565b6000806040838503121561121757600080fd5b600061122385856110f6565b92505060206111fa85828601611109565b60006020828403121561124657600080fd5b600061031c8484611115565b60006020828403121561126457600080fd5b600061031c8484611121565b6000806040838503121561128357600080fd5b60006111e98585611121565b600080600080606085870312156112a557600080fd5b60006112b18787611121565b94505060206112c2878288016110f6565b935050604085013567ffffffffffffffff8111156112df57600080fd5b6112eb8782880161112d565b95989497509550505050565b60008060006060848603121561130c57600080fd5b60006113188686611121565b9350506020611329868287016110f6565b925050604084013567ffffffffffffffff81111561134657600080fd5b61135286828701611176565b9150509250925092565b6000806000806000806080878903121561137557600080fd5b60006113818989611121565b965050602061139289828a016110f6565b955050604087013567ffffffffffffffff8111156113af57600080fd5b6113bb89828a0161112d565b9450945050606087013567ffffffffffffffff8111156113da57600080fd5b6113e689828a0161112d565b92509250509295509295509295565b6113fe8161155f565b82525050565b6113fe8161156b565b6113fe81611570565b60006114218261155b565b808452611435816020860160208601611585565b61143e816115b5565b9093016020019392505050565b6113fe81611573565b60208101610e6682846113f5565b60208101610e668284611404565b6060810161147e828661140d565b61148b60208301856113f5565b818103604083015261149d8184611416565b95945050505050565b604081016114b4828561140d565b818103602083015261031c8184611416565b608081016114d4828761140d565b6114e1602083018661144b565b6114ee604083018561140d565b61149d606083018461140d565b602080825281016111028184611416565b60405181810167ffffffffffffffff8111828210171561152b57600080fd5b604052919050565b600067ffffffffffffffff82111561154a57600080fd5b506020601f91909101601f19160190565b5190565b600160a060020a031690565b151590565b90565b60ff1690565b82818337506000910152565b60005b838110156115a0578181015183820152602001611588565b838111156115af576000848401525b50505050565b601f01601f1916905600a265627a7a7230582070e5c063e1fc970c5b091155b9cae44ab7b9144b1f58be405bd746290a0a55056c6578706572696d656e74616cf50037", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3683EF8E DUP2 EQ PUSH2 0x92 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0xB4 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x10A JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x12A JUMPI DUP1 PUSH4 0xABBA41CC EQ PUSH2 0x14A JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x16A JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x18A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0xAD CALLDATASIZE PUSH1 0x4 PUSH2 0x128F JUMP JUMPDEST PUSH2 0x1AC JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0xCF CALLDATASIZE PUSH1 0x4 PUSH2 0x1252 JUMP JUMPDEST PUSH2 0x278 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE1 SWAP2 SWAP1 PUSH2 0x1462 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x105 CALLDATASIZE PUSH1 0x4 PUSH2 0x1204 JUMP JUMPDEST PUSH2 0x28D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x116 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0x125 CALLDATASIZE PUSH1 0x4 PUSH2 0x11CA JUMP JUMPDEST PUSH2 0x2D2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x136 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0x145 CALLDATASIZE PUSH1 0x4 PUSH2 0x1270 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x156 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0x165 CALLDATASIZE PUSH1 0x4 PUSH2 0x12F7 JUMP JUMPDEST PUSH2 0x30F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x176 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x185 CALLDATASIZE PUSH1 0x4 PUSH2 0x135C JUMP JUMPDEST PUSH2 0x324 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19F PUSH2 0x656 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE1 SWAP2 SWAP1 PUSH2 0x1454 JUMP JUMPDEST PUSH2 0x1E7 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x665 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x247 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x297 PUSH2 0xE3D JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP7 SWAP1 SWAP4 AND DUP3 MSTORE SWAP5 SWAP1 SWAP5 MSTORE SWAP1 SWAP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 MSTORE SWAP1 DUP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31C DUP5 DUP5 DUP5 PUSH2 0x665 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x388 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP ADDRESS DUP7 DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x439 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x41A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 DUP4 MSTORE DUP6 SWAP1 KECCAK256 SLOAD DUP4 DUP7 ADD SWAP1 SWAP6 MSTORE PUSH1 0xF DUP4 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP6 POP SWAP4 POP POP PUSH1 0xFF AND ISZERO SWAP1 POP PUSH2 0x4CA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND CALLER EQ PUSH2 0x597 JUMPI PUSH2 0x516 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x665 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x56D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP3 POP ISZERO ISZERO SWAP1 POP PUSH2 0x62F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP POP PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP9 MLOAD GT PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x6CD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP PUSH2 0x6D7 DUP9 PUSH2 0xE6C JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x6EC JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x6FC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x750 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x23E SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x14FB JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x75E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x7C6 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x7BC JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP PUSH1 0x0 SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x7D4 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x8DC JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x834 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x844 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x862 DUP9 PUSH1 0x1 PUSH2 0xF21 JUMP JUMPDEST SWAP4 POP PUSH2 0x86F DUP9 PUSH1 0x21 PUSH2 0xF21 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP11 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x894 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8B8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP12 DUP2 AND SWAP1 DUP3 AND EQ SWAP9 POP SWAP3 POP PUSH2 0xE30 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x8EA JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xA96 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x94A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x95A JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x978 DUP9 PUSH1 0x1 PUSH2 0xF21 JUMP JUMPDEST SWAP4 POP PUSH2 0x985 DUP9 PUSH1 0x21 PUSH2 0xF21 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x9F2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x9D3 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP4 DUP5 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 SUB DUP2 MSTORE SWAP4 DUP3 ADD SWAP1 DUP2 SWAP1 MSTORE DUP4 MLOAD SWAP4 SWAP5 POP SWAP3 DUP4 SWAP3 POP SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xA52 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA33 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x894 SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xAA4 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xB16 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0xB02 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND CALLER EQ SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xB24 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xBCA JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP11 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0xB71 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x14A6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xBC3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1234 JUMP JUMPDEST SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xBD8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xC6B JUMPI PUSH2 0xBE7 DUP9 PUSH2 0xFB5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xC22 JUMPI PUSH1 0x0 SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0xB71 SWAP1 DUP14 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x1470 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xC79 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xCAA JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xCB8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xDA3 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0xD18 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD28 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0xD46 DUP9 PUSH1 0x1 PUSH2 0xF21 JUMP JUMPDEST SWAP4 POP PUSH2 0xD53 DUP9 PUSH1 0x21 PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1B DUP1 DUP3 MSTORE PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A410000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE SWAP4 MLOAD SWAP5 SWAP8 POP PUSH1 0x1 SWAP5 SWAP3 SWAP4 DUP16 SWAP4 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH2 0x9F2 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xDB1 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xDE2 JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x23E SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x14FB JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0xE64 JUMPI PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0xE66 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xEF2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP DUP2 MLOAD DUP3 SWAP1 PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0xF05 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH1 0x0 NOT ADD SWAP1 SWAP3 MSTORE POP PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xFAB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x103D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP PUSH2 0x104C DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x1059 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x13 NOT ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x10E3 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14FB JUMP JUMPDEST POP POP ADD PUSH1 0x14 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1102 DUP3 CALLDATALOAD PUSH2 0x155F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1102 DUP3 CALLDATALOAD PUSH2 0x156B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1102 DUP3 MLOAD PUSH2 0x156B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1102 DUP3 CALLDATALOAD PUSH2 0x1570 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x113F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x116F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x119A PUSH2 0x1195 DUP3 PUSH2 0x1533 JUMP JUMPDEST PUSH2 0x150C JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x11B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11C1 DUP4 DUP3 DUP5 PUSH2 0x1579 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x11DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11E9 DUP6 DUP6 PUSH2 0x10F6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x11FA DUP6 DUP3 DUP7 ADD PUSH2 0x10F6 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1223 DUP6 DUP6 PUSH2 0x10F6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x11FA DUP6 DUP3 DUP7 ADD PUSH2 0x1109 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1246 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x31C DUP5 DUP5 PUSH2 0x1115 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1264 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x31C DUP5 DUP5 PUSH2 0x1121 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1283 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11E9 DUP6 DUP6 PUSH2 0x1121 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x12A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x12B1 DUP8 DUP8 PUSH2 0x1121 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x12C2 DUP8 DUP3 DUP9 ADD PUSH2 0x10F6 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12EB DUP8 DUP3 DUP9 ADD PUSH2 0x112D JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x130C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1318 DUP7 DUP7 PUSH2 0x1121 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x1329 DUP7 DUP3 DUP8 ADD PUSH2 0x10F6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1346 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1352 DUP7 DUP3 DUP8 ADD PUSH2 0x1176 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1375 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1381 DUP10 DUP10 PUSH2 0x1121 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x1392 DUP10 DUP3 DUP11 ADD PUSH2 0x10F6 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13BB DUP10 DUP3 DUP11 ADD PUSH2 0x112D JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13E6 DUP10 DUP3 DUP11 ADD PUSH2 0x112D JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x13FE DUP2 PUSH2 0x155F JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x13FE DUP2 PUSH2 0x156B JUMP JUMPDEST PUSH2 0x13FE DUP2 PUSH2 0x1570 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1421 DUP3 PUSH2 0x155B JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1435 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1585 JUMP JUMPDEST PUSH2 0x143E DUP2 PUSH2 0x15B5 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x13FE DUP2 PUSH2 0x1573 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE66 DUP3 DUP5 PUSH2 0x13F5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE66 DUP3 DUP5 PUSH2 0x1404 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x147E DUP3 DUP7 PUSH2 0x140D JUMP JUMPDEST PUSH2 0x148B PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x13F5 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x149D DUP2 DUP5 PUSH2 0x1416 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x14B4 DUP3 DUP6 PUSH2 0x140D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x31C DUP2 DUP5 PUSH2 0x1416 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x14D4 DUP3 DUP8 PUSH2 0x140D JUMP JUMPDEST PUSH2 0x14E1 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x144B JUMP JUMPDEST PUSH2 0x14EE PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x140D JUMP JUMPDEST PUSH2 0x149D PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x140D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1102 DUP2 DUP5 PUSH2 0x1416 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x152B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x154A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x15A0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1588 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x15AF JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 PUSH17 0xE5C063E1FC970C5B091155B9CAE44AB7B9 EQ 0x4b 0x1f PC 0xbe BLOCKHASH JUMPDEST 0xd7 0x46 0x29 EXP EXP SSTORE SDIV PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ", - "sourceMap": "759:412:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1723:275:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1723:275:0;;;;;;;;;;;945:45:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;945:45:1;;;;;;;;;;;;;;;;;;;;;;;;;2228:233:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2228:233:0;;;;;;;;;1324:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1324:71:0;;;;;;;;;1204:63;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1204:63:0;;;;;;;;;852:317:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;852:317:9;;;;;;;;;1397:1380:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1397:1380:1;;;;;;;;;1042:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1042:36:1;;;;;;;;;;;;1723:275:0;1869:41;1886:4;1892:6;1900:9;;1869:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1869:16:0;;-1:-1:-1;;;;;1869:41:0:i;:::-;1924:17;;;;;;;;;;;;;;;;;;1848:103;;;;;;-1:-1:-1;;;;;1848:103:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1961:9:0;:15;;;;;;;;;;;-1:-1:-1;;;;;1961:23:0;;;;;;;;;;:30;;-1:-1:-1;;1961:30:0;1987:4;1961:30;;;1723:275::o;945:45:1:-;;;;;;;;;;;;;;;:::o;2228:233:0:-;2354:14;2371:26;:24;:26::i;:::-;-1:-1:-1;;;;;2407:25:0;;;;;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;:47;;-1:-1:-1;;2407:47:0;;;;;;;;;;-1:-1:-1;2228:233:0:o;1324:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1204:63::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;852:317:9:-;1013:12;1051:87;1081:4;1099:6;1119:9;1051:16;:87::i;:::-;1041:97;852:317;-1:-1:-1;;;;852:317:9:o;1397:1380:1:-;1604:21;;1653:18;;;;;;;;;;;;;;;;;1730:23;;-1:-1:-1;;;;;1604:21:1;:35;1583:98;;;;-1:-1:-1;;;;;1583:98:1;;;;;;;;;;;1804:4;1823:6;1843:4;1861;;1766:109;;;;;;-1:-1:-1;;;;;1766:109:1;-1:-1:-1;;;;;1766:109:1;;;;;;;;-1:-1:-1;;;;;1766:109:1;-1:-1:-1;;;;;1766:109:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1766:109:1;;;1756:120;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1756:120:1;;;;;;;;;;;;-1:-1:-1;1963:29:1;;;:12;:29;;;;;;2006:15;;;;;;;;;;;;;;;;;1756:120;-1:-1:-1;1756:120:1;-1:-1:-1;;1963:29:1;;1962:30;;-1:-1:-1;1941:90:1;;;;-1:-1:-1;;;;;1941:90:1;;;;;;;;;;-1:-1:-1;;;;;;2117:20:1;;2127:10;2117:20;2113:309;;2212:52;2229:15;2246:6;2254:9;;2212:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2212:16:1;;-1:-1:-1;;;;;2212:52:1:i;:::-;2282:20;;;;;;;;;;;;;;;;;;2187:129;;;;;;-1:-1:-1;;;;;2187:129:1;;;;;;;;;;-1:-1:-1;2381:21:1;:30;;-1:-1:-1;;2381:30:1;-1:-1:-1;;;;;2381:30:1;;;;;2113:309;2463:29;;;;:12;:29;;;;;;;:36;;-1:-1:-1;;2463:36:1;2495:4;2463:36;;;2530:32;2538:4;;2557;;;;2530:32;2557:4;;;;2530:32;;;;;;;;;;;;;;;;;;;;;2576:16;;;;;;;;;;;;;;;;;;-1:-1:-1;2509:93:1;;;-1:-1:-1;2509:93:1;;;;-1:-1:-1;;;;;2509:93:1;;;;;;;;;;-1:-1:-1;;2736:21:1;:34;;-1:-1:-1;;2736:34:1;;;-1:-1:-1;;;;;;1397:1380:1:o;1042:36::-;;;-1:-1:-1;;;;;1042:36:1;;:::o;2826:6495:0:-;2983:12;3284:27;3418:7;3435:9;3454;3473:17;7095;3164:1;3145:9;:16;:20;3179:30;;;;;;;;;;;;;;;;;;3124:95;;;;;;;-1:-1:-1;;;;;3124:95:0;;;;;;;;;;;3334:22;3346:9;3334:11;:22::i;:::-;-1:-1:-1;;;3328:29:0;;3314:44;;;;;;;;;;3284:74;-1:-1:-1;3840:21:0;3823:13;:38;;;;;;;;;3819:5154;;;3884:17;;;;;;;;;;;;;;;;3877:25;;-1:-1:-1;;;;;3877:25:0;;;;3884:17;3877:25;;;;3819:5154;4184:21;4167:13;:38;;;;;;;;;4163:4810;;;4246:16;;4285:17;;;;;;;;;;;;;;;;;;4246:21;4221:95;;;;-1:-1:-1;;;;;4221:95:0;;;;;;;;;;-1:-1:-1;4340:5:0;;-1:-1:-1;4359:14:0;;4163:4810;4446:20;4429:13;:37;;;;;;;;;4425:4548;;;4507:16;;4547:18;;;;;;;;;;;;;;;;;;4527:2;4507:22;4482:97;;;;-1:-1:-1;;;;;4482:97:0;;;;;;;;;;;4603:9;4613:1;4603:12;;;;;;;;;;;;;;-1:-1:-1;;;4603:12:0;;;;;;4597:19;;-1:-1:-1;4634:25:0;4646:9;4657:1;4634:11;:25::i;:::-;4630:29;;4677:26;4689:9;4700:2;4677:11;:26::i;:::-;4673:30;;4729:24;4739:4;4745:1;4748;4751;4729:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4729:24:0;;-1:-1:-1;;4729:24:0;;-1:-1:-1;;;;;4777:19:0;;;;;;;;-1:-1:-1;4729:24:0;-1:-1:-1;4810:14:0;;-1:-1:-1;4810:14:0;4425:4548;4901:21;4884:13;:38;;;;;;;;;4880:4093;;;4963:16;;5003:18;;;;;;;;;;;;;;;;;;4983:2;4963:22;4938:97;;;;-1:-1:-1;;;;;4938:97:0;;;;;;;;;;;5059:9;5069:1;5059:12;;;;;;;;;;;;;;-1:-1:-1;;;5059:12:0;;;;;;5053:19;;-1:-1:-1;5090:25:0;5102:9;5113:1;5090:11;:25::i;:::-;5086:29;;5133:26;5145:9;5156:2;5133:11;:26::i;:::-;5129:30;;5185:153;5239:20;;;;;;;;;;;;;;;;;;5261:4;5222:44;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5222:44:0;;;;;-1:-1:-1;5222:44:0;;;26:21:-1;;;6:49;;5222:44:0;;;;;;;5212:55;;5222:44;;-1:-1:-1;5222:44:0;;;-1:-1:-1;5212:55:0;;;;;5222:44;5212:55;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5212:55:0;;;;;;;;;;;;-1:-1:-1;5185:153:0;;;;;;;;;;-1:-1:-1;5212:55:0;-1:-1:-1;5285:1:0;;5304;;-1:-1:-1;5323:1:0;;5185:153;;4880:4093;5999:20;5982:13;:37;;;;;;;;;5978:2995;;;6060:16;;6099:17;;;;;;;;;;;;;;;;;;6060:21;6035:95;;;;-1:-1:-1;;;;;6035:95:0;;;;;;;;;;-1:-1:-1;;;;;;6154:20:0;;6164:10;6154:20;;-1:-1:-1;6188:14:0;;5978:2995;6372:20;6355:13;:37;;;;;;;;;6351:2622;;;6418:49;;;;;-1:-1:-1;;;;;6418:32:0;;;;;:49;;6451:4;;6457:9;;6418:49;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6418:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6418:49:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6418:49:0;;;;;;;;;6408:59;-1:-1:-1;6481:14:0;;6351:2622;6994:23;6977:13;:40;;;;;;;;;6973:2000;;;7115:25;7130:9;7115:14;:25::i;:::-;-1:-1:-1;;;;;7212:25:0;;;;;;;:17;:25;;;;;;;;:36;;;;;;;;;;7095:45;;-1:-1:-1;7212:36:0;;7211:37;7207:88;;;7275:5;7268:12;;;;7207:88;7318:125;;;;;-1:-1:-1;;;;;7318:38:0;;;;;:125;;7374:4;;7396:6;;7420:9;;7318:125;;;;6973:2000;7579:23;7562:13;:40;;;;;;;;;7558:1415;;;7628:9;:15;;;;;;;;;;;-1:-1:-1;;;;;7628:23:0;;;;;;;;;;;;;-1:-1:-1;7665:14:0;;7558:1415;8245:20;8228:13;:37;;;;;;;;;8224:749;;;8306:16;;8346:18;;;;;;;;;;;;;;;;;;8326:2;8306:22;8281:97;;;;-1:-1:-1;;;;;8281:97:0;;;;;;;;;;;8402:9;8412:1;8402:12;;;;;;;;;;;;;;-1:-1:-1;;;8402:12:0;;;;;;8396:19;;-1:-1:-1;8433:25:0;8445:9;8456:1;8433:11;:25::i;:::-;8429:29;;8476:26;8488:9;8499:2;8476:11;:26::i;:::-;8582:23;;;;;;;;;;;;;;;;;;;;8565:47;;8472:30;;-1:-1:-1;8528:156:0;;8582:23;;8607:4;;8565:47;;;;8582:23;;8565:47;8582:23;36:153:-1;;8224:749:0;8862:23;8845:13;:40;;;;;;;;;8841:132;;;8911:9;:15;;;;;;;;;;;-1:-1:-1;;;;;8911:23:0;;;;;;;;;;;;;-1:-1:-1;8948:14:0;;8841:132;9292:21;;;;;;;;;;;;;;;;9285:29;;-1:-1:-1;;;;;9285:29:0;;;;9292:21;9285:29;;;;2826:6495;;;;;;;;;;;;:::o;3221:241:1:-;3352:21;;3304:7;;;;-1:-1:-1;;;;;3352:21:1;:35;:72;;3403:21;;-1:-1:-1;;;;;3403:21:1;3352:72;;;3390:10;3352:72;3327:97;3221:241;-1:-1:-1;;3221:241:1:o;1520:446:10:-;1604:13;1665:1;1654;:8;:12;1680:33;;;;;;;;;;;;;;;;;;;;;;;1633:90;;;;;;;-1:-1:-1;;;;;1633:90:10;;;;;;;;;;-1:-1:-1;1773:8:10;;1771:1;;-1:-1:-1;;1773:12:10;;;1771:15;;;;;;;;;;1885:8;;-1:-1:-1;;1881:16:10;1910:17;;;-1:-1:-1;;;;1771:15:10;;;;;;1520:446::o;5639:488::-;5760:14;5823:5;5831:2;5823:10;5811:1;:8;:22;;5847:38;;;;;;;;;;;;;;;;;;;;;;;5790:105;;;;;;;-1:-1:-1;;;;;5790:105:10;;;;;;;;;;-1:-1:-1;;6074:13:10;5976:2;6074:13;6068:20;;5639:488::o;2161:480::-;2248:14;2311:2;2299:1;:8;:14;;2327:38;;;;;;;;;;;;;;;;;;;;;;;2278:97;;;;;;;-1:-1:-1;;;;;2278:97:10;;;;;;;;;;;2427:29;2439:1;2453:2;2442:1;:8;:13;2427:11;:29::i;:::-;2559:8;;-1:-1:-1;;2555:17:10;2585;;;-1:-1:-1;2418:38:10;2161:480::o;2855:884::-;2976:14;3039:5;3047:2;3039:10;3027:1;:8;:22;;3091:38;;;;;;;;;;;;;;;;;;;;;;;3006:133;;;;;;;-1:-1:-1;;;;;3006:133:10;;;;;;;;;;-1:-1:-1;;3641:13:10;3386:2;3641:13;3635:20;-1:-1:-1;;;;;3631:69:10;;2855:884::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;130:112;;194:43;229:6;216:20;194:43;;249:116;;324:36;352:6;346:13;324:36;;372:118;;439:46;477:6;464:20;439:46;;511:335;;;618:4;606:17;;602:27;-1:-1;592:2;;643:1;640;633:12;592:2;-1:-1;663:20;;703:18;692:30;;689:2;;;735:1;732;725:12;689:2;769:4;761:6;757:17;745:29;;819:3;812;804:6;800:16;790:8;786:31;783:40;780:2;;;836:1;833;826:12;780:2;585:261;;;;;;855:440;;949:4;937:17;;933:27;-1:-1;923:2;;974:1;971;964:12;923:2;1011:6;998:20;1033:64;1048:48;1089:6;1048:48;;;1033:64;;;1024:73;;1117:6;1110:5;1103:21;1153:4;1145:6;1141:17;1186:4;1179:5;1175:16;1221:3;1212:6;1207:3;1203:16;1200:25;1197:2;;;1238:1;1235;1228:12;1197:2;1248:41;1282:6;1277:3;1272;1248:41;;;916:379;;;;;;;;1428:366;;;1549:2;1537:9;1528:7;1524:23;1520:32;1517:2;;;1565:1;1562;1555:12;1517:2;1600:1;1617:53;1662:7;1642:9;1617:53;;;1607:63;;1579:97;1707:2;1725:53;1770:7;1761:6;1750:9;1746:22;1725:53;;;1715:63;;1686:98;1511:283;;;;;;1801:360;;;1919:2;1907:9;1898:7;1894:23;1890:32;1887:2;;;1935:1;1932;1925:12;1887:2;1970:1;1987:53;2032:7;2012:9;1987:53;;;1977:63;;1949:97;2077:2;2095:50;2137:7;2128:6;2117:9;2113:22;2095:50;;2168:257;;2280:2;2268:9;2259:7;2255:23;2251:32;2248:2;;;2296:1;2293;2286:12;2248:2;2331:1;2348:61;2401:7;2381:9;2348:61;;2432:241;;2536:2;2524:9;2515:7;2511:23;2507:32;2504:2;;;2552:1;2549;2542:12;2504:2;2587:1;2604:53;2649:7;2629:9;2604:53;;2680:366;;;2801:2;2789:9;2780:7;2776:23;2772:32;2769:2;;;2817:1;2814;2807:12;2769:2;2852:1;2869:53;2914:7;2894:9;2869:53;;3053:615;;;;;3210:2;3198:9;3189:7;3185:23;3181:32;3178:2;;;3226:1;3223;3216:12;3178:2;3261:1;3278:53;3323:7;3303:9;3278:53;;;3268:63;;3240:97;3368:2;3386:53;3431:7;3422:6;3411:9;3407:22;3386:53;;;3376:63;;3347:98;3504:2;3493:9;3489:18;3476:32;3528:18;3520:6;3517:30;3514:2;;;3560:1;3557;3550:12;3514:2;3588:64;3644:7;3635:6;3624:9;3620:22;3588:64;;;3172:496;;;;-1:-1;3570:82;-1:-1;;;;3172:496;3675:595;;;;3822:2;3810:9;3801:7;3797:23;3793:32;3790:2;;;3838:1;3835;3828:12;3790:2;3873:1;3890:53;3935:7;3915:9;3890:53;;;3880:63;;3852:97;3980:2;3998:53;4043:7;4034:6;4023:9;4019:22;3998:53;;;3988:63;;3959:98;4116:2;4105:9;4101:18;4088:32;4140:18;4132:6;4129:30;4126:2;;;4172:1;4169;4162:12;4126:2;4192:62;4246:7;4237:6;4226:9;4222:22;4192:62;;;4182:72;;4067:193;3784:486;;;;;;4277:865;;;;;;;4470:3;4458:9;4449:7;4445:23;4441:33;4438:2;;;4487:1;4484;4477:12;4438:2;4522:1;4539:53;4584:7;4564:9;4539:53;;;4529:63;;4501:97;4629:2;4647:53;4692:7;4683:6;4672:9;4668:22;4647:53;;;4637:63;;4608:98;4765:2;4754:9;4750:18;4737:32;4789:18;4781:6;4778:30;4775:2;;;4821:1;4818;4811:12;4775:2;4849:64;4905:7;4896:6;4885:9;4881:22;4849:64;;;4831:82;;;;4716:203;4978:2;4967:9;4963:18;4950:32;5002:18;4994:6;4991:30;4988:2;;;5034:1;5031;5024:12;4988:2;5062:64;5118:7;5109:6;5098:9;5094:22;5062:64;;;5044:82;;;;4929:203;4432:710;;;;;;;;;5149:110;5222:31;5247:5;5222:31;;;5217:3;5210:44;5204:55;;;5266:101;5333:28;5355:5;5333:28;;5374:110;5447:31;5472:5;5447:31;;5491:297;;5591:38;5623:5;5591:38;;;5646:6;5641:3;5634:19;5658:63;5714:6;5707:4;5702:3;5698:14;5691:4;5684:5;5680:16;5658:63;;;5753:29;5775:6;5753:29;;;5733:50;;;5746:4;5733:50;;5571:217;-1:-1;;;5571:217;6094:104;6163:29;6186:5;6163:29;;6205:193;6313:2;6298:18;;6327:61;6302:9;6361:6;6327:61;;6405:181;6507:2;6492:18;;6521:55;6496:9;6549:6;6521:55;;6593:479;6775:2;6760:18;;6789:61;6764:9;6823:6;6789:61;;;6861:62;6919:2;6908:9;6904:18;6895:6;6861:62;;;6971:9;6965:4;6961:20;6956:2;6945:9;6941:18;6934:48;6996:66;7057:4;7048:6;6996:66;;;6988:74;6746:326;-1:-1;;;;;6746:326;7079:378;7233:2;7218:18;;7247:61;7222:9;7281:6;7247:61;;;7356:9;7350:4;7346:20;7341:2;7330:9;7326:18;7319:48;7381:66;7442:4;7433:6;7381:66;;7464:489;7652:3;7637:19;;7667:61;7641:9;7701:6;7667:61;;;7739:58;7793:2;7782:9;7778:18;7769:6;7739:58;;;7808:62;7866:2;7855:9;7851:18;7842:6;7808:62;;;7881;7939:2;7928:9;7924:18;7915:6;7881:62;;7960:273;8084:2;8098:47;;;8069:18;;8159:64;8069:18;8209:6;8159:64;;8240:256;8302:2;8296:9;8328:17;;;8403:18;8388:34;;8424:22;;;8385:62;8382:2;;;8460:1;8457;8450:12;8382:2;8476;8469:22;8280:216;;-1:-1;8280:216;8503:258;;8646:18;8638:6;8635:30;8632:2;;;8678:1;8675;8668:12;8632:2;-1:-1;8751:4;8722;8699:17;;;;-1:-1;;8695:33;8741:15;;8569:192;8768:91;8842:12;;8826:33;8961:128;-1:-1;;;;;9030:54;;9013:76;9096:92;9169:13;9162:21;;9145:43;9195:79;9264:5;9247:27;9281:88;9359:4;9348:16;;9331:38;9783:145;9864:6;9859:3;9854;9841:30;-1:-1;9920:1;9902:16;;9895:27;9834:94;9937:268;10002:1;10009:101;10023:6;10020:1;10017:13;10009:101;;;10090:11;;;10084:18;10071:11;;;10064:39;10045:2;10038:10;10009:101;;;10125:6;10122:1;10119:13;10116:2;;;10190:1;10181:6;10176:3;10172:16;10165:27;10116:2;9986:219;;;;;10213:97;10301:2;10281:14;-1:-1;;10277:28;;10261:49" + "object": "0x6080604052600436106100985763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633683ef8e811461009d578063642f2eaf146100bf57806377fcce68146100f55780637b8e35141461011557806382c174d0146101355780639363470214610155578063abba41cc14610175578063bfc8bfce14610195578063eea086ba146101b5575b600080fd5b3480156100a957600080fd5b506100bd6100b83660046112ba565b6101d7565b005b3480156100cb57600080fd5b506100df6100da36600461127d565b6102a3565b6040516100ec919061148d565b60405180910390f35b34801561010157600080fd5b506100bd61011036600461122f565b6102b8565b34801561012157600080fd5b506100df6101303660046111f5565b6102fd565b34801561014157600080fd5b506100df61015036600461129b565b61031d565b34801561016157600080fd5b506100df610170366004611322565b61033a565b34801561018157600080fd5b506100df610190366004611322565b610b12565b3480156101a157600080fd5b506100bd6101b0366004611387565b610b27565b3480156101c157600080fd5b506101ca610e59565b6040516100ec919061147f565b610212848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375061033a945050505050565b60408051808201909152601181527f494e56414c49445f5349474e415455524500000000000000000000000000000060208201529015156102725760405160e560020a62461bcd0281526004016102699190611526565b60405180910390fd5b505050600091825260208281526040808420600160a060020a0390931684529190529020805460ff19166001179055565b60026020526000908152604090205460ff1681565b60006102c2610e68565b600160a060020a03908116600090815260016020908152604080832096909316825294909452909220805460ff191691151591909117905550565b600160209081526000928352604080842090915290825290205460ff1681565b600060208181529281526040808220909352908152205460ff1681565b6000806000806000806000808851116040805190810160405280601e81526020017f4c454e4754485f475245415445525f5448414e5f305f524551554952454400008152509015156103a25760405160e560020a62461bcd0281526004016102699190611526565b506103ac88610e97565b60f860020a900460ff1660088111156103c157fe5b955060008660088111156103d157fe5b141561042557604080518082018252601181527f5349474e41545552455f494c4c4547414c0000000000000000000000000000006020820152905160e560020a62461bcd0281526102699190600401611526565b600186600881111561043357fe5b141561049b57875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156104915760405160e560020a62461bcd0281526004016102699190611526565b5060009650610b05565b60028660088111156104a957fe5b14156105b157875160408051808201909152601281527f4c454e4754485f36365f524551554952454400000000000000000000000000006020820152906041146105095760405160e560020a62461bcd0281526004016102699190611526565b5087600081518110151561051957fe5b016020015160f860020a908190048102049450610537886001610f4c565b9350610544886021610f4c565b925060018a8686866040516000815260200160405260405161056994939291906114f1565b60206040516020810390808403906000865af115801561058d573d6000803e3d6000fd5b5050604051601f190151600160a060020a038b81169082161498509250610b059050565b60038660088111156105bf57fe5b141561076b57875160408051808201909152601281527f4c454e4754485f36365f5245515549524544000000000000000000000000000060208201529060411461061f5760405160e560020a62461bcd0281526004016102699190611526565b5087600081518110151561062f57fe5b016020015160f860020a90819004810204945061064d886001610f4c565b935061065a886021610f4c565b925060016040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152508b6040516020018083805190602001908083835b602083106106c75780518252601f1990920191602091820191016106a8565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b602083106107275780518252601f199092019160209182019101610708565b51815160209384036101000a6000190180199092169116179052604080519290940182900382206000835291019283905261056994509250899189915088906114f1565b600486600881111561077957fe5b14156107eb57875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156107d75760405160e560020a62461bcd0281526004016102699190611526565b50600160a060020a03891633149650610b05565b60058660088111156107f957fe5b141561089f576040517f1626ba7e000000000000000000000000000000000000000000000000000000008152600160a060020a038a1690631626ba7e90610846908d908c906004016114d1565b602060405180830381600087803b15801561086057600080fd5b505af1158015610874573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610898919081019061125f565b9650610b05565b60068660088111156108ad57fe5b1415610940576108bc88610fe0565b600160a060020a03808b1660009081526001602090815260408083209385168352929052205490915060ff1615156108f75760009650610b05565b6040517f93634702000000000000000000000000000000000000000000000000000000008152600160a060020a03821690639363470290610846908d908d908d9060040161149b565b600786600881111561094e57fe5b141561097f5760008a815260208181526040808320600160a060020a038d16845290915290205460ff169650610b05565b600886600881111561098d57fe5b1415610a7857875160408051808201909152601281527f4c454e4754485f36365f524551554952454400000000000000000000000000006020820152906041146109ed5760405160e560020a62461bcd0281526004016102699190611526565b508760008151811015156109fd57fe5b016020015160f860020a908190048102049450610a1b886001610f4c565b9350610a28886021610f4c565b604080518082018252601b8082527f19457468657265756d205369676e6564204d6573736167653a0a4100000000006020808401918252935194975060019492938f9301918291908083836106c7565b6007866008811115610a8657fe5b1415610ab75760008a815260208181526040808320600160a060020a038d16845290915290205460ff169650610b05565b604080518082018252601581527f5349474e41545552455f554e535550504f5254454400000000000000000000006020820152905160e560020a62461bcd0281526102699190600401611526565b5050505050509392505050565b6000610b1f84848461033a565b949350505050565b60035460408051808201909152601281527f5245454e5452414e43595f494c4c4547414c00000000000000000000000000006020820152600091600160a060020a031615610b8b5760405160e560020a62461bcd0281526004016102699190611526565b5030868887876040516020018086600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018481526020018383808284378201915050955050505050506040516020818303038152906040526040518082805190602001908083835b60208310610c3c5780518252601f199092019160209182019101610c1d565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008181526002835285902054838601909552600f83527f494e56414c49445f54585f48415348000000000000000000000000000000000091830191909152955093505060ff16159050610ccd5760405160e560020a62461bcd0281526004016102699190611526565b50600160a060020a0386163314610d9a57610d19818785858080601f0160208091040260200160405190810160405280939291908181526020018383808284375061033a945050505050565b60408051808201909152601481527f494e56414c49445f54585f5349474e41545552450000000000000000000000006020820152901515610d705760405160e560020a62461bcd0281526004016102699190611526565b506003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161790555b60008181526002602052604090819020805460ff191660011790555130908690869080838380828437820191505092505050600060405180830381855af460408051808201909152601081527f4641494c45445f455845435554494f4e000000000000000000000000000000006020820152925015159050610e325760405160e560020a62461bcd0281526004016102699190611526565b50506003805473ffffffffffffffffffffffffffffffffffffffff19169055505050505050565b600354600160a060020a031681565b6003546000908190600160a060020a031615610e8f57600354600160a060020a0316610e91565b335b92915050565b600080825111606060405190810160405280602181526020017f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524581526020017f4400000000000000000000000000000000000000000000000000000000000000815250901515610f1d5760405160e560020a62461bcd0281526004016102699190611526565b50815182906000198101908110610f3057fe5b01602001518251600019019092525060f860020a908190040290565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610fd65760405160e560020a62461bcd0281526004016102699190611526565b5050016020015190565b6000601482511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f51554952454400000000000000000000000000000000000000000000000000008152509015156110685760405160e560020a62461bcd0281526004016102699190611526565b50611077826014845103611084565b8251601319019092525090565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f515549524544000000000000000000000000000000000000000000000000000081525090151561110e5760405160e560020a62461bcd0281526004016102699190611526565b50500160140151600160a060020a031690565b600061112d823561158a565b9392505050565b600061112d8235611596565b600061112d8251611596565b600061112d823561159b565b600080601f8301841361116a57600080fd5b50813567ffffffffffffffff81111561118257600080fd5b60208301915083600182028301111561119a57600080fd5b9250929050565b6000601f820183136111b257600080fd5b81356111c56111c08261155e565b611537565b915080825260208301602083018583830111156111e157600080fd5b6111ec8382846115a4565b50505092915050565b6000806040838503121561120857600080fd5b60006112148585611121565b925050602061122585828601611121565b9150509250929050565b6000806040838503121561124257600080fd5b600061124e8585611121565b925050602061122585828601611134565b60006020828403121561127157600080fd5b6000610b1f8484611140565b60006020828403121561128f57600080fd5b6000610b1f848461114c565b600080604083850312156112ae57600080fd5b6000611214858561114c565b600080600080606085870312156112d057600080fd5b60006112dc878761114c565b94505060206112ed87828801611121565b935050604085013567ffffffffffffffff81111561130a57600080fd5b61131687828801611158565b95989497509550505050565b60008060006060848603121561133757600080fd5b6000611343868661114c565b935050602061135486828701611121565b925050604084013567ffffffffffffffff81111561137157600080fd5b61137d868287016111a1565b9150509250925092565b600080600080600080608087890312156113a057600080fd5b60006113ac898961114c565b96505060206113bd89828a01611121565b955050604087013567ffffffffffffffff8111156113da57600080fd5b6113e689828a01611158565b9450945050606087013567ffffffffffffffff81111561140557600080fd5b61141189828a01611158565b92509250509295509295509295565b6114298161158a565b82525050565b61142981611596565b6114298161159b565b600061144c82611586565b8084526114608160208601602086016115b0565b611469816115e0565b9093016020019392505050565b6114298161159e565b60208101610e918284611420565b60208101610e91828461142f565b606081016114a98286611438565b6114b66020830185611420565b81810360408301526114c88184611441565b95945050505050565b604081016114df8285611438565b8181036020830152610b1f8184611441565b608081016114ff8287611438565b61150c6020830186611476565b6115196040830185611438565b6114c86060830184611438565b6020808252810161112d8184611441565b60405181810167ffffffffffffffff8111828210171561155657600080fd5b604052919050565b600067ffffffffffffffff82111561157557600080fd5b506020601f91909101601f19160190565b5190565b600160a060020a031690565b151590565b90565b60ff1690565b82818337506000910152565b60005b838110156115cb5781810151838201526020016115b3565b838111156115da576000848401525b50505050565b601f01601f1916905600a265627a7a72305820a31be282370e9cd42607a999ad8d6fb8e33282b5ca17efe4e6e21deff1fcd3c26c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x98 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3683EF8E DUP2 EQ PUSH2 0x9D JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0xBF JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0xF5 JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x115 JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0xABBA41CC EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x195 JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x1B5 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBD PUSH2 0xB8 CALLDATASIZE PUSH1 0x4 PUSH2 0x12BA JUMP JUMPDEST PUSH2 0x1D7 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0xDA CALLDATASIZE PUSH1 0x4 PUSH2 0x127D JUMP JUMPDEST PUSH2 0x2A3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEC SWAP2 SWAP1 PUSH2 0x148D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x101 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBD PUSH2 0x110 CALLDATASIZE PUSH1 0x4 PUSH2 0x122F JUMP JUMPDEST PUSH2 0x2B8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x121 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x130 CALLDATASIZE PUSH1 0x4 PUSH2 0x11F5 JUMP JUMPDEST PUSH2 0x2FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x141 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x150 CALLDATASIZE PUSH1 0x4 PUSH2 0x129B JUMP JUMPDEST PUSH2 0x31D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x161 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0x1322 JUMP JUMPDEST PUSH2 0x33A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x190 CALLDATASIZE PUSH1 0x4 PUSH2 0x1322 JUMP JUMPDEST PUSH2 0xB12 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBD PUSH2 0x1B0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1387 JUMP JUMPDEST PUSH2 0xB27 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CA PUSH2 0xE59 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEC SWAP2 SWAP1 PUSH2 0x147F JUMP JUMPDEST PUSH2 0x212 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x33A SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x272 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2C2 PUSH2 0xE68 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP7 SWAP1 SWAP4 AND DUP3 MSTORE SWAP5 SWAP1 SWAP5 MSTORE SWAP1 SWAP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 MSTORE SWAP1 DUP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP9 MLOAD GT PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x3A2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP PUSH2 0x3AC DUP9 PUSH2 0xE97 JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x3C1 JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x3D1 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x425 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x269 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x1526 JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x433 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x49B JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x491 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP PUSH1 0x0 SWAP7 POP PUSH2 0xB05 JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x4A9 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x5B1 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x509 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x519 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x537 DUP9 PUSH1 0x1 PUSH2 0xF4C JUMP JUMPDEST SWAP4 POP PUSH2 0x544 DUP9 PUSH1 0x21 PUSH2 0xF4C JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP11 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x569 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x14F1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x58D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP12 DUP2 AND SWAP1 DUP3 AND EQ SWAP9 POP SWAP3 POP PUSH2 0xB05 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x5BF JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x76B JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x61F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x62F JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x64D DUP9 PUSH1 0x1 PUSH2 0xF4C JUMP JUMPDEST SWAP4 POP PUSH2 0x65A DUP9 PUSH1 0x21 PUSH2 0xF4C JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x6C7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x6A8 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP4 DUP5 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 SUB DUP2 MSTORE SWAP4 DUP3 ADD SWAP1 DUP2 SWAP1 MSTORE DUP4 MLOAD SWAP4 SWAP5 POP SWAP3 DUP4 SWAP3 POP SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x727 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x708 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x569 SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x14F1 JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x779 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x7EB JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x7D7 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND CALLER EQ SWAP7 POP PUSH2 0xB05 JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x7F9 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x89F JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP11 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x846 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x14D1 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x860 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x874 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x898 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x125F JUMP JUMPDEST SWAP7 POP PUSH2 0xB05 JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x8AD JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x940 JUMPI PUSH2 0x8BC DUP9 PUSH2 0xFE0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8F7 JUMPI PUSH1 0x0 SWAP7 POP PUSH2 0xB05 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x846 SWAP1 DUP14 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x149B JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x94E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x97F JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0xB05 JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x98D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xA78 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x9ED JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9FD JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0xA1B DUP9 PUSH1 0x1 PUSH2 0xF4C JUMP JUMPDEST SWAP4 POP PUSH2 0xA28 DUP9 PUSH1 0x21 PUSH2 0xF4C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1B DUP1 DUP3 MSTORE PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A410000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE SWAP4 MLOAD SWAP5 SWAP8 POP PUSH1 0x1 SWAP5 SWAP3 SWAP4 DUP16 SWAP4 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH2 0x6C7 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xA86 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xAB7 JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0xB05 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x269 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x1526 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB1F DUP5 DUP5 DUP5 PUSH2 0x33A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0xB8B JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP ADDRESS DUP7 DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xC3C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xC1D JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 DUP4 MSTORE DUP6 SWAP1 KECCAK256 SLOAD DUP4 DUP7 ADD SWAP1 SWAP6 MSTORE PUSH1 0xF DUP4 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP6 POP SWAP4 POP POP PUSH1 0xFF AND ISZERO SWAP1 POP PUSH2 0xCCD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND CALLER EQ PUSH2 0xD9A JUMPI PUSH2 0xD19 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x33A SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0xD70 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP3 POP ISZERO ISZERO SWAP1 POP PUSH2 0xE32 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP POP PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0xE8F JUMPI PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0xE91 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xF1D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP DUP2 MLOAD DUP3 SWAP1 PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0xF30 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH1 0x0 NOT ADD SWAP1 SWAP3 MSTORE POP PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xFD6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x1068 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP PUSH2 0x1077 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x1084 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x13 NOT ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x110E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x269 SWAP2 SWAP1 PUSH2 0x1526 JUMP JUMPDEST POP POP ADD PUSH1 0x14 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x112D DUP3 CALLDATALOAD PUSH2 0x158A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x112D DUP3 CALLDATALOAD PUSH2 0x1596 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x112D DUP3 MLOAD PUSH2 0x1596 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x112D DUP3 CALLDATALOAD PUSH2 0x159B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x116A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1182 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x119A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x11B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x11C5 PUSH2 0x11C0 DUP3 PUSH2 0x155E JUMP JUMPDEST PUSH2 0x1537 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x11E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11EC DUP4 DUP3 DUP5 PUSH2 0x15A4 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1214 DUP6 DUP6 PUSH2 0x1121 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1225 DUP6 DUP3 DUP7 ADD PUSH2 0x1121 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1242 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x124E DUP6 DUP6 PUSH2 0x1121 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1225 DUP6 DUP3 DUP7 ADD PUSH2 0x1134 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1271 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xB1F DUP5 DUP5 PUSH2 0x1140 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x128F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xB1F DUP5 DUP5 PUSH2 0x114C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x12AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1214 DUP6 DUP6 PUSH2 0x114C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x12D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x12DC DUP8 DUP8 PUSH2 0x114C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x12ED DUP8 DUP3 DUP9 ADD PUSH2 0x1121 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x130A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1316 DUP8 DUP3 DUP9 ADD PUSH2 0x1158 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1337 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1343 DUP7 DUP7 PUSH2 0x114C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x1354 DUP7 DUP3 DUP8 ADD PUSH2 0x1121 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1371 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x137D DUP7 DUP3 DUP8 ADD PUSH2 0x11A1 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x13A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x13AC DUP10 DUP10 PUSH2 0x114C JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x13BD DUP10 DUP3 DUP11 ADD PUSH2 0x1121 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13E6 DUP10 DUP3 DUP11 ADD PUSH2 0x1158 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1405 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1411 DUP10 DUP3 DUP11 ADD PUSH2 0x1158 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x1429 DUP2 PUSH2 0x158A JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1429 DUP2 PUSH2 0x1596 JUMP JUMPDEST PUSH2 0x1429 DUP2 PUSH2 0x159B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x144C DUP3 PUSH2 0x1586 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1460 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x15B0 JUMP JUMPDEST PUSH2 0x1469 DUP2 PUSH2 0x15E0 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1429 DUP2 PUSH2 0x159E JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE91 DUP3 DUP5 PUSH2 0x1420 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE91 DUP3 DUP5 PUSH2 0x142F JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x14A9 DUP3 DUP7 PUSH2 0x1438 JUMP JUMPDEST PUSH2 0x14B6 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1420 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x14C8 DUP2 DUP5 PUSH2 0x1441 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x14DF DUP3 DUP6 PUSH2 0x1438 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0xB1F DUP2 DUP5 PUSH2 0x1441 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x14FF DUP3 DUP8 PUSH2 0x1438 JUMP JUMPDEST PUSH2 0x150C PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1476 JUMP JUMPDEST PUSH2 0x1519 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1438 JUMP JUMPDEST PUSH2 0x14C8 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x1438 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x112D DUP2 DUP5 PUSH2 0x1441 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1556 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1575 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x15CB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x15B3 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x15DA JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 LOG3 SHL 0xe2 DUP3 CALLDATACOPY 0xe SWAP13 0xd4 0x26 SMOD 0xa9 SWAP10 0xad DUP14 PUSH16 0xB8E33282B5CA17EFE4E6E21DEFF1FCD3 0xc2 PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ", + "sourceMap": "759:412:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1723:275:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1723:275:0;;;;;;;;;;;945:45:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;945:45:1;;;;;;;;;;;;;;;;;;;;;;;;;2228:233:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2228:233:0;;;;;;;;;1324:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1324:71:0;;;;;;;;;1204:63;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1204:63:0;;;;;;;;;2826:6493;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2826:6493:0;;;;;;;;;852:317:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;852:317:9;;;;;;;;;1397:1380:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1397:1380:1;;;;;;;;;1042:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1042:36:1;;;;;;;;;;;;1723:275:0;1869:41;1886:4;1892:6;1900:9;;1869:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1869:16:0;;-1:-1:-1;;;;;1869:41:0:i;:::-;1924:17;;;;;;;;;;;;;;;;;;1848:103;;;;;;-1:-1:-1;;;;;1848:103:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1961:9:0;:15;;;;;;;;;;;-1:-1:-1;;;;;1961:23:0;;;;;;;;;;:30;;-1:-1:-1;;1961:30:0;1987:4;1961:30;;;1723:275::o;945:45:1:-;;;;;;;;;;;;;;;:::o;2228:233:0:-;2354:14;2371:26;:24;:26::i;:::-;-1:-1:-1;;;;;2407:25:0;;;;;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;:47;;-1:-1:-1;;2407:47:0;;;;;;;;;;-1:-1:-1;2228:233:0:o;1324:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1204:63::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;2826:6493::-;2981:12;3282:27;3416:7;3433:9;3452;3471:17;7093;3162:1;3143:9;:16;:20;3177:30;;;;;;;;;;;;;;;;;;3122:95;;;;;;;-1:-1:-1;;;;;3122:95:0;;;;;;;;;;;3332:22;3344:9;3332:11;:22::i;:::-;-1:-1:-1;;;3326:29:0;;3312:44;;;;;;;;;;3282:74;-1:-1:-1;3838:21:0;3821:13;:38;;;;;;;;;3817:5154;;;3882:17;;;;;;;;;;;;;;;;3875:25;;-1:-1:-1;;;;;3875:25:0;;;;3882:17;3875:25;;;;3817:5154;4182:21;4165:13;:38;;;;;;;;;4161:4810;;;4244:16;;4283:17;;;;;;;;;;;;;;;;;;4244:21;4219:95;;;;-1:-1:-1;;;;;4219:95:0;;;;;;;;;;-1:-1:-1;4338:5:0;;-1:-1:-1;4357:14:0;;4161:4810;4444:20;4427:13;:37;;;;;;;;;4423:4548;;;4505:16;;4545:18;;;;;;;;;;;;;;;;;;4525:2;4505:22;4480:97;;;;-1:-1:-1;;;;;4480:97:0;;;;;;;;;;;4601:9;4611:1;4601:12;;;;;;;;;;;;;;-1:-1:-1;;;4601:12:0;;;;;;4595:19;;-1:-1:-1;4632:25:0;4644:9;4655:1;4632:11;:25::i;:::-;4628:29;;4675:26;4687:9;4698:2;4675:11;:26::i;:::-;4671:30;;4727:24;4737:4;4743:1;4746;4749;4727:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4727:24:0;;-1:-1:-1;;4727:24:0;;-1:-1:-1;;;;;4775:19:0;;;;;;;;-1:-1:-1;4727:24:0;-1:-1:-1;4808:14:0;;-1:-1:-1;4808:14:0;4423:4548;4899:21;4882:13;:38;;;;;;;;;4878:4093;;;4961:16;;5001:18;;;;;;;;;;;;;;;;;;4981:2;4961:22;4936:97;;;;-1:-1:-1;;;;;4936:97:0;;;;;;;;;;;5057:9;5067:1;5057:12;;;;;;;;;;;;;;-1:-1:-1;;;5057:12:0;;;;;;5051:19;;-1:-1:-1;5088:25:0;5100:9;5111:1;5088:11;:25::i;:::-;5084:29;;5131:26;5143:9;5154:2;5131:11;:26::i;:::-;5127:30;;5183:153;5237:20;;;;;;;;;;;;;;;;;;5259:4;5220:44;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5220:44:0;;;;;-1:-1:-1;5220:44:0;;;26:21:-1;;;6:49;;5220:44:0;;;;;;;5210:55;;5220:44;;-1:-1:-1;5220:44:0;;;-1:-1:-1;5210:55:0;;;;;5220:44;5210:55;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5210:55:0;;;;;;;;;;;;-1:-1:-1;5183:153:0;;;;;;;;;;-1:-1:-1;5210:55:0;-1:-1:-1;5283:1:0;;5302;;-1:-1:-1;5321:1:0;;5183:153;;4878:4093;5997:20;5980:13;:37;;;;;;;;;5976:2995;;;6058:16;;6097:17;;;;;;;;;;;;;;;;;;6058:21;6033:95;;;;-1:-1:-1;;;;;6033:95:0;;;;;;;;;;-1:-1:-1;;;;;;6152:20:0;;6162:10;6152:20;;-1:-1:-1;6186:14:0;;5976:2995;6370:20;6353:13;:37;;;;;;;;;6349:2622;;;6416:49;;;;;-1:-1:-1;;;;;6416:32:0;;;;;:49;;6449:4;;6455:9;;6416:49;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6416:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6416:49:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6416:49:0;;;;;;;;;6406:59;-1:-1:-1;6479:14:0;;6349:2622;6992:23;6975:13;:40;;;;;;;;;6971:2000;;;7113:25;7128:9;7113:14;:25::i;:::-;-1:-1:-1;;;;;7210:25:0;;;;;;;:17;:25;;;;;;;;:36;;;;;;;;;;7093:45;;-1:-1:-1;7210:36:0;;7209:37;7205:88;;;7273:5;7266:12;;;;7205:88;7316:125;;;;;-1:-1:-1;;;;;7316:38:0;;;;;:125;;7372:4;;7394:6;;7418:9;;7316:125;;;;6971:2000;7577:23;7560:13;:40;;;;;;;;;7556:1415;;;7626:9;:15;;;;;;;;;;;-1:-1:-1;;;;;7626:23:0;;;;;;;;;;;;;-1:-1:-1;7663:14:0;;7556:1415;8243:20;8226:13;:37;;;;;;;;;8222:749;;;8304:16;;8344:18;;;;;;;;;;;;;;;;;;8324:2;8304:22;8279:97;;;;-1:-1:-1;;;;;8279:97:0;;;;;;;;;;;8400:9;8410:1;8400:12;;;;;;;;;;;;;;-1:-1:-1;;;8400:12:0;;;;;;8394:19;;-1:-1:-1;8431:25:0;8443:9;8454:1;8431:11;:25::i;:::-;8427:29;;8474:26;8486:9;8497:2;8474:11;:26::i;:::-;8580:23;;;;;;;;;;;;;;;;;;;;8563:47;;8470:30;;-1:-1:-1;8526:156:0;;8580:23;;8605:4;;8563:47;;;;8580:23;;8563:47;8580:23;36:153:-1;;8222:749:0;8860:23;8843:13;:40;;;;;;;;;8839:132;;;8909:9;:15;;;;;;;;;;;-1:-1:-1;;;;;8909:23:0;;;;;;;;;;;;;-1:-1:-1;8946:14:0;;8839:132;9290:21;;;;;;;;;;;;;;;;9283:29;;-1:-1:-1;;;;;9283:29:0;;;;9290:21;9283:29;;;;2826:6493;;;;;;;;;;;;:::o;852:317:9:-;1013:12;1051:87;1081:4;1099:6;1119:9;1051:16;:87::i;:::-;1041:97;852:317;-1:-1:-1;;;;852:317:9:o;1397:1380:1:-;1604:21;;1653:18;;;;;;;;;;;;;;;;;1730:23;;-1:-1:-1;;;;;1604:21:1;:35;1583:98;;;;-1:-1:-1;;;;;1583:98:1;;;;;;;;;;;1804:4;1823:6;1843:4;1861;;1766:109;;;;;;-1:-1:-1;;;;;1766:109:1;-1:-1:-1;;;;;1766:109:1;;;;;;;;-1:-1:-1;;;;;1766:109:1;-1:-1:-1;;;;;1766:109:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1766:109:1;;;1756:120;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1756:120:1;;;;;;;;;;;;-1:-1:-1;1963:29:1;;;:12;:29;;;;;;2006:15;;;;;;;;;;;;;;;;;1756:120;-1:-1:-1;1756:120:1;-1:-1:-1;;1963:29:1;;1962:30;;-1:-1:-1;1941:90:1;;;;-1:-1:-1;;;;;1941:90:1;;;;;;;;;;-1:-1:-1;;;;;;2117:20:1;;2127:10;2117:20;2113:309;;2212:52;2229:15;2246:6;2254:9;;2212:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2212:16:1;;-1:-1:-1;;;;;2212:52:1:i;:::-;2282:20;;;;;;;;;;;;;;;;;;2187:129;;;;;;-1:-1:-1;;;;;2187:129:1;;;;;;;;;;-1:-1:-1;2381:21:1;:30;;-1:-1:-1;;2381:30:1;-1:-1:-1;;;;;2381:30:1;;;;;2113:309;2463:29;;;;:12;:29;;;;;;;:36;;-1:-1:-1;;2463:36:1;2495:4;2463:36;;;2530:32;2538:4;;2557;;;;2530:32;2557:4;;;;2530:32;;;;;;;;;;;;;;;;;;;;;2576:16;;;;;;;;;;;;;;;;;;-1:-1:-1;2509:93:1;;;-1:-1:-1;2509:93:1;;;;-1:-1:-1;;;;;2509:93:1;;;;;;;;;;-1:-1:-1;;2736:21:1;:34;;-1:-1:-1;;2736:34:1;;;-1:-1:-1;;;;;;1397:1380:1:o;1042:36::-;;;-1:-1:-1;;;;;1042:36:1;;:::o;3221:241::-;3352:21;;3304:7;;;;-1:-1:-1;;;;;3352:21:1;:35;:72;;3403:21;;-1:-1:-1;;;;;3403:21:1;3352:72;;;3390:10;3352:72;3327:97;3221:241;-1:-1:-1;;3221:241:1:o;1520:446:10:-;1604:13;1665:1;1654;:8;:12;1680:33;;;;;;;;;;;;;;;;;;;;;;;1633:90;;;;;;;-1:-1:-1;;;;;1633:90:10;;;;;;;;;;-1:-1:-1;1773:8:10;;1771:1;;-1:-1:-1;;1773:12:10;;;1771:15;;;;;;;;;;1885:8;;-1:-1:-1;;1881:16:10;1910:17;;;-1:-1:-1;;;;1771:15:10;;;;;;1520:446::o;5639:488::-;5760:14;5823:5;5831:2;5823:10;5811:1;:8;:22;;5847:38;;;;;;;;;;;;;;;;;;;;;;;5790:105;;;;;;;-1:-1:-1;;;;;5790:105:10;;;;;;;;;;-1:-1:-1;;6074:13:10;5976:2;6074:13;6068:20;;5639:488::o;2161:480::-;2248:14;2311:2;2299:1;:8;:14;;2327:38;;;;;;;;;;;;;;;;;;;;;;;2278:97;;;;;;;-1:-1:-1;;;;;2278:97:10;;;;;;;;;;;2427:29;2439:1;2453:2;2442:1;:8;:13;2427:11;:29::i;:::-;2559:8;;-1:-1:-1;;2555:17:10;2585;;;-1:-1:-1;2418:38:10;2161:480::o;2855:884::-;2976:14;3039:5;3047:2;3039:10;3027:1;:8;:22;;3091:38;;;;;;;;;;;;;;;;;;;;;;;3006:133;;;;;;;-1:-1:-1;;;;;3006:133:10;;;;;;;;;;-1:-1:-1;;3641:13:10;3386:2;3641:13;3635:20;-1:-1:-1;;;;;3631:69:10;;2855:884::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;130:112;;194:43;229:6;216:20;194:43;;249:116;;324:36;352:6;346:13;324:36;;372:118;;439:46;477:6;464:20;439:46;;511:335;;;618:4;606:17;;602:27;-1:-1;592:2;;643:1;640;633:12;592:2;-1:-1;663:20;;703:18;692:30;;689:2;;;735:1;732;725:12;689:2;769:4;761:6;757:17;745:29;;819:3;812;804:6;800:16;790:8;786:31;783:40;780:2;;;836:1;833;826:12;780:2;585:261;;;;;;855:440;;949:4;937:17;;933:27;-1:-1;923:2;;974:1;971;964:12;923:2;1011:6;998:20;1033:64;1048:48;1089:6;1048:48;;;1033:64;;;1024:73;;1117:6;1110:5;1103:21;1153:4;1145:6;1141:17;1186:4;1179:5;1175:16;1221:3;1212:6;1207:3;1203:16;1200:25;1197:2;;;1238:1;1235;1228:12;1197:2;1248:41;1282:6;1277:3;1272;1248:41;;;916:379;;;;;;;;1428:366;;;1549:2;1537:9;1528:7;1524:23;1520:32;1517:2;;;1565:1;1562;1555:12;1517:2;1600:1;1617:53;1662:7;1642:9;1617:53;;;1607:63;;1579:97;1707:2;1725:53;1770:7;1761:6;1750:9;1746:22;1725:53;;;1715:63;;1686:98;1511:283;;;;;;1801:360;;;1919:2;1907:9;1898:7;1894:23;1890:32;1887:2;;;1935:1;1932;1925:12;1887:2;1970:1;1987:53;2032:7;2012:9;1987:53;;;1977:63;;1949:97;2077:2;2095:50;2137:7;2128:6;2117:9;2113:22;2095:50;;2168:257;;2280:2;2268:9;2259:7;2255:23;2251:32;2248:2;;;2296:1;2293;2286:12;2248:2;2331:1;2348:61;2401:7;2381:9;2348:61;;2432:241;;2536:2;2524:9;2515:7;2511:23;2507:32;2504:2;;;2552:1;2549;2542:12;2504:2;2587:1;2604:53;2649:7;2629:9;2604:53;;2680:366;;;2801:2;2789:9;2780:7;2776:23;2772:32;2769:2;;;2817:1;2814;2807:12;2769:2;2852:1;2869:53;2914:7;2894:9;2869:53;;3053:615;;;;;3210:2;3198:9;3189:7;3185:23;3181:32;3178:2;;;3226:1;3223;3216:12;3178:2;3261:1;3278:53;3323:7;3303:9;3278:53;;;3268:63;;3240:97;3368:2;3386:53;3431:7;3422:6;3411:9;3407:22;3386:53;;;3376:63;;3347:98;3504:2;3493:9;3489:18;3476:32;3528:18;3520:6;3517:30;3514:2;;;3560:1;3557;3550:12;3514:2;3588:64;3644:7;3635:6;3624:9;3620:22;3588:64;;;3172:496;;;;-1:-1;3570:82;-1:-1;;;;3172:496;3675:595;;;;3822:2;3810:9;3801:7;3797:23;3793:32;3790:2;;;3838:1;3835;3828:12;3790:2;3873:1;3890:53;3935:7;3915:9;3890:53;;;3880:63;;3852:97;3980:2;3998:53;4043:7;4034:6;4023:9;4019:22;3998:53;;;3988:63;;3959:98;4116:2;4105:9;4101:18;4088:32;4140:18;4132:6;4129:30;4126:2;;;4172:1;4169;4162:12;4126:2;4192:62;4246:7;4237:6;4226:9;4222:22;4192:62;;;4182:72;;4067:193;3784:486;;;;;;4277:865;;;;;;;4470:3;4458:9;4449:7;4445:23;4441:33;4438:2;;;4487:1;4484;4477:12;4438:2;4522:1;4539:53;4584:7;4564:9;4539:53;;;4529:63;;4501:97;4629:2;4647:53;4692:7;4683:6;4672:9;4668:22;4647:53;;;4637:63;;4608:98;4765:2;4754:9;4750:18;4737:32;4789:18;4781:6;4778:30;4775:2;;;4821:1;4818;4811:12;4775:2;4849:64;4905:7;4896:6;4885:9;4881:22;4849:64;;;4831:82;;;;4716:203;4978:2;4967:9;4963:18;4950:32;5002:18;4994:6;4991:30;4988:2;;;5034:1;5031;5024:12;4988:2;5062:64;5118:7;5109:6;5098:9;5094:22;5062:64;;;5044:82;;;;4929:203;4432:710;;;;;;;;;5149:110;5222:31;5247:5;5222:31;;;5217:3;5210:44;5204:55;;;5266:101;5333:28;5355:5;5333:28;;5374:110;5447:31;5472:5;5447:31;;5491:297;;5591:38;5623:5;5591:38;;;5646:6;5641:3;5634:19;5658:63;5714:6;5707:4;5702:3;5698:14;5691:4;5684:5;5680:16;5658:63;;;5753:29;5775:6;5753:29;;;5733:50;;;5746:4;5733:50;;5571:217;-1:-1;;;5571:217;6094:104;6163:29;6186:5;6163:29;;6205:193;6313:2;6298:18;;6327:61;6302:9;6361:6;6327:61;;6405:181;6507:2;6492:18;;6521:55;6496:9;6549:6;6521:55;;6593:479;6775:2;6760:18;;6789:61;6764:9;6823:6;6789:61;;;6861:62;6919:2;6908:9;6904:18;6895:6;6861:62;;;6971:9;6965:4;6961:20;6956:2;6945:9;6941:18;6934:48;6996:66;7057:4;7048:6;6996:66;;;6988:74;6746:326;-1:-1;;;;;6746:326;7079:378;7233:2;7218:18;;7247:61;7222:9;7281:6;7247:61;;;7356:9;7350:4;7346:20;7341:2;7330:9;7326:18;7319:48;7381:66;7442:4;7433:6;7381:66;;7464:489;7652:3;7637:19;;7667:61;7641:9;7701:6;7667:61;;;7739:58;7793:2;7782:9;7778:18;7769:6;7739:58;;;7808:62;7866:2;7855:9;7851:18;7842:6;7808:62;;;7881;7939:2;7928:9;7924:18;7915:6;7881:62;;7960:273;8084:2;8098:47;;;8069:18;;8159:64;8069:18;8209:6;8159:64;;8240:256;8302:2;8296:9;8328:17;;;8403:18;8388:34;;8424:22;;;8385:62;8382:2;;;8460:1;8457;8450:12;8382:2;8476;8469:22;8280:216;;-1:-1;8280:216;8503:258;;8646:18;8638:6;8635:30;8632:2;;;8678:1;8675;8668:12;8632:2;-1:-1;8751:4;8722;8699:17;;;;-1:-1;;8695:33;8741:15;;8569:192;8768:91;8842:12;;8826:33;8961:128;-1:-1;;;;;9030:54;;9013:76;9096:92;9169:13;9162:21;;9145:43;9195:79;9264:5;9247:27;9281:88;9359:4;9348:16;;9331:38;9783:145;9864:6;9859:3;9854;9841:30;-1:-1;9920:1;9902:16;;9895:27;9834:94;9937:268;10002:1;10009:101;10023:6;10020:1;10017:13;10009:101;;;10090:11;;;10084:18;10071:11;;;10064:39;10045:2;10038:10;10009:101;;;10125:6;10122:1;10119:13;10116:2;;;10190:1;10181:6;10176:3;10172:16;10165:27;10116:2;9986:219;;;;;10213:97;10301:2;10281:14;-1:-1;;10277:28;;10261:49" } } }, @@ -230,20 +257,20 @@ } }, "sourceCodes": { - "current/protocol/Exchange/MixinSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./interfaces/IWallet.sol\";\nimport \"./interfaces/IValidator.sol\";\n\ncontract MixinSignatureValidator is\n LibBytes,\n LibExchangeErrors,\n MSignatureValidator,\n MTransactions\n{\n // Personal message headers\n string constant ETH_PERSONAL_MESSAGE = \"\\x19Ethereum Signed Message:\\n32\";\n string constant TREZOR_PERSONAL_MESSAGE = \"\\x19Ethereum Signed Message:\\n\\x41\";\n\n // Mapping of hash => signer => signed\n mapping (bytes32 => mapping (address => bool)) public preSigned;\n\n // Mapping of signer => validator => approved\n mapping (address => mapping (address => bool)) public allowedValidators;\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external\n {\n require(\n isValidSignature(hash, signer, signature),\n INVALID_SIGNATURE\n );\n preSigned[hash][signer] = true;\n }\n\n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validator Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validator,\n bool approval\n )\n external\n {\n address signer = getCurrentContextAddress();\n allowedValidators[signer][validator] = approval;\n }\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32 byte hash.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return True if the address recovered from the provided signature matches the input signer address.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n internal\n view\n returns (bool isValid)\n {\n // TODO: Domain separation: make hash depend on role. (Taker sig should not be valid as maker sig, etc.)\n require(\n signature.length > 0,\n LENGTH_GREATER_THAN_0_REQUIRED\n );\n\n // Pop last byte off of signature byte array.\n SignatureType signatureType = SignatureType(uint8(popLastByte(signature)));\n\n // Variables are not scoped in Solidity.\n uint8 v;\n bytes32 r;\n bytes32 s;\n address recovered;\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n revert(SIGNATURE_ILLEGAL);\n\n // Always invalid signature.\n // Like Illegal, this is always implicitly available and therefore\n // offered explicitly. It can be implicitly created by providing\n // a correctly formatted but incorrect signature.\n } else if (signatureType == SignatureType.Invalid) {\n require(\n signature.length == 0,\n LENGTH_0_REQUIRED\n );\n isValid = false;\n return isValid;\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(hash, v, r, s);\n isValid = signer == recovered;\n return isValid;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(ETH_PERSONAL_MESSAGE, hash)),\n v,\n r,\n s\n );\n isValid = signer == recovered;\n return isValid;\n\n // Implicitly signed by caller.\n // The signer has initiated the call. In the case of non-contract\n // accounts it means the transaction itself was signed.\n // Example: let's say for a particular operation three signatures\n // A, B and C are required. To submit the transaction, A and B can\n // give a signature to C, who can then submit the transaction using\n // `Caller` for his own signature. Or A and C can sign and B can\n // submit using `Caller`. Having `Caller` allows this flexibility.\n } else if (signatureType == SignatureType.Caller) {\n require(\n signature.length == 0,\n LENGTH_0_REQUIRED\n );\n isValid = signer == msg.sender;\n return isValid;\n\n // Signature verified by wallet contract.\n // If used with an order, the maker of the order is the wallet contract.\n } else if (signatureType == SignatureType.Wallet) {\n isValid = IWallet(signer).isValidSignature(hash, signature);\n return isValid;\n\n // Signature verified by validator contract.\n // If used with an order, the maker of the order can still be an EOA.\n // A signature using this type should be encoded as:\n // | Offset | Length | Contents |\n // | 0x00 | x | Signature to validate |\n // | 0x00 + x | 20 | Address of validator contract |\n // | 0x14 + x | 1 | Signature type is always \"\\x06\" |\n } else if (signatureType == SignatureType.Validator) {\n // Pop last 20 bytes off of signature byte array.\n address validator = popLast20Bytes(signature);\n // Ensure signer has approved validator.\n if (!allowedValidators[signer][validator]) {\n return false;\n }\n isValid = IValidator(validator).isValidSignature(\n hash,\n signer,\n signature\n );\n return isValid;\n\n // Signer signed hash previously using the preSign function.\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signer];\n return isValid;\n\n // Signature from Trezor hardware wallet.\n // It differs from web3.eth_sign in the encoding of message length\n // (Bitcoin varint encoding vs ascii-decimal, the latter is not\n // self-terminating which leads to ambiguities).\n // See also:\n // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36\n } else if (signatureType == SignatureType.Trezor) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(TREZOR_PERSONAL_MESSAGE, hash)),\n v,\n r,\n s\n );\n isValid = signer == recovered;\n return isValid;\n\n // Signer signed hash previously using the preSign function\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signer];\n return isValid;\n }\n\n // Anything else is illegal (We do not return false because\n // the signature may actually be valid, just not in a format\n // that we currently support. In this case returning false\n // may lead the caller to incorrectly believe that the\n // signature was invalid.)\n revert(SIGNATURE_UNSUPPORTED);\n }\n}\n", + "current/protocol/Exchange/MixinSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./interfaces/IWallet.sol\";\nimport \"./interfaces/IValidator.sol\";\n\ncontract MixinSignatureValidator is\n LibBytes,\n LibExchangeErrors,\n MSignatureValidator,\n MTransactions\n{\n // Personal message headers\n string constant ETH_PERSONAL_MESSAGE = \"\\x19Ethereum Signed Message:\\n32\";\n string constant TREZOR_PERSONAL_MESSAGE = \"\\x19Ethereum Signed Message:\\n\\x41\";\n\n // Mapping of hash => signer => signed\n mapping (bytes32 => mapping (address => bool)) public preSigned;\n\n // Mapping of signer => validator => approved\n mapping (address => mapping (address => bool)) public allowedValidators;\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external\n {\n require(\n isValidSignature(hash, signer, signature),\n INVALID_SIGNATURE\n );\n preSigned[hash][signer] = true;\n }\n\n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validator Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validator,\n bool approval\n )\n external\n {\n address signer = getCurrentContextAddress();\n allowedValidators[signer][validator] = approval;\n }\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32 byte hash.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return True if the address recovered from the provided signature matches the input signer address.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n // TODO: Domain separation: make hash depend on role. (Taker sig should not be valid as maker sig, etc.)\n require(\n signature.length > 0,\n LENGTH_GREATER_THAN_0_REQUIRED\n );\n\n // Pop last byte off of signature byte array.\n SignatureType signatureType = SignatureType(uint8(popLastByte(signature)));\n\n // Variables are not scoped in Solidity.\n uint8 v;\n bytes32 r;\n bytes32 s;\n address recovered;\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n revert(SIGNATURE_ILLEGAL);\n\n // Always invalid signature.\n // Like Illegal, this is always implicitly available and therefore\n // offered explicitly. It can be implicitly created by providing\n // a correctly formatted but incorrect signature.\n } else if (signatureType == SignatureType.Invalid) {\n require(\n signature.length == 0,\n LENGTH_0_REQUIRED\n );\n isValid = false;\n return isValid;\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(hash, v, r, s);\n isValid = signer == recovered;\n return isValid;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(ETH_PERSONAL_MESSAGE, hash)),\n v,\n r,\n s\n );\n isValid = signer == recovered;\n return isValid;\n\n // Implicitly signed by caller.\n // The signer has initiated the call. In the case of non-contract\n // accounts it means the transaction itself was signed.\n // Example: let's say for a particular operation three signatures\n // A, B and C are required. To submit the transaction, A and B can\n // give a signature to C, who can then submit the transaction using\n // `Caller` for his own signature. Or A and C can sign and B can\n // submit using `Caller`. Having `Caller` allows this flexibility.\n } else if (signatureType == SignatureType.Caller) {\n require(\n signature.length == 0,\n LENGTH_0_REQUIRED\n );\n isValid = signer == msg.sender;\n return isValid;\n\n // Signature verified by wallet contract.\n // If used with an order, the maker of the order is the wallet contract.\n } else if (signatureType == SignatureType.Wallet) {\n isValid = IWallet(signer).isValidSignature(hash, signature);\n return isValid;\n\n // Signature verified by validator contract.\n // If used with an order, the maker of the order can still be an EOA.\n // A signature using this type should be encoded as:\n // | Offset | Length | Contents |\n // | 0x00 | x | Signature to validate |\n // | 0x00 + x | 20 | Address of validator contract |\n // | 0x14 + x | 1 | Signature type is always \"\\x06\" |\n } else if (signatureType == SignatureType.Validator) {\n // Pop last 20 bytes off of signature byte array.\n address validator = popLast20Bytes(signature);\n // Ensure signer has approved validator.\n if (!allowedValidators[signer][validator]) {\n return false;\n }\n isValid = IValidator(validator).isValidSignature(\n hash,\n signer,\n signature\n );\n return isValid;\n\n // Signer signed hash previously using the preSign function.\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signer];\n return isValid;\n\n // Signature from Trezor hardware wallet.\n // It differs from web3.eth_sign in the encoding of message length\n // (Bitcoin varint encoding vs ascii-decimal, the latter is not\n // self-terminating which leads to ambiguities).\n // See also:\n // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36\n } else if (signatureType == SignatureType.Trezor) {\n require(\n signature.length == 65,\n LENGTH_65_REQUIRED\n );\n v = uint8(signature[0]);\n r = readBytes32(signature, 1);\n s = readBytes32(signature, 33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(TREZOR_PERSONAL_MESSAGE, hash)),\n v,\n r,\n s\n );\n isValid = signer == recovered;\n return isValid;\n\n // Signer signed hash previously using the preSign function\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signer];\n return isValid;\n }\n\n // Anything else is illegal (We do not return false because\n // the signature may actually be valid, just not in a format\n // that we currently support. In this case returning false\n // may lead the caller to incorrectly believe that the\n // signature was invalid.)\n revert(SIGNATURE_UNSUPPORTED);\n }\n}\n", "current/protocol/Exchange/MixinTransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.4.24;\n\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\n\ncontract MixinTransactions is\n LibExchangeErrors,\n MSignatureValidator,\n MTransactions\n{\n\n // Mapping of transaction hash => executed\n // This prevents transactions from being executed more than once.\n mapping (bytes32 => bool) public transactions;\n\n // Address of current transaction signer\n address public currentContextAddress;\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signer Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signer,\n bytes data,\n bytes signature\n )\n external\n {\n // Prevent reentrancy\n require(\n currentContextAddress == address(0),\n REENTRANCY_ILLEGAL\n );\n\n // Calculate transaction hash\n bytes32 transactionHash = keccak256(abi.encodePacked(\n address(this),\n signer,\n salt,\n data\n ));\n\n // Validate transaction has not been executed\n require(\n !transactions[transactionHash],\n INVALID_TX_HASH\n );\n\n // Transaction always valid if signer is sender of transaction\n if (signer != msg.sender) {\n // Validate signature\n require(\n isValidSignature(transactionHash, signer, signature),\n INVALID_TX_SIGNATURE\n );\n\n // Set the current transaction signer\n currentContextAddress = signer;\n }\n\n // Execute transaction\n transactions[transactionHash] = true;\n require(\n address(this).delegatecall(data),\n FAILED_EXECUTION\n );\n\n // Reset current transaction signer\n // TODO: Check if gas is paid when currentContextAddress is already 0.\n currentContextAddress = address(0);\n }\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address)\n {\n address contextAddress = currentContextAddress == address(0) ? msg.sender : currentContextAddress;\n return contextAddress;\n }\n}\n", - "current/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validator Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validator,\n bool approval\n )\n external;\n}\n", + "current/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validator Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validator,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signer Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n", "current/protocol/Exchange/interfaces/ITransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.4.24;\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signer Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signer,\n bytes data,\n bytes signature\n )\n external;\n}\n", "current/protocol/Exchange/interfaces/IValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.23;\n\ncontract IValidator {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n", "current/protocol/Exchange/interfaces/IWallet.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract IWallet {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n", "current/protocol/Exchange/libs/LibExchangeErrors.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract LibExchangeErrors {\n /// Order validation errors ///\n string constant ORDER_UNFILLABLE = \"ORDER_UNFILLABLE\"; // Order cannot be filled.\n string constant INVALID_MAKER = \"INVALID_MAKER\"; // Invalid makerAddress.\n string constant INVALID_TAKER = \"INVALID_TAKER\"; // Invalid takerAddress.\n string constant INVALID_SENDER = \"INVALID_SENDER\"; // Invalid `msg.sender`.\n string constant INVALID_ORDER_SIGNATURE = \"INVALID_ORDER_SIGNATURE\"; // Signature validation failed. \n \n /// fillOrder validation errors ///\n string constant INVALID_TAKER_AMOUNT = \"INVALID_TAKER_AMOUNT\"; // takerAssetFillAmount cannot equal 0.\n string constant ROUNDING_ERROR = \"ROUNDING_ERROR\"; // Rounding error greater than 0.1% of takerAssetFillAmount. \n \n /// Signature validation errors ///\n string constant INVALID_SIGNATURE = \"INVALID_SIGNATURE\"; // Signature validation failed. \n string constant SIGNATURE_ILLEGAL = \"SIGNATURE_ILLEGAL\"; // Signature type is illegal.\n string constant SIGNATURE_UNSUPPORTED = \"SIGNATURE_UNSUPPORTED\"; // Signature type unsupported.\n \n /// cancelOrdersUptTo errors ///\n string constant INVALID_NEW_MAKER_EPOCH = \"INVALID_NEW_MAKER_EPOCH\"; // Specified salt must be greater than or equal to existing makerEpoch.\n\n /// fillOrKillOrder errors ///\n string constant COMPLETE_FILL_FAILED = \"COMPLETE_FILL_FAILED\"; // Desired takerAssetFillAmount could not be completely filled. \n\n /// matchOrders errors ///\n string constant NEGATIVE_SPREAD_REQUIRED = \"NEGATIVE_SPREAD_REQUIRED\"; // Matched orders must have a negative spread.\n\n /// Transaction errors ///\n string constant REENTRANCY_ILLEGAL = \"REENTRANCY_ILLEGAL\"; // Recursive reentrancy is not allowed. \n string constant INVALID_TX_HASH = \"INVALID_TX_HASH\"; // Transaction has already been executed. \n string constant INVALID_TX_SIGNATURE = \"INVALID_TX_SIGNATURE\"; // Signature validation failed. \n string constant FAILED_EXECUTION = \"FAILED_EXECUTION\"; // Transaction execution failed. \n \n /// registerAssetProxy errors ///\n string constant ASSET_PROXY_MISMATCH = \"ASSET_PROXY_MISMATCH\"; // oldAssetProxy proxy does not match currentAssetProxy. \n string constant ASSET_PROXY_ID_MISMATCH = \"ASSET_PROXY_ID_MISMATCH\"; // newAssetProxyId does not match given assetProxyId.\n\n /// Length validation errors ///\n string constant LENGTH_GREATER_THAN_0_REQUIRED = \"LENGTH_GREATER_THAN_0_REQUIRED\"; // Byte array must have a length greater than 0.\n string constant LENGTH_0_REQUIRED = \"LENGTH_1_REQUIRED\"; // Byte array must have a length of 1.\n string constant LENGTH_65_REQUIRED = \"LENGTH_66_REQUIRED\"; // Byte array must have a length of 66.\n}\n", - "current/protocol/Exchange/mixins/MSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../interfaces/ISignatureValidator.sol\";\n\ncontract MSignatureValidator is\n ISignatureValidator\n{\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n Invalid, // 0x01\n EIP712, // 0x02\n EthSign, // 0x03\n Caller, // 0x04\n Wallet, // 0x05\n Validator, // 0x06\n PreSigned, // 0x07\n Trezor // 0x08\n }\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signer Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n internal\n view\n returns (bool isValid);\n}\n", + "current/protocol/Exchange/mixins/MSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../interfaces/ISignatureValidator.sol\";\n\ncontract MSignatureValidator is\n ISignatureValidator\n{\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n Invalid, // 0x01\n EIP712, // 0x02\n EthSign, // 0x03\n Caller, // 0x04\n Wallet, // 0x05\n Validator, // 0x06\n PreSigned, // 0x07\n Trezor // 0x08\n }\n}\n", "current/protocol/Exchange/mixins/MTransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.4.24;\n\nimport \"../interfaces/ITransactions.sol\";\n\ncontract MTransactions is\n ITransactions\n{\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address);\n}\n", "current/test/TestSignatureValidator/TestSignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/MixinSignatureValidator.sol\";\nimport \"../../protocol/Exchange/MixinTransactions.sol\";\n\ncontract TestSignatureValidator is\n MixinSignatureValidator,\n MixinTransactions\n{\n\n function publicIsValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n isValid = isValidSignature(\n hash,\n signer,\n signature\n );\n return isValid;\n }\n}\n", "current/utils/LibBytes/LibBytes.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../LibMem/LibMem.sol\";\n\ncontract LibBytes is\n LibMem\n{\n\n // Revert reasons\n string constant GREATER_THAN_ZERO_LENGTH_REQUIRED = \"GREATER_THAN_ZERO_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\";\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n GREATER_THAN_ZERO_LENGTH_REQUIRED\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(mload(add(b, index)), 0xffffffffffffffffffffffff0000000000000000000000000000000000000000)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads the first 4 bytes from a byte array of arbitrary length.\n /// @param b Byte array to read first 4 bytes from.\n /// @return First 4 bytes of data.\n function readFirst4(bytes memory b)\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= 4,\n GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\n );\n assembly {\n result := mload(add(b, 32))\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytes(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\n );\n\n // Allocate memory and copy value to result\n result = new bytes(nestedBytesLength);\n memCopy(\n getMemAddress(result) + 32, // +32 skips array length\n getMemAddress(b) + index + 32,\n nestedBytesLength\n );\n\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytes(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 /* 32 bytes to store length */ + input.length,\n GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\n );\n\n // Copy <input> into <b>\n memCopy(\n getMemAddress(b) + 32 + index, // +32 to skip length of <b>\n getMemAddress(input), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function areBytesEqual(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n assembly {\n // Get the number of words occupied by <lhs>\n let lenFullWords := div(add(mload(lhs), 0x1F), 0x20)\n\n // Add 1 to the number of words, to account for the length field\n lenFullWords := add(lenFullWords, 0x1)\n\n // Test equality word-by-word.\n // Terminates early if there is a mismatch.\n for {let i := 0} lt(i, lenFullWords) {i := add(i, 1)} {\n let lhsWord := mload(add(lhs, mul(i, 0x20)))\n let rhsWord := mload(add(rhs, mul(i, 0x20)))\n equal := eq(lhsWord, rhsWord)\n if eq(equal, 0) {\n // Break\n i := lenFullWords\n }\n }\n }\n\n return equal;\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\n );\n memCopy(\n getMemAddress(dest) + 32, // +32 to skip length of <dest>\n getMemAddress(source) + 32, // +32 to skip length of <source>\n sourceLen\n );\n }\n}\n", "current/utils/LibMem/LibMem.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract LibMem\n{\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array.\n function getMemAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // Record the total number of full words to copy\n let nWords := div(length, 32)\n\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n for {let i := 0} lt(i, nWords) {i := add(i, 1)} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n\n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // Record the total number of full words to copy\n let nWords := div(length, 32)\n\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n for {let i := 0} lt(i, nWords) {i := add(i, 1)} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n\n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n}\n" }, - "sourceTreeHashHex": "0x780dfa2f159cb76ddfa8d26affabb3946ec7a613efec2fb78189d559625ba826", + "sourceTreeHashHex": "0xb5cf3036bd250044b95dabfe22ba50d2d38189b7e072667333a871bb1a66b36b", "compiler": { "name": "solc", "version": "soljson-v0.4.24+commit.e67f0147.js", diff --git a/packages/migrations/artifacts/2.0.0/Whitelist.json b/packages/migrations/artifacts/2.0.0/Whitelist.json index 13b9a43af..39f77ce2b 100644 --- a/packages/migrations/artifacts/2.0.0/Whitelist.json +++ b/packages/migrations/artifacts/2.0.0/Whitelist.json @@ -186,14 +186,14 @@ "evm": { "bytecode": { "linkReferences": {}, - "object": "0x60806040523480156200001157600080fd5b5060405160208062000e00833981018060405262000033919081019062000185565b6000805433600160a060020a03199182161790915560028054909116600160a060020a03831617905560408051306c01000000000000000000000000026020808301919091527f060000000000000000000000000000000000000000000000000000000000000060348301528251808303601501815260359092019092528051620000c3926003920190620000cb565b5050620001ba565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200010e57805160ff19168380011785556200013e565b828001600101855582156200013e579182015b828111156200013e57825182559160200191906001019062000121565b506200014c92915062000150565b5090565b6200016d91905b808211156200014c576000815560010162000157565b90565b60006200017e8251620001ae565b9392505050565b6000602082840312156200019857600080fd5b6000620001a6848462000170565b949350505050565b600160a060020a031690565b610c3680620001ca6000396000f3006080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663141da876811461007c5780633af32abf1461009e5780638da5cb5b146100d457806393634702146100f6578063c07732a314610116578063f2fde38b14610136575b600080fd5b34801561008857600080fd5b5061009c6100973660046107c5565b610156565b005b3480156100aa57600080fd5b506100be6100b93660046106fd565b6103f4565b6040516100cb9190610a97565b60405180910390f35b3480156100e057600080fd5b506100e9610409565b6040516100cb9190610a83565b34801561010257600080fd5b506100be61011136600461075d565b610418565b34801561012257600080fd5b5061009c610131366004610723565b61042c565b34801561014257600080fd5b5061009c6101513660046106fd565b610484565b6040805160608181018352602582527f53656e646572206d75737420657175616c207472616e73616374696f6e206f7260208301527f6967696e2e000000000000000000000000000000000000000000000000000000928201929092523391903283146101e25760405160e560020a62461bcd0281526004016101d99190610aa5565b60405180910390fd5b508551600160a060020a0316600090815260016020908152604091829020548251808401909352601e83527f4d616b65722061646472657373206e6f742077686974656c69737465642e00009183019190915260ff16151561025a5760405160e560020a62461bcd0281526004016101d99190610aa5565b50600160a060020a038216600090815260016020908152604091829020548251808401909352601e83527f54616b65722061646472657373206e6f742077686974656c69737465642e00009183019190915260ff1615156102d15760405160e560020a62461bcd0281526004016101d99190610aa5565b506040517fb4be83d5000000000000000000000000000000000000000000000000000000009061030990889088908790602401610ac6565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260025491517fbfc8bfce000000000000000000000000000000000000000000000000000000008152909250600160a060020a039091169063bfc8bfce906103ba90879086908690600390600401610af8565b600060405180830381600087803b1580156103d457600080fd5b505af11580156103e8573d6000803e3d6000fd5b50505050505050505050565b60016020526000908152604090205460ff1681565b600054600160a060020a031681565b600160a060020a0383163214949350505050565b600054600160a060020a031633146104595760405160e560020a62461bcd0281526004016101d990610ab6565b600160a060020a03919091166000908152600160205260409020805460ff1916911515919091179055565b600054600160a060020a031633146104b15760405160e560020a62461bcd0281526004016101d990610ab6565b600160a060020a038116156104e9576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60006104f88235610ba2565b9392505050565b60006104f88235610bae565b60006104f88235610bb3565b600080601f8301841361052957600080fd5b50813567ffffffffffffffff81111561054157600080fd5b60208301915083600182028301111561055957600080fd5b9250929050565b6000601f8201831361057157600080fd5b813561058461057f82610b6a565b610b43565b915080825260208301602083018583830111156105a057600080fd5b6105ab838284610bb6565b50505092915050565b600061018082840312156105c757600080fd5b6105d2610180610b43565b905060006105e084846104ec565b82525060206105f1848483016104ec565b6020830152506040610605848285016104ec565b6040830152506060610619848285016104ec565b606083015250608061062d8482850161050b565b60808301525060a06106418482850161050b565b60a08301525060c06106558482850161050b565b60c08301525060e06106698482850161050b565b60e08301525061010061067e8482850161050b565b610100830152506101206106948482850161050b565b6101208301525061014082013567ffffffffffffffff8111156106b657600080fd5b6106c284828501610560565b6101408301525061016082013567ffffffffffffffff8111156106e457600080fd5b6106f084828501610560565b6101608301525092915050565b60006020828403121561070f57600080fd5b600061071b84846104ec565b949350505050565b6000806040838503121561073657600080fd5b600061074285856104ec565b9250506020610753858286016104ff565b9150509250929050565b6000806000806060858703121561077357600080fd5b600061077f878761050b565b9450506020610790878288016104ec565b935050604085013567ffffffffffffffff8111156107ad57600080fd5b6107b987828801610517565b95989497509550505050565b600080600080608085870312156107db57600080fd5b843567ffffffffffffffff8111156107f257600080fd5b6107fe878288016105b4565b945050602061080f8782880161050b565b93505060406108208782880161050b565b925050606085013567ffffffffffffffff81111561083d57600080fd5b61084987828801610560565b91505092959194509250565b61085e81610ba2565b82525050565b61085e81610bae565b600061087882610b9e565b80845261088c816020860160208601610bc2565b61089581610bf2565b9093016020019392505050565b6000815460018116600081146108bf57600181146108dd57610919565b60028204607f16855260ff1982166020860152604085019250610919565b600282048086526020860195506108f385610b92565b60005b82811015610912578154888201526001909101906020016108f6565b8701945050505b505092915050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b805160009061018084019061098c8582610855565b50602083015161099f6020860182610855565b5060408301516109b26040860182610855565b5060608301516109c56060860182610855565b5060808301516109d86080860182610a7a565b5060a08301516109eb60a0860182610a7a565b5060c08301516109fe60c0860182610a7a565b5060e0830151610a1160e0860182610a7a565b50610100830151610a26610100860182610a7a565b50610120830151610a3b610120860182610a7a565b50610140830151848203610140860152610a55828261086d565b915050610160830151848203610160860152610a71828261086d565b95945050505050565b61085e81610bb3565b60208101610a918284610855565b92915050565b60208101610a918284610864565b602080825281016104f8818461086d565b60208082528101610a9181610921565b60608082528101610ad78186610977565b9050610ae66020830185610a7a565b8181036040830152610a71818461086d565b60808101610b068287610a7a565b610b136020830186610855565b8181036040830152610b25818561086d565b90508181036060830152610b3981846108a2565b9695505050505050565b60405181810167ffffffffffffffff81118282101715610b6257600080fd5b604052919050565b600067ffffffffffffffff821115610b8157600080fd5b506020601f91909101601f19160190565b60009081526020902090565b5190565b600160a060020a031690565b151590565b90565b82818337506000910152565b60005b83811015610bdd578181015183820152602001610bc5565b83811115610bec576000848401525b50505050565b601f01601f1916905600a265627a7a723058203f1ff8f944aea9bf889ac44cfb7e5b8e784924b86647ac73d6ca7c0ee87bce0d6c6578706572696d656e74616cf50037", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH3 0xE00 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x33 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x185 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x600000000000000000000000000000000000000000000000000000000000000 PUSH1 0x34 DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB PUSH1 0x15 ADD DUP2 MSTORE PUSH1 0x35 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD PUSH3 0xC3 SWAP3 PUSH1 0x3 SWAP3 ADD SWAP1 PUSH3 0xCB JUMP JUMPDEST POP POP PUSH3 0x1BA JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x10E JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x13E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x13E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x13E JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x121 JUMP JUMPDEST POP PUSH3 0x14C SWAP3 SWAP2 POP PUSH3 0x150 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x16D SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x14C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x157 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x17E DUP3 MLOAD PUSH3 0x1AE JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x198 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x1A6 DUP5 DUP5 PUSH3 0x170 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0xC36 DUP1 PUSH3 0x1CA PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x141DA876 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x3AF32ABF EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD4 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0xF6 JUMPI DUP1 PUSH4 0xC07732A3 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x136 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x7C5 JUMP JUMPDEST PUSH2 0x156 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0xB9 CALLDATASIZE PUSH1 0x4 PUSH2 0x6FD JUMP JUMPDEST PUSH2 0x3F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xA97 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x409 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xA83 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x75D JUMP JUMPDEST PUSH2 0x418 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x723 JUMP JUMPDEST PUSH2 0x42C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x6FD JUMP JUMPDEST PUSH2 0x484 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 DUP2 ADD DUP4 MSTORE PUSH1 0x25 DUP3 MSTORE PUSH32 0x53656E646572206D75737420657175616C207472616E73616374696F6E206F72 PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0x6967696E2E000000000000000000000000000000000000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE CALLER SWAP2 SWAP1 ORIGIN DUP4 EQ PUSH2 0x1E2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP2 SWAP1 PUSH2 0xAA5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP6 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x1E DUP4 MSTORE PUSH32 0x4D616B65722061646472657373206E6F742077686974656C69737465642E0000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x25A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP2 SWAP1 PUSH2 0xAA5 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x1E DUP4 MSTORE PUSH32 0x54616B65722061646472657373206E6F742077686974656C69737465642E0000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP2 SWAP1 PUSH2 0xAA5 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x309 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0xAC6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x2 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x3BA SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x4 ADD PUSH2 0xAF8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND ORIGIN EQ SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x459 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP1 PUSH2 0xAB6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4B1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP1 PUSH2 0xAB6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F8 DUP3 CALLDATALOAD PUSH2 0xBA2 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F8 DUP3 CALLDATALOAD PUSH2 0xBAE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F8 DUP3 CALLDATALOAD PUSH2 0xBB3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x529 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x541 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x559 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x571 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x584 PUSH2 0x57F DUP3 PUSH2 0xB6A JUMP JUMPDEST PUSH2 0xB43 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x5A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5AB DUP4 DUP3 DUP5 PUSH2 0xBB6 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5D2 PUSH2 0x180 PUSH2 0xB43 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x5E0 DUP5 DUP5 PUSH2 0x4EC JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x5F1 DUP5 DUP5 DUP4 ADD PUSH2 0x4EC JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x605 DUP5 DUP3 DUP6 ADD PUSH2 0x4EC JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x619 DUP5 DUP3 DUP6 ADD PUSH2 0x4EC JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x62D DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x641 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x655 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x669 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x67E DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x694 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6C2 DUP5 DUP3 DUP6 ADD PUSH2 0x560 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6F0 DUP5 DUP3 DUP6 ADD PUSH2 0x560 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x70F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x71B DUP5 DUP5 PUSH2 0x4EC JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x742 DUP6 DUP6 PUSH2 0x4EC JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x753 DUP6 DUP3 DUP7 ADD PUSH2 0x4FF JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x77F DUP8 DUP8 PUSH2 0x50B JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x790 DUP8 DUP3 DUP9 ADD PUSH2 0x4EC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x7AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7B9 DUP8 DUP3 DUP9 ADD PUSH2 0x517 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x7F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7FE DUP8 DUP3 DUP9 ADD PUSH2 0x5B4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x80F DUP8 DUP3 DUP9 ADD PUSH2 0x50B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x820 DUP8 DUP3 DUP9 ADD PUSH2 0x50B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x83D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x849 DUP8 DUP3 DUP9 ADD PUSH2 0x560 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x85E DUP2 PUSH2 0xBA2 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x85E DUP2 PUSH2 0xBAE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x878 DUP3 PUSH2 0xB9E JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x88C DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xBC2 JUMP JUMPDEST PUSH2 0x895 DUP2 PUSH2 0xBF2 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x8BF JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x8DD JUMPI PUSH2 0x919 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV PUSH1 0x7F AND DUP6 MSTORE PUSH1 0xFF NOT DUP3 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP3 POP PUSH2 0x919 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP6 POP PUSH2 0x8F3 DUP6 PUSH2 0xB92 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x912 JUMPI DUP2 SLOAD DUP9 DUP3 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x8F6 JUMP JUMPDEST DUP8 ADD SWAP5 POP POP POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x98C DUP6 DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x99F PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x9B2 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x9C5 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x9D8 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x9EB PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x9FE PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0xA11 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0xA26 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0xA3B PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0xA55 DUP3 DUP3 PUSH2 0x86D JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0xA71 DUP3 DUP3 PUSH2 0x86D JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x85E DUP2 PUSH2 0xBB3 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xA91 DUP3 DUP5 PUSH2 0x855 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xA91 DUP3 DUP5 PUSH2 0x864 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F8 DUP2 DUP5 PUSH2 0x86D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA91 DUP2 PUSH2 0x921 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xAD7 DUP2 DUP7 PUSH2 0x977 JUMP JUMPDEST SWAP1 POP PUSH2 0xAE6 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xA7A JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xA71 DUP2 DUP5 PUSH2 0x86D JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xB06 DUP3 DUP8 PUSH2 0xA7A JUMP JUMPDEST PUSH2 0xB13 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x855 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xB25 DUP2 DUP6 PUSH2 0x86D JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0xB39 DUP2 DUP5 PUSH2 0x8A2 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xB62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xB81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBDD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xBC5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xBEC JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0x3f 0x1f 0xf8 0xf9 DIFFICULTY 0xae 0xa9 0xbf DUP9 SWAP11 0xc4 0x4c CREATE2 PUSH31 0x5B8E784924B86647AC73D6CA7C0EE87BCE0D6C6578706572696D656E74616C 0xf5 STOP CALLDATACOPY ", + "object": "0x60806040523480156200001157600080fd5b5060405160208062000e00833981018060405262000033919081019062000185565b6000805433600160a060020a03199182161790915560028054909116600160a060020a03831617905560408051306c01000000000000000000000000026020808301919091527f060000000000000000000000000000000000000000000000000000000000000060348301528251808303601501815260359092019092528051620000c3926003920190620000cb565b5050620001ba565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200010e57805160ff19168380011785556200013e565b828001600101855582156200013e579182015b828111156200013e57825182559160200191906001019062000121565b506200014c92915062000150565b5090565b6200016d91905b808211156200014c576000815560010162000157565b90565b60006200017e8251620001ae565b9392505050565b6000602082840312156200019857600080fd5b6000620001a6848462000170565b949350505050565b600160a060020a031690565b610c3680620001ca6000396000f3006080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663141da876811461007c5780633af32abf1461009e5780638da5cb5b146100d457806393634702146100f6578063c07732a314610116578063f2fde38b14610136575b600080fd5b34801561008857600080fd5b5061009c6100973660046107c5565b610156565b005b3480156100aa57600080fd5b506100be6100b93660046106fd565b6103f4565b6040516100cb9190610a97565b60405180910390f35b3480156100e057600080fd5b506100e9610409565b6040516100cb9190610a83565b34801561010257600080fd5b506100be61011136600461075d565b610418565b34801561012257600080fd5b5061009c610131366004610723565b61042c565b34801561014257600080fd5b5061009c6101513660046106fd565b610484565b6040805160608181018352602582527f53656e646572206d75737420657175616c207472616e73616374696f6e206f7260208301527f6967696e2e000000000000000000000000000000000000000000000000000000928201929092523391903283146101e25760405160e560020a62461bcd0281526004016101d99190610aa5565b60405180910390fd5b508551600160a060020a0316600090815260016020908152604091829020548251808401909352601e83527f4d616b65722061646472657373206e6f742077686974656c69737465642e00009183019190915260ff16151561025a5760405160e560020a62461bcd0281526004016101d99190610aa5565b50600160a060020a038216600090815260016020908152604091829020548251808401909352601e83527f54616b65722061646472657373206e6f742077686974656c69737465642e00009183019190915260ff1615156102d15760405160e560020a62461bcd0281526004016101d99190610aa5565b506040517fb4be83d5000000000000000000000000000000000000000000000000000000009061030990889088908790602401610ac6565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260025491517fbfc8bfce000000000000000000000000000000000000000000000000000000008152909250600160a060020a039091169063bfc8bfce906103ba90879086908690600390600401610af8565b600060405180830381600087803b1580156103d457600080fd5b505af11580156103e8573d6000803e3d6000fd5b50505050505050505050565b60016020526000908152604090205460ff1681565b600054600160a060020a031681565b600160a060020a0383163214949350505050565b600054600160a060020a031633146104595760405160e560020a62461bcd0281526004016101d990610ab6565b600160a060020a03919091166000908152600160205260409020805460ff1916911515919091179055565b600054600160a060020a031633146104b15760405160e560020a62461bcd0281526004016101d990610ab6565b600160a060020a038116156104e9576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60006104f88235610ba2565b9392505050565b60006104f88235610bae565b60006104f88235610bb3565b600080601f8301841361052957600080fd5b50813567ffffffffffffffff81111561054157600080fd5b60208301915083600182028301111561055957600080fd5b9250929050565b6000601f8201831361057157600080fd5b813561058461057f82610b6a565b610b43565b915080825260208301602083018583830111156105a057600080fd5b6105ab838284610bb6565b50505092915050565b600061018082840312156105c757600080fd5b6105d2610180610b43565b905060006105e084846104ec565b82525060206105f1848483016104ec565b6020830152506040610605848285016104ec565b6040830152506060610619848285016104ec565b606083015250608061062d8482850161050b565b60808301525060a06106418482850161050b565b60a08301525060c06106558482850161050b565b60c08301525060e06106698482850161050b565b60e08301525061010061067e8482850161050b565b610100830152506101206106948482850161050b565b6101208301525061014082013567ffffffffffffffff8111156106b657600080fd5b6106c284828501610560565b6101408301525061016082013567ffffffffffffffff8111156106e457600080fd5b6106f084828501610560565b6101608301525092915050565b60006020828403121561070f57600080fd5b600061071b84846104ec565b949350505050565b6000806040838503121561073657600080fd5b600061074285856104ec565b9250506020610753858286016104ff565b9150509250929050565b6000806000806060858703121561077357600080fd5b600061077f878761050b565b9450506020610790878288016104ec565b935050604085013567ffffffffffffffff8111156107ad57600080fd5b6107b987828801610517565b95989497509550505050565b600080600080608085870312156107db57600080fd5b843567ffffffffffffffff8111156107f257600080fd5b6107fe878288016105b4565b945050602061080f8782880161050b565b93505060406108208782880161050b565b925050606085013567ffffffffffffffff81111561083d57600080fd5b61084987828801610560565b91505092959194509250565b61085e81610ba2565b82525050565b61085e81610bae565b600061087882610b9e565b80845261088c816020860160208601610bc2565b61089581610bf2565b9093016020019392505050565b6000815460018116600081146108bf57600181146108dd57610919565b60028204607f16855260ff1982166020860152604085019250610919565b600282048086526020860195506108f385610b92565b60005b82811015610912578154888201526001909101906020016108f6565b8701945050505b505092915050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b805160009061018084019061098c8582610855565b50602083015161099f6020860182610855565b5060408301516109b26040860182610855565b5060608301516109c56060860182610855565b5060808301516109d86080860182610a7a565b5060a08301516109eb60a0860182610a7a565b5060c08301516109fe60c0860182610a7a565b5060e0830151610a1160e0860182610a7a565b50610100830151610a26610100860182610a7a565b50610120830151610a3b610120860182610a7a565b50610140830151848203610140860152610a55828261086d565b915050610160830151848203610160860152610a71828261086d565b95945050505050565b61085e81610bb3565b60208101610a918284610855565b92915050565b60208101610a918284610864565b602080825281016104f8818461086d565b60208082528101610a9181610921565b60608082528101610ad78186610977565b9050610ae66020830185610a7a565b8181036040830152610a71818461086d565b60808101610b068287610a7a565b610b136020830186610855565b8181036040830152610b25818561086d565b90508181036060830152610b3981846108a2565b9695505050505050565b60405181810167ffffffffffffffff81118282101715610b6257600080fd5b604052919050565b600067ffffffffffffffff821115610b8157600080fd5b506020601f91909101601f19160190565b60009081526020902090565b5190565b600160a060020a031690565b151590565b90565b82818337506000910152565b60005b83811015610bdd578181015183820152602001610bc5565b83811115610bec576000848401525b50505050565b601f01601f1916905600a265627a7a72305820cf18155734a00cc9d74a7e2d02cd6dc3b564dfa905c64ee1a5e2c0c4a6c05c756c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH3 0xE00 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x33 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x185 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x600000000000000000000000000000000000000000000000000000000000000 PUSH1 0x34 DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB PUSH1 0x15 ADD DUP2 MSTORE PUSH1 0x35 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD PUSH3 0xC3 SWAP3 PUSH1 0x3 SWAP3 ADD SWAP1 PUSH3 0xCB JUMP JUMPDEST POP POP PUSH3 0x1BA JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x10E JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x13E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x13E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x13E JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x121 JUMP JUMPDEST POP PUSH3 0x14C SWAP3 SWAP2 POP PUSH3 0x150 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x16D SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x14C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x157 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x17E DUP3 MLOAD PUSH3 0x1AE JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x198 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x1A6 DUP5 DUP5 PUSH3 0x170 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0xC36 DUP1 PUSH3 0x1CA PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x141DA876 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x3AF32ABF EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD4 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0xF6 JUMPI DUP1 PUSH4 0xC07732A3 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x136 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x7C5 JUMP JUMPDEST PUSH2 0x156 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0xB9 CALLDATASIZE PUSH1 0x4 PUSH2 0x6FD JUMP JUMPDEST PUSH2 0x3F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xA97 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x409 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xA83 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x75D JUMP JUMPDEST PUSH2 0x418 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x723 JUMP JUMPDEST PUSH2 0x42C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x6FD JUMP JUMPDEST PUSH2 0x484 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 DUP2 ADD DUP4 MSTORE PUSH1 0x25 DUP3 MSTORE PUSH32 0x53656E646572206D75737420657175616C207472616E73616374696F6E206F72 PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0x6967696E2E000000000000000000000000000000000000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE CALLER SWAP2 SWAP1 ORIGIN DUP4 EQ PUSH2 0x1E2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP2 SWAP1 PUSH2 0xAA5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP6 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x1E DUP4 MSTORE PUSH32 0x4D616B65722061646472657373206E6F742077686974656C69737465642E0000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x25A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP2 SWAP1 PUSH2 0xAA5 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x1E DUP4 MSTORE PUSH32 0x54616B65722061646472657373206E6F742077686974656C69737465642E0000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP2 SWAP1 PUSH2 0xAA5 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x309 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0xAC6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x2 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x3BA SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x4 ADD PUSH2 0xAF8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND ORIGIN EQ SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x459 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP1 PUSH2 0xAB6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4B1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP1 PUSH2 0xAB6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F8 DUP3 CALLDATALOAD PUSH2 0xBA2 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F8 DUP3 CALLDATALOAD PUSH2 0xBAE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F8 DUP3 CALLDATALOAD PUSH2 0xBB3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x529 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x541 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x559 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x571 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x584 PUSH2 0x57F DUP3 PUSH2 0xB6A JUMP JUMPDEST PUSH2 0xB43 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x5A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5AB DUP4 DUP3 DUP5 PUSH2 0xBB6 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5D2 PUSH2 0x180 PUSH2 0xB43 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x5E0 DUP5 DUP5 PUSH2 0x4EC JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x5F1 DUP5 DUP5 DUP4 ADD PUSH2 0x4EC JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x605 DUP5 DUP3 DUP6 ADD PUSH2 0x4EC JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x619 DUP5 DUP3 DUP6 ADD PUSH2 0x4EC JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x62D DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x641 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x655 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x669 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x67E DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x694 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6C2 DUP5 DUP3 DUP6 ADD PUSH2 0x560 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6F0 DUP5 DUP3 DUP6 ADD PUSH2 0x560 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x70F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x71B DUP5 DUP5 PUSH2 0x4EC JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x742 DUP6 DUP6 PUSH2 0x4EC JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x753 DUP6 DUP3 DUP7 ADD PUSH2 0x4FF JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x77F DUP8 DUP8 PUSH2 0x50B JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x790 DUP8 DUP3 DUP9 ADD PUSH2 0x4EC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x7AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7B9 DUP8 DUP3 DUP9 ADD PUSH2 0x517 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x7F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7FE DUP8 DUP3 DUP9 ADD PUSH2 0x5B4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x80F DUP8 DUP3 DUP9 ADD PUSH2 0x50B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x820 DUP8 DUP3 DUP9 ADD PUSH2 0x50B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x83D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x849 DUP8 DUP3 DUP9 ADD PUSH2 0x560 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x85E DUP2 PUSH2 0xBA2 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x85E DUP2 PUSH2 0xBAE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x878 DUP3 PUSH2 0xB9E JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x88C DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xBC2 JUMP JUMPDEST PUSH2 0x895 DUP2 PUSH2 0xBF2 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x8BF JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x8DD JUMPI PUSH2 0x919 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV PUSH1 0x7F AND DUP6 MSTORE PUSH1 0xFF NOT DUP3 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP3 POP PUSH2 0x919 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP6 POP PUSH2 0x8F3 DUP6 PUSH2 0xB92 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x912 JUMPI DUP2 SLOAD DUP9 DUP3 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x8F6 JUMP JUMPDEST DUP8 ADD SWAP5 POP POP POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x98C DUP6 DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x99F PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x9B2 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x9C5 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x9D8 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x9EB PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x9FE PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0xA11 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0xA26 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0xA3B PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0xA55 DUP3 DUP3 PUSH2 0x86D JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0xA71 DUP3 DUP3 PUSH2 0x86D JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x85E DUP2 PUSH2 0xBB3 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xA91 DUP3 DUP5 PUSH2 0x855 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xA91 DUP3 DUP5 PUSH2 0x864 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F8 DUP2 DUP5 PUSH2 0x86D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA91 DUP2 PUSH2 0x921 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xAD7 DUP2 DUP7 PUSH2 0x977 JUMP JUMPDEST SWAP1 POP PUSH2 0xAE6 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xA7A JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xA71 DUP2 DUP5 PUSH2 0x86D JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xB06 DUP3 DUP8 PUSH2 0xA7A JUMP JUMPDEST PUSH2 0xB13 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x855 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xB25 DUP2 DUP6 PUSH2 0x86D JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0xB39 DUP2 DUP5 PUSH2 0x8A2 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xB62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xB81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBDD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xBC5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xBEC JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xcf XOR ISZERO JUMPI CALLVALUE LOG0 0xc 0xc9 0xd7 0x4a PUSH31 0x2D02CD6DC3B564DFA905C64EE1A5E2C0C4A6C05C756C6578706572696D656E PUSH21 0x616CF5003700000000000000000000000000000000 ", "sourceMap": "794:3495:9:-;;;1328:188;8:9:-1;5:2;;;30:1;27;20:12;5:2;1328:188:9;;;;;;;;;;;;;;;;;;;;;;363:5:11;:18;;371:10;-1:-1:-1;;;;;;363:18:11;;;;;;;1389:8:9;:31;;;;;-1:-1:-1;;;;;1389:31:9;;;;;1452:57;;;1477:4;1452:57;;;;;;;;;;1484:24;1452:57;;;;;;26:21:-1;;;22:32;;6:49;;1452:57:9;;;;;;;1430:79;;;;:19;;:79;;;:::i;:::-;;1328:188;794:3495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;794:3495:9;;;-1:-1:-1;794:3495:9;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;5:122:-1:-;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:263;;249:2;237:9;228:7;224:23;220:32;217:2;;;265:1;262;255:12;217:2;300:1;317:64;373:7;353:9;317:64;;;307:74;211:186;-1:-1;;;;211:186;404:128;-1:-1;;;;;473:54;;456:76;;794:3495:9;;;;;;" }, "deployedBytecode": { "linkReferences": {}, - "object": "0x6080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663141da876811461007c5780633af32abf1461009e5780638da5cb5b146100d457806393634702146100f6578063c07732a314610116578063f2fde38b14610136575b600080fd5b34801561008857600080fd5b5061009c6100973660046107c5565b610156565b005b3480156100aa57600080fd5b506100be6100b93660046106fd565b6103f4565b6040516100cb9190610a97565b60405180910390f35b3480156100e057600080fd5b506100e9610409565b6040516100cb9190610a83565b34801561010257600080fd5b506100be61011136600461075d565b610418565b34801561012257600080fd5b5061009c610131366004610723565b61042c565b34801561014257600080fd5b5061009c6101513660046106fd565b610484565b6040805160608181018352602582527f53656e646572206d75737420657175616c207472616e73616374696f6e206f7260208301527f6967696e2e000000000000000000000000000000000000000000000000000000928201929092523391903283146101e25760405160e560020a62461bcd0281526004016101d99190610aa5565b60405180910390fd5b508551600160a060020a0316600090815260016020908152604091829020548251808401909352601e83527f4d616b65722061646472657373206e6f742077686974656c69737465642e00009183019190915260ff16151561025a5760405160e560020a62461bcd0281526004016101d99190610aa5565b50600160a060020a038216600090815260016020908152604091829020548251808401909352601e83527f54616b65722061646472657373206e6f742077686974656c69737465642e00009183019190915260ff1615156102d15760405160e560020a62461bcd0281526004016101d99190610aa5565b506040517fb4be83d5000000000000000000000000000000000000000000000000000000009061030990889088908790602401610ac6565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260025491517fbfc8bfce000000000000000000000000000000000000000000000000000000008152909250600160a060020a039091169063bfc8bfce906103ba90879086908690600390600401610af8565b600060405180830381600087803b1580156103d457600080fd5b505af11580156103e8573d6000803e3d6000fd5b50505050505050505050565b60016020526000908152604090205460ff1681565b600054600160a060020a031681565b600160a060020a0383163214949350505050565b600054600160a060020a031633146104595760405160e560020a62461bcd0281526004016101d990610ab6565b600160a060020a03919091166000908152600160205260409020805460ff1916911515919091179055565b600054600160a060020a031633146104b15760405160e560020a62461bcd0281526004016101d990610ab6565b600160a060020a038116156104e9576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60006104f88235610ba2565b9392505050565b60006104f88235610bae565b60006104f88235610bb3565b600080601f8301841361052957600080fd5b50813567ffffffffffffffff81111561054157600080fd5b60208301915083600182028301111561055957600080fd5b9250929050565b6000601f8201831361057157600080fd5b813561058461057f82610b6a565b610b43565b915080825260208301602083018583830111156105a057600080fd5b6105ab838284610bb6565b50505092915050565b600061018082840312156105c757600080fd5b6105d2610180610b43565b905060006105e084846104ec565b82525060206105f1848483016104ec565b6020830152506040610605848285016104ec565b6040830152506060610619848285016104ec565b606083015250608061062d8482850161050b565b60808301525060a06106418482850161050b565b60a08301525060c06106558482850161050b565b60c08301525060e06106698482850161050b565b60e08301525061010061067e8482850161050b565b610100830152506101206106948482850161050b565b6101208301525061014082013567ffffffffffffffff8111156106b657600080fd5b6106c284828501610560565b6101408301525061016082013567ffffffffffffffff8111156106e457600080fd5b6106f084828501610560565b6101608301525092915050565b60006020828403121561070f57600080fd5b600061071b84846104ec565b949350505050565b6000806040838503121561073657600080fd5b600061074285856104ec565b9250506020610753858286016104ff565b9150509250929050565b6000806000806060858703121561077357600080fd5b600061077f878761050b565b9450506020610790878288016104ec565b935050604085013567ffffffffffffffff8111156107ad57600080fd5b6107b987828801610517565b95989497509550505050565b600080600080608085870312156107db57600080fd5b843567ffffffffffffffff8111156107f257600080fd5b6107fe878288016105b4565b945050602061080f8782880161050b565b93505060406108208782880161050b565b925050606085013567ffffffffffffffff81111561083d57600080fd5b61084987828801610560565b91505092959194509250565b61085e81610ba2565b82525050565b61085e81610bae565b600061087882610b9e565b80845261088c816020860160208601610bc2565b61089581610bf2565b9093016020019392505050565b6000815460018116600081146108bf57600181146108dd57610919565b60028204607f16855260ff1982166020860152604085019250610919565b600282048086526020860195506108f385610b92565b60005b82811015610912578154888201526001909101906020016108f6565b8701945050505b505092915050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b805160009061018084019061098c8582610855565b50602083015161099f6020860182610855565b5060408301516109b26040860182610855565b5060608301516109c56060860182610855565b5060808301516109d86080860182610a7a565b5060a08301516109eb60a0860182610a7a565b5060c08301516109fe60c0860182610a7a565b5060e0830151610a1160e0860182610a7a565b50610100830151610a26610100860182610a7a565b50610120830151610a3b610120860182610a7a565b50610140830151848203610140860152610a55828261086d565b915050610160830151848203610160860152610a71828261086d565b95945050505050565b61085e81610bb3565b60208101610a918284610855565b92915050565b60208101610a918284610864565b602080825281016104f8818461086d565b60208082528101610a9181610921565b60608082528101610ad78186610977565b9050610ae66020830185610a7a565b8181036040830152610a71818461086d565b60808101610b068287610a7a565b610b136020830186610855565b8181036040830152610b25818561086d565b90508181036060830152610b3981846108a2565b9695505050505050565b60405181810167ffffffffffffffff81118282101715610b6257600080fd5b604052919050565b600067ffffffffffffffff821115610b8157600080fd5b506020601f91909101601f19160190565b60009081526020902090565b5190565b600160a060020a031690565b151590565b90565b82818337506000910152565b60005b83811015610bdd578181015183820152602001610bc5565b83811115610bec576000848401525b50505050565b601f01601f1916905600a265627a7a723058203f1ff8f944aea9bf889ac44cfb7e5b8e784924b86647ac73d6ca7c0ee87bce0d6c6578706572696d656e74616cf50037", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x141DA876 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x3AF32ABF EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD4 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0xF6 JUMPI DUP1 PUSH4 0xC07732A3 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x136 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x7C5 JUMP JUMPDEST PUSH2 0x156 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0xB9 CALLDATASIZE PUSH1 0x4 PUSH2 0x6FD JUMP JUMPDEST PUSH2 0x3F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xA97 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x409 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xA83 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x75D JUMP JUMPDEST PUSH2 0x418 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x723 JUMP JUMPDEST PUSH2 0x42C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x6FD JUMP JUMPDEST PUSH2 0x484 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 DUP2 ADD DUP4 MSTORE PUSH1 0x25 DUP3 MSTORE PUSH32 0x53656E646572206D75737420657175616C207472616E73616374696F6E206F72 PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0x6967696E2E000000000000000000000000000000000000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE CALLER SWAP2 SWAP1 ORIGIN DUP4 EQ PUSH2 0x1E2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP2 SWAP1 PUSH2 0xAA5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP6 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x1E DUP4 MSTORE PUSH32 0x4D616B65722061646472657373206E6F742077686974656C69737465642E0000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x25A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP2 SWAP1 PUSH2 0xAA5 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x1E DUP4 MSTORE PUSH32 0x54616B65722061646472657373206E6F742077686974656C69737465642E0000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP2 SWAP1 PUSH2 0xAA5 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x309 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0xAC6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x2 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x3BA SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x4 ADD PUSH2 0xAF8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND ORIGIN EQ SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x459 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP1 PUSH2 0xAB6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4B1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP1 PUSH2 0xAB6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F8 DUP3 CALLDATALOAD PUSH2 0xBA2 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F8 DUP3 CALLDATALOAD PUSH2 0xBAE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F8 DUP3 CALLDATALOAD PUSH2 0xBB3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x529 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x541 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x559 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x571 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x584 PUSH2 0x57F DUP3 PUSH2 0xB6A JUMP JUMPDEST PUSH2 0xB43 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x5A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5AB DUP4 DUP3 DUP5 PUSH2 0xBB6 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5D2 PUSH2 0x180 PUSH2 0xB43 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x5E0 DUP5 DUP5 PUSH2 0x4EC JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x5F1 DUP5 DUP5 DUP4 ADD PUSH2 0x4EC JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x605 DUP5 DUP3 DUP6 ADD PUSH2 0x4EC JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x619 DUP5 DUP3 DUP6 ADD PUSH2 0x4EC JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x62D DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x641 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x655 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x669 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x67E DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x694 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6C2 DUP5 DUP3 DUP6 ADD PUSH2 0x560 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6F0 DUP5 DUP3 DUP6 ADD PUSH2 0x560 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x70F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x71B DUP5 DUP5 PUSH2 0x4EC JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x742 DUP6 DUP6 PUSH2 0x4EC JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x753 DUP6 DUP3 DUP7 ADD PUSH2 0x4FF JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x77F DUP8 DUP8 PUSH2 0x50B JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x790 DUP8 DUP3 DUP9 ADD PUSH2 0x4EC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x7AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7B9 DUP8 DUP3 DUP9 ADD PUSH2 0x517 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x7F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7FE DUP8 DUP3 DUP9 ADD PUSH2 0x5B4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x80F DUP8 DUP3 DUP9 ADD PUSH2 0x50B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x820 DUP8 DUP3 DUP9 ADD PUSH2 0x50B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x83D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x849 DUP8 DUP3 DUP9 ADD PUSH2 0x560 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x85E DUP2 PUSH2 0xBA2 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x85E DUP2 PUSH2 0xBAE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x878 DUP3 PUSH2 0xB9E JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x88C DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xBC2 JUMP JUMPDEST PUSH2 0x895 DUP2 PUSH2 0xBF2 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x8BF JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x8DD JUMPI PUSH2 0x919 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV PUSH1 0x7F AND DUP6 MSTORE PUSH1 0xFF NOT DUP3 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP3 POP PUSH2 0x919 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP6 POP PUSH2 0x8F3 DUP6 PUSH2 0xB92 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x912 JUMPI DUP2 SLOAD DUP9 DUP3 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x8F6 JUMP JUMPDEST DUP8 ADD SWAP5 POP POP POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x98C DUP6 DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x99F PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x9B2 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x9C5 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x9D8 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x9EB PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x9FE PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0xA11 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0xA26 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0xA3B PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0xA55 DUP3 DUP3 PUSH2 0x86D JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0xA71 DUP3 DUP3 PUSH2 0x86D JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x85E DUP2 PUSH2 0xBB3 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xA91 DUP3 DUP5 PUSH2 0x855 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xA91 DUP3 DUP5 PUSH2 0x864 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F8 DUP2 DUP5 PUSH2 0x86D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA91 DUP2 PUSH2 0x921 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xAD7 DUP2 DUP7 PUSH2 0x977 JUMP JUMPDEST SWAP1 POP PUSH2 0xAE6 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xA7A JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xA71 DUP2 DUP5 PUSH2 0x86D JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xB06 DUP3 DUP8 PUSH2 0xA7A JUMP JUMPDEST PUSH2 0xB13 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x855 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xB25 DUP2 DUP6 PUSH2 0x86D JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0xB39 DUP2 DUP5 PUSH2 0x8A2 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xB62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xB81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBDD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xBC5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xBEC JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0x3f 0x1f 0xf8 0xf9 DIFFICULTY 0xae 0xa9 0xbf DUP9 SWAP11 0xc4 0x4c CREATE2 PUSH31 0x5B8E784924B86647AC73D6CA7C0EE87BCE0D6C6578706572696D656E74616C 0xf5 STOP CALLDATACOPY ", + "object": "0x6080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663141da876811461007c5780633af32abf1461009e5780638da5cb5b146100d457806393634702146100f6578063c07732a314610116578063f2fde38b14610136575b600080fd5b34801561008857600080fd5b5061009c6100973660046107c5565b610156565b005b3480156100aa57600080fd5b506100be6100b93660046106fd565b6103f4565b6040516100cb9190610a97565b60405180910390f35b3480156100e057600080fd5b506100e9610409565b6040516100cb9190610a83565b34801561010257600080fd5b506100be61011136600461075d565b610418565b34801561012257600080fd5b5061009c610131366004610723565b61042c565b34801561014257600080fd5b5061009c6101513660046106fd565b610484565b6040805160608181018352602582527f53656e646572206d75737420657175616c207472616e73616374696f6e206f7260208301527f6967696e2e000000000000000000000000000000000000000000000000000000928201929092523391903283146101e25760405160e560020a62461bcd0281526004016101d99190610aa5565b60405180910390fd5b508551600160a060020a0316600090815260016020908152604091829020548251808401909352601e83527f4d616b65722061646472657373206e6f742077686974656c69737465642e00009183019190915260ff16151561025a5760405160e560020a62461bcd0281526004016101d99190610aa5565b50600160a060020a038216600090815260016020908152604091829020548251808401909352601e83527f54616b65722061646472657373206e6f742077686974656c69737465642e00009183019190915260ff1615156102d15760405160e560020a62461bcd0281526004016101d99190610aa5565b506040517fb4be83d5000000000000000000000000000000000000000000000000000000009061030990889088908790602401610ac6565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260025491517fbfc8bfce000000000000000000000000000000000000000000000000000000008152909250600160a060020a039091169063bfc8bfce906103ba90879086908690600390600401610af8565b600060405180830381600087803b1580156103d457600080fd5b505af11580156103e8573d6000803e3d6000fd5b50505050505050505050565b60016020526000908152604090205460ff1681565b600054600160a060020a031681565b600160a060020a0383163214949350505050565b600054600160a060020a031633146104595760405160e560020a62461bcd0281526004016101d990610ab6565b600160a060020a03919091166000908152600160205260409020805460ff1916911515919091179055565b600054600160a060020a031633146104b15760405160e560020a62461bcd0281526004016101d990610ab6565b600160a060020a038116156104e9576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60006104f88235610ba2565b9392505050565b60006104f88235610bae565b60006104f88235610bb3565b600080601f8301841361052957600080fd5b50813567ffffffffffffffff81111561054157600080fd5b60208301915083600182028301111561055957600080fd5b9250929050565b6000601f8201831361057157600080fd5b813561058461057f82610b6a565b610b43565b915080825260208301602083018583830111156105a057600080fd5b6105ab838284610bb6565b50505092915050565b600061018082840312156105c757600080fd5b6105d2610180610b43565b905060006105e084846104ec565b82525060206105f1848483016104ec565b6020830152506040610605848285016104ec565b6040830152506060610619848285016104ec565b606083015250608061062d8482850161050b565b60808301525060a06106418482850161050b565b60a08301525060c06106558482850161050b565b60c08301525060e06106698482850161050b565b60e08301525061010061067e8482850161050b565b610100830152506101206106948482850161050b565b6101208301525061014082013567ffffffffffffffff8111156106b657600080fd5b6106c284828501610560565b6101408301525061016082013567ffffffffffffffff8111156106e457600080fd5b6106f084828501610560565b6101608301525092915050565b60006020828403121561070f57600080fd5b600061071b84846104ec565b949350505050565b6000806040838503121561073657600080fd5b600061074285856104ec565b9250506020610753858286016104ff565b9150509250929050565b6000806000806060858703121561077357600080fd5b600061077f878761050b565b9450506020610790878288016104ec565b935050604085013567ffffffffffffffff8111156107ad57600080fd5b6107b987828801610517565b95989497509550505050565b600080600080608085870312156107db57600080fd5b843567ffffffffffffffff8111156107f257600080fd5b6107fe878288016105b4565b945050602061080f8782880161050b565b93505060406108208782880161050b565b925050606085013567ffffffffffffffff81111561083d57600080fd5b61084987828801610560565b91505092959194509250565b61085e81610ba2565b82525050565b61085e81610bae565b600061087882610b9e565b80845261088c816020860160208601610bc2565b61089581610bf2565b9093016020019392505050565b6000815460018116600081146108bf57600181146108dd57610919565b60028204607f16855260ff1982166020860152604085019250610919565b600282048086526020860195506108f385610b92565b60005b82811015610912578154888201526001909101906020016108f6565b8701945050505b505092915050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b805160009061018084019061098c8582610855565b50602083015161099f6020860182610855565b5060408301516109b26040860182610855565b5060608301516109c56060860182610855565b5060808301516109d86080860182610a7a565b5060a08301516109eb60a0860182610a7a565b5060c08301516109fe60c0860182610a7a565b5060e0830151610a1160e0860182610a7a565b50610100830151610a26610100860182610a7a565b50610120830151610a3b610120860182610a7a565b50610140830151848203610140860152610a55828261086d565b915050610160830151848203610160860152610a71828261086d565b95945050505050565b61085e81610bb3565b60208101610a918284610855565b92915050565b60208101610a918284610864565b602080825281016104f8818461086d565b60208082528101610a9181610921565b60608082528101610ad78186610977565b9050610ae66020830185610a7a565b8181036040830152610a71818461086d565b60808101610b068287610a7a565b610b136020830186610855565b8181036040830152610b25818561086d565b90508181036060830152610b3981846108a2565b9695505050505050565b60405181810167ffffffffffffffff81118282101715610b6257600080fd5b604052919050565b600067ffffffffffffffff821115610b8157600080fd5b506020601f91909101601f19160190565b60009081526020902090565b5190565b600160a060020a031690565b151590565b90565b82818337506000910152565b60005b83811015610bdd578181015183820152602001610bc5565b83811115610bec576000848401525b50505050565b601f01601f1916905600a265627a7a72305820cf18155734a00cc9d74a7e2d02cd6dc3b564dfa905c64ee1a5e2c0c4a6c05c756c6578706572696d656e74616cf50037", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x141DA876 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x3AF32ABF EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD4 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0xF6 JUMPI DUP1 PUSH4 0xC07732A3 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x136 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x7C5 JUMP JUMPDEST PUSH2 0x156 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0xB9 CALLDATASIZE PUSH1 0x4 PUSH2 0x6FD JUMP JUMPDEST PUSH2 0x3F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xA97 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x409 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xA83 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x75D JUMP JUMPDEST PUSH2 0x418 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x723 JUMP JUMPDEST PUSH2 0x42C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x6FD JUMP JUMPDEST PUSH2 0x484 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 DUP2 ADD DUP4 MSTORE PUSH1 0x25 DUP3 MSTORE PUSH32 0x53656E646572206D75737420657175616C207472616E73616374696F6E206F72 PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0x6967696E2E000000000000000000000000000000000000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE CALLER SWAP2 SWAP1 ORIGIN DUP4 EQ PUSH2 0x1E2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP2 SWAP1 PUSH2 0xAA5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP6 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x1E DUP4 MSTORE PUSH32 0x4D616B65722061646472657373206E6F742077686974656C69737465642E0000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x25A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP2 SWAP1 PUSH2 0xAA5 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x1E DUP4 MSTORE PUSH32 0x54616B65722061646472657373206E6F742077686974656C69737465642E0000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP2 SWAP1 PUSH2 0xAA5 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x309 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0xAC6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x2 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x3BA SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x4 ADD PUSH2 0xAF8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND ORIGIN EQ SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x459 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP1 PUSH2 0xAB6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4B1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1D9 SWAP1 PUSH2 0xAB6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F8 DUP3 CALLDATALOAD PUSH2 0xBA2 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F8 DUP3 CALLDATALOAD PUSH2 0xBAE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4F8 DUP3 CALLDATALOAD PUSH2 0xBB3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x529 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x541 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x559 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x571 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x584 PUSH2 0x57F DUP3 PUSH2 0xB6A JUMP JUMPDEST PUSH2 0xB43 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x5A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5AB DUP4 DUP3 DUP5 PUSH2 0xBB6 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5D2 PUSH2 0x180 PUSH2 0xB43 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x5E0 DUP5 DUP5 PUSH2 0x4EC JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x5F1 DUP5 DUP5 DUP4 ADD PUSH2 0x4EC JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x605 DUP5 DUP3 DUP6 ADD PUSH2 0x4EC JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x619 DUP5 DUP3 DUP6 ADD PUSH2 0x4EC JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x62D DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x641 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x655 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x669 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x67E DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x694 DUP5 DUP3 DUP6 ADD PUSH2 0x50B JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6C2 DUP5 DUP3 DUP6 ADD PUSH2 0x560 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6F0 DUP5 DUP3 DUP6 ADD PUSH2 0x560 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x70F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x71B DUP5 DUP5 PUSH2 0x4EC JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x742 DUP6 DUP6 PUSH2 0x4EC JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x753 DUP6 DUP3 DUP7 ADD PUSH2 0x4FF JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x77F DUP8 DUP8 PUSH2 0x50B JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x790 DUP8 DUP3 DUP9 ADD PUSH2 0x4EC JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x7AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7B9 DUP8 DUP3 DUP9 ADD PUSH2 0x517 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x7F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7FE DUP8 DUP3 DUP9 ADD PUSH2 0x5B4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x80F DUP8 DUP3 DUP9 ADD PUSH2 0x50B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x820 DUP8 DUP3 DUP9 ADD PUSH2 0x50B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x83D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x849 DUP8 DUP3 DUP9 ADD PUSH2 0x560 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x85E DUP2 PUSH2 0xBA2 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x85E DUP2 PUSH2 0xBAE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x878 DUP3 PUSH2 0xB9E JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x88C DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xBC2 JUMP JUMPDEST PUSH2 0x895 DUP2 PUSH2 0xBF2 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x8BF JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x8DD JUMPI PUSH2 0x919 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV PUSH1 0x7F AND DUP6 MSTORE PUSH1 0xFF NOT DUP3 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP3 POP PUSH2 0x919 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP6 POP PUSH2 0x8F3 DUP6 PUSH2 0xB92 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x912 JUMPI DUP2 SLOAD DUP9 DUP3 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x8F6 JUMP JUMPDEST DUP8 ADD SWAP5 POP POP POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x98C DUP6 DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x99F PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x9B2 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x9C5 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x855 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x9D8 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x9EB PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x9FE PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0xA11 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0xA26 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0xA3B PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0xA7A JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0xA55 DUP3 DUP3 PUSH2 0x86D JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0xA71 DUP3 DUP3 PUSH2 0x86D JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x85E DUP2 PUSH2 0xBB3 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xA91 DUP3 DUP5 PUSH2 0x855 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xA91 DUP3 DUP5 PUSH2 0x864 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x4F8 DUP2 DUP5 PUSH2 0x86D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA91 DUP2 PUSH2 0x921 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xAD7 DUP2 DUP7 PUSH2 0x977 JUMP JUMPDEST SWAP1 POP PUSH2 0xAE6 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xA7A JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xA71 DUP2 DUP5 PUSH2 0x86D JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xB06 DUP3 DUP8 PUSH2 0xA7A JUMP JUMPDEST PUSH2 0xB13 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x855 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xB25 DUP2 DUP6 PUSH2 0x86D JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0xB39 DUP2 DUP5 PUSH2 0x8A2 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xB62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xB81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBDD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xBC5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xBEC JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xcf XOR ISZERO JUMPI CALLVALUE LOG0 0xc 0xc9 0xd7 0x4a PUSH31 0x2D02CD6DC3B564DFA905C64EE1A5E2C0C4A6C05C756C6578706572696D656E PUSH21 0x616CF5003700000000000000000000000000000000 ", "sourceMap": "794:3495:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2498:1145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2498:1145:9;;;;;;;;;;;1139:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1139:46:9;;;;;;;;;;;;;;;;;;;;;;;;;292:20:11;;8:9:-1;5:2;;;30:1;27;20:12;5:2;292:20:11;;;;;;;;;;;;4076:211:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4076:211:9;;;;;;;;;1710:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1710:176:9;;;;;;;;;566:167:11;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;566:167:11;;;;;;;;;2498:1145:9;2877:14;;;3265:17;2877:14;;;;;;;;;;;;;;;;;;;;;2722:10;;3265:17;2854:9;2838:25;;2817:84;;;;-1:-1:-1;;;;;2817:84:9;;;;;;;;;;;;;;;;;;-1:-1:-1;2994:18:9;;-1:-1:-1;;;;;2980:33:9;;;;;:13;:33;;;;;;;;;;3027:21;;;;;;;;;;;;;;;;;;;2980:33;;2959:99;;;;;;-1:-1:-1;;;;;2959:99:9;;;;;;;;;;-1:-1:-1;;;;;;3137:27:9;;;;;;:13;:27;;;;;;;;;;3178:21;;;;;;;;;;;;;;;;;;;3137:27;;3116:93;;;;;;-1:-1:-1;;;;;3116:93:9;;;;;;;;;;-1:-1:-1;3285:154:9;;3321:27;;3285:154;;3362:5;;3381:20;;3415:14;;3285:154;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;3285:154:9;;;49:4:-1;25:18;;61:17;;3285:154:9;182:15:-1;3285:154:9;;;;179:29:-1;;;;160:49;;;3504:8:9;;:132;;;;;3285:154;;-1:-1:-1;;;;;;3504:8:9;;;;:27;;:132;;3545:4;;3563:12;;3285:154;;3607:19;;3504:132;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3504:132:9;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3504:132:9;;;;2498:1145;;;;;;:::o;1139:46::-;;;;;;;;;;;;;;;:::o;292:20:11:-;;;-1:-1:-1;;;;;292:20:11;;:::o;4076:211:9:-;-1:-1:-1;;;;;4261:19:9;;4271:9;4261:19;4076:211;;;;;;:::o;1710:176::-;460:5:11;;-1:-1:-1;;;;;460:5:11;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:11;;;;;;;;;-1:-1:-1;;;;;1845:21:9;;;;;;;;:13;:21;;;;;:34;;-1:-1:-1;;1845:34:9;;;;;;;;;;1710:176::o;566:167:11:-;460:5;;-1:-1:-1;;;;;460:5:11;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:11;;;;;;;;;-1:-1:-1;;;;;662:22:11;;;658:69;;700:5;:16;;-1:-1:-1;;700:16:11;-1:-1:-1;;;;;700:16:11;;;;;658:69;566:167;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;130:112;;194:43;229:6;216:20;194:43;;249:118;;316:46;354:6;341:20;316:46;;388:335;;;495:4;483:17;;479:27;-1:-1;469:2;;520:1;517;510:12;469:2;-1:-1;540:20;;580:18;569:30;;566:2;;;612:1;609;602:12;566:2;646:4;638:6;634:17;622:29;;696:3;689;681:6;677:16;667:8;663:31;660:40;657:2;;;713:1;710;703:12;657:2;462:261;;;;;;732:432;;822:4;810:17;;806:27;-1:-1;796:2;;847:1;844;837:12;796:2;884:6;871:20;906:60;921:44;958:6;921:44;;;906:60;;;897:69;;986:6;979:5;972:21;1022:4;1014:6;1010:17;1055:4;1048:5;1044:16;1090:3;1081:6;1076:3;1072:16;1069:25;1066:2;;;1107:1;1104;1097:12;1066:2;1117:41;1151:6;1146:3;1141;1117:41;;;789:375;;;;;;;;1649:2208;;1760:5;1748:9;1743:3;1739:19;1735:31;1732:2;;;1779:1;1776;1769:12;1732:2;1797:21;1812:5;1797:21;;;1788:30;-1:-1;1876:1;1907:49;1952:3;1932:9;1907:49;;;1883:74;;-1:-1;2026:2;2059:49;2104:3;2080:22;;;2059:49;;;2052:4;2045:5;2041:16;2034:75;1978:142;2185:2;2218:49;2263:3;2254:6;2243:9;2239:22;2218:49;;;2211:4;2204:5;2200:16;2193:75;2130:149;2338:2;2371:49;2416:3;2407:6;2396:9;2392:22;2371:49;;;2364:4;2357:5;2353:16;2346:75;2289:143;2494:3;2528:49;2573:3;2564:6;2553:9;2549:22;2528:49;;;2521:4;2514:5;2510:16;2503:75;2442:147;2651:3;2685:49;2730:3;2721:6;2710:9;2706:22;2685:49;;;2678:4;2671:5;2667:16;2660:75;2599:147;2800:3;2834:49;2879:3;2870:6;2859:9;2855:22;2834:49;;;2827:4;2820:5;2816:16;2809:75;2756:139;2949:3;2983:49;3028:3;3019:6;3008:9;3004:22;2983:49;;;2976:4;2969:5;2965:16;2958:75;2905:139;3111:3;3146:49;3191:3;3182:6;3171:9;3167:22;3146:49;;;3138:5;3131;3127:17;3120:76;3054:153;3257:3;3292:49;3337:3;3328:6;3317:9;3313:22;3292:49;;;3284:5;3277;3273:17;3266:76;3217:136;3441:3;3430:9;3426:19;3413:33;3466:18;3458:6;3455:30;3452:2;;;3498:1;3495;3488:12;3452:2;3534:54;3584:3;3575:6;3564:9;3560:22;3534:54;;;3526:5;3519;3515:17;3508:81;3363:237;3688:3;3677:9;3673:19;3660:33;3713:18;3705:6;3702:30;3699:2;;;3745:1;3742;3735:12;3699:2;3781:54;3831:3;3822:6;3811:9;3807:22;3781:54;;;3773:5;3766;3762:17;3755:81;3610:237;1726:2131;;;;;3989:241;;4093:2;4081:9;4072:7;4068:23;4064:32;4061:2;;;4109:1;4106;4099:12;4061:2;4144:1;4161:53;4206:7;4186:9;4161:53;;;4151:63;4055:175;-1:-1;;;;4055:175;4237:360;;;4355:2;4343:9;4334:7;4330:23;4326:32;4323:2;;;4371:1;4368;4361:12;4323:2;4406:1;4423:53;4468:7;4448:9;4423:53;;;4413:63;;4385:97;4513:2;4531:50;4573:7;4564:6;4553:9;4549:22;4531:50;;;4521:60;;4492:95;4317:280;;;;;;4604:615;;;;;4761:2;4749:9;4740:7;4736:23;4732:32;4729:2;;;4777:1;4774;4767:12;4729:2;4812:1;4829:53;4874:7;4854:9;4829:53;;;4819:63;;4791:97;4919:2;4937:53;4982:7;4973:6;4962:9;4958:22;4937:53;;;4927:63;;4898:98;5055:2;5044:9;5040:18;5027:32;5079:18;5071:6;5068:30;5065:2;;;5111:1;5108;5101:12;5065:2;5139:64;5195:7;5186:6;5175:9;5171:22;5139:64;;;4723:496;;;;-1:-1;5121:82;-1:-1;;;;4723:496;5226:851;;;;;5412:3;5400:9;5391:7;5387:23;5383:33;5380:2;;;5429:1;5426;5419:12;5380:2;5464:31;;5515:18;5504:30;;5501:2;;;5547:1;5544;5537:12;5501:2;5567:75;5634:7;5625:6;5614:9;5610:22;5567:75;;;5557:85;;5443:205;5679:2;5697:53;5742:7;5733:6;5722:9;5718:22;5697:53;;;5687:63;;5658:98;5787:2;5805:53;5850:7;5841:6;5830:9;5826:22;5805:53;;;5795:63;;5766:98;5923:2;5912:9;5908:18;5895:32;5947:18;5939:6;5936:30;5933:2;;;5979:1;5976;5969:12;5933:2;5999:62;6053:7;6044:6;6033:9;6029:22;5999:62;;;5989:72;;5874:193;5374:703;;;;;;;;6084:110;6157:31;6182:5;6157:31;;;6152:3;6145:44;6139:55;;;6201:101;6268:28;6290:5;6268:28;;6309:297;;6409:38;6441:5;6409:38;;;6464:6;6459:3;6452:19;6476:63;6532:6;6525:4;6520:3;6516:14;6509:4;6502:5;6498:16;6476:63;;;6571:29;6593:6;6571:29;;;6551:50;;;6564:4;6551:50;;6389:217;-1:-1;;;6389:217;6932:731;;7039:5;7033:12;7073:1;7062:9;7058:17;7086:1;7081:200;;;;7292:1;7287:370;;;;7051:606;;7081:200;7155:1;7140:17;;7159:4;7136:28;7171:19;;-1:-1;;7220:25;;7213:4;7204:14;;7197:49;7269:4;7260:14;;;-1:-1;7081:200;;7287:370;7356:1;7345:9;7341:17;7377:6;7372:3;7365:19;7407:4;7402:3;7398:14;7391:21;;7434:37;7465:5;7434:37;;;7487:1;7495:130;7509:6;7506:1;7503:13;7495:130;;;7568:14;;7555:11;;;7548:35;7615:1;7602:15;;;;7531:4;7524:12;7495:130;;;7639:11;;;-1:-1;;;7051:606;;7009:654;;;;;;7971:397;8126:2;8114:15;;8163:66;8158:2;8149:12;;8142:88;8264:66;8259:2;8250:12;;8243:88;8359:2;8350:12;;8107:261;8429:2417;8642:22;;8429:2417;;8564:5;8555:15;;;8676:61;8559:3;8642:22;8676:61;;;8585:164;8833:4;8826:5;8822:16;8816:23;8851:62;8907:4;8902:3;8898:14;8885:11;8851:62;;;8759:166;9016:4;9009:5;9005:16;8999:23;9034:62;9090:4;9085:3;9081:14;9068:11;9034:62;;;8935:173;9193:4;9186:5;9182:16;9176:23;9211:62;9267:4;9262:3;9258:14;9245:11;9211:62;;;9118:167;9373:4;9366:5;9362:16;9356:23;9391:62;9447:4;9442:3;9438:14;9425:11;9391:62;;;9295:170;9553:4;9546:5;9542:16;9536:23;9571:62;9627:4;9622:3;9618:14;9605:11;9571:62;;;9475:170;9725:4;9718:5;9714:16;9708:23;9743:62;9799:4;9794:3;9790:14;9777:11;9743:62;;;9655:162;9897:4;9890:5;9886:16;9880:23;9915:62;9971:4;9966:3;9962:14;9949:11;9915:62;;;9827:162;10082:5;10075;10071:17;10065:24;10101:63;10157:5;10152:3;10148:15;10135:11;10101:63;;;9999:177;10252:5;10245;10241:17;10235:24;10271:63;10327:5;10322:3;10318:15;10305:11;10271:63;;;10186:160;10432:5;10425;10421:17;10415:24;10485:3;10479:4;10475:14;10467:5;10462:3;10458:15;10451:39;10505:66;10566:4;10553:11;10505:66;;;10497:74;;10356:227;10669:5;10662;10658:17;10652:24;10722:3;10716:4;10712:14;10704:5;10699:3;10695:15;10688:39;10742:66;10803:4;10790:11;10742:66;;;10734:74;8537:2309;-1:-1;;;;;8537:2309;10853:110;10926:31;10951:5;10926:31;;10970:193;11078:2;11063:18;;11092:61;11067:9;11126:6;11092:61;;;11049:114;;;;;11170:181;11272:2;11257:18;;11286:55;11261:9;11314:6;11286:55;;11358:273;11482:2;11496:47;;;11467:18;;11557:64;11467:18;11607:6;11557:64;;11638:387;11819:2;11833:47;;;11804:18;;11894:121;11804:18;11894:121;;12032:615;12258:2;12272:47;;;12243:18;;12333:92;12243:18;12411:6;12333:92;;;12325:100;;12436:62;12494:2;12483:9;12479:18;12470:6;12436:62;;;12546:9;12540:4;12536:20;12531:2;12520:9;12516:18;12509:48;12571:66;12632:4;12623:6;12571:66;;12654:659;12879:3;12864:19;;12894:61;12868:9;12928:6;12894:61;;;12966:62;13024:2;13013:9;13009:18;13000:6;12966:62;;;13076:9;13070:4;13066:20;13061:2;13050:9;13046:18;13039:48;13101:66;13162:4;13153:6;13101:66;;;13093:74;;13215:9;13209:4;13205:20;13200:2;13189:9;13185:18;13178:48;13240:63;13298:4;13289:6;13240:63;;;13232:71;12850:463;-1:-1;;;;;;12850:463;13320:256;13382:2;13376:9;13408:17;;;13483:18;13468:34;;13504:22;;;13465:62;13462:2;;;13540:1;13537;13530:12;13462:2;13556;13549:22;13360:216;;-1:-1;13360:216;13583:254;;13722:18;13714:6;13711:30;13708:2;;;13754:1;13751;13744:12;13708:2;-1:-1;13827:4;13798;13775:17;;;;-1:-1;;13771:33;13817:15;;13645:192;14111:125;;14177:15;;;14224:4;14211:18;;;14169:67;14245:87;14315:12;;14299:33;14532:128;-1:-1;;;;;14601:54;;14584:76;14667:92;14740:13;14733:21;;14716:43;14766:79;14835:5;14818:27;15259:145;15340:6;15335:3;15330;15317:30;-1:-1;15396:1;15378:16;;15371:27;15310:94;15413:268;15478:1;15485:101;15499:6;15496:1;15493:13;15485:101;;;15566:11;;;15560:18;15547:11;;;15540:39;15521:2;15514:10;15485:101;;;15601:6;15598:1;15595:13;15592:2;;;15666:1;15657:6;15652:3;15648:16;15641:27;15592:2;15462:219;;;;;15689:97;15777:2;15757:14;-1:-1;;15753:28;;15737:49" } } @@ -244,7 +244,7 @@ "current/protocol/Exchange/interfaces/IExchange.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./IExchangeCore.sol\";\nimport \"./IMatchOrders.sol\";\nimport \"./ISignatureValidator.sol\";\nimport \"./ITransactions.sol\";\nimport \"./IAssetProxyDispatcher.sol\";\nimport \"./IWrapperFunctions.sol\";\n\ncontract IExchange is\n IExchangeCore,\n IMatchOrders,\n ISignatureValidator,\n ITransactions,\n IAssetProxyDispatcher,\n IWrapperFunctions\n{}\n", "current/protocol/Exchange/interfaces/IExchangeCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\ncontract IExchangeCore {\n\n /// @dev Cancels all orders reated by sender with a salt less than or equal to the specified salt value.\n /// @param salt Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 salt)\n external;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n", "current/protocol/Exchange/interfaces/IMatchOrders.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n /// TODO: Make this function external once supported by Solidity (See Solidity Issues #3199, #1603)\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n", - "current/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validator Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validator,\n bool approval\n )\n external;\n}\n", + "current/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signer Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signer,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validator Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validator,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signer Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n", "current/protocol/Exchange/interfaces/ITransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.4.24;\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signer Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signer,\n bytes data,\n bytes signature\n )\n external;\n}\n", "current/protocol/Exchange/interfaces/IWrapperFunctions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\ncontract IWrapperFunctions is\n LibOrder,\n LibFillResults\n{\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public;\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public;\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public;\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n}\n", "current/protocol/Exchange/libs/LibFillResults.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount;\n uint256 takerAssetFilledAmount;\n uint256 makerFeePaid;\n uint256 takerFeePaid;\n }\n\n struct MatchedFillResults {\n FillResults left;\n FillResults right;\n uint256 leftMakerAssetSpreadAmount;\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n", @@ -254,7 +254,7 @@ "current/utils/Ownable/Ownable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"Only contract owner is allowed to call this method.\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n", "current/utils/SafeMath/SafeMath.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\ncontract SafeMath {\n function safeMul(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a * b;\n assert(a == 0 || c / a == b);\n return c;\n }\n\n function safeDiv(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a / b;\n return c;\n }\n\n function safeSub(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n assert(b <= a);\n return a - b;\n }\n\n function safeAdd(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a + b;\n assert(c >= a);\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n" }, - "sourceTreeHashHex": "0x8465c56678b9741721e4e6247fb51c435a6072b9091cc434bf79459e8a6cd03f", + "sourceTreeHashHex": "0xba684560c10bddeda9edd41d96ee5d731b647dc30dbedbeefa9aa19d9577f449", "compiler": { "name": "solc", "version": "soljson-v0.4.24+commit.e67f0147.js", diff --git a/packages/migrations/package.json b/packages/migrations/package.json index 1b452f937..25ef95cf5 100644 --- a/packages/migrations/package.json +++ b/packages/migrations/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/migrations", - "version": "0.0.6", + "version": "0.0.8", "engines": { "node": ">=6.12" }, @@ -36,10 +36,10 @@ }, "license": "Apache-2.0", "devDependencies": { - "@0xproject/abi-gen": "^0.3.0", - "@0xproject/dev-utils": "^0.4.2", - "@0xproject/tslint-config": "^0.4.18", - "@0xproject/types": "^0.7.0", + "@0xproject/abi-gen": "^0.3.2", + "@0xproject/dev-utils": "^0.4.4", + "@0xproject/tslint-config": "^0.4.20", + "@0xproject/types": "^0.8.1", "@types/yargs": "^10.0.0", "yargs": "^10.0.3", "make-promises-safe": "^1.1.0", @@ -49,13 +49,13 @@ "typescript": "2.7.1" }, "dependencies": { - "@0xproject/base-contract": "^0.3.2", - "@0xproject/sol-compiler": "^0.5.0", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", - "@0xproject/web3-wrapper": "^0.6.4", + "@0xproject/base-contract": "^0.3.4", + "@0xproject/sol-compiler": "^0.5.2", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", + "@0xproject/web3-wrapper": "^0.7.1", "ethereum-types": "^0.0.1", - "ethers": "^3.0.15", + "ethers": "3.0.22", "lodash": "^4.17.4" }, "publishConfig": { diff --git a/packages/monorepo-scripts/CHANGELOG.json b/packages/monorepo-scripts/CHANGELOG.json index a41262ed2..a1dda0176 100644 --- a/packages/monorepo-scripts/CHANGELOG.json +++ b/packages/monorepo-scripts/CHANGELOG.json @@ -1,5 +1,15 @@ [ { + "timestamp": 1529397769, + "version": "0.2.1", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1529081166, "version": "0.2.0", "changes": [ { diff --git a/packages/monorepo-scripts/CHANGELOG.md b/packages/monorepo-scripts/CHANGELOG.md index db5afd5af..7e5aadef0 100644 --- a/packages/monorepo-scripts/CHANGELOG.md +++ b/packages/monorepo-scripts/CHANGELOG.md @@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.2.1 - _June 19, 2018_ + + * Dependencies updated + +## v0.2.0 - _June 15, 2018_ + + * Add `prepublish_checks` script (#650) + ## v0.1.20 - _May 22, 2018_ * Dependencies updated diff --git a/packages/monorepo-scripts/README.md b/packages/monorepo-scripts/README.md index 22b449870..d979e27dc 100644 --- a/packages/monorepo-scripts/README.md +++ b/packages/monorepo-scripts/README.md @@ -8,8 +8,6 @@ This repository contains a few helpful scripts for working with this mono repo. **`yarn find_unused_deps`**: Sometimes we accidentally leave dependencies listed in `package.json` that are no longer being used. This script finds potential dependencies that might no longer be in use. Please verify that it is no longer in use before removing, the `depcheck` package we use under-the-hood doesn't handle some TS quirks perfectly. -**`yarn remove_tags`**: Our publishing script calls `lerna publish` under-the-hood. If this command fails, it might have created new versioned git tags for each package. Removing these manually is tedious, so you can also run this command instead. Before doing so, check to see if `lerna` already created the publish commit. If so, first revert that with `git reset --hard HEAD~1`, then run this command. - **`yarn test:publish`**: Execute a test-run of the publish script. This dry run won't actually publish, nor will it commit/push anything to Github. ## Usage diff --git a/packages/monorepo-scripts/package.json b/packages/monorepo-scripts/package.json index 5a6d7b25a..270b5d2c7 100644 --- a/packages/monorepo-scripts/package.json +++ b/packages/monorepo-scripts/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/monorepo-scripts", - "version": "0.1.20", + "version": "0.2.1", "engines": { "node": ">=6.12" }, @@ -14,12 +14,10 @@ "clean": "shx rm -rf lib", "test:publish": "run-s build script:publish", "find_unused_deps": "run-s build script:find_unused_deps", - "remove_tags": "run-s build script:remove_tags", "script:deps_versions": "node ./lib/deps_versions.js", "script:prepublish_checks": "node ./lib/prepublish_checks.js", "script:publish": "IS_DRY_RUN=true node ./lib/publish.js", - "script:find_unused_deps": "node ./lib/find_unused_dependencies.js", - "script:remove_tags": "node ./lib/remove_tags.js" + "script:find_unused_deps": "node ./lib/find_unused_dependencies.js" }, "repository": { "type": "git", @@ -40,6 +38,7 @@ "make-promises-safe": "^1.1.0", "npm-run-all": "^4.1.2", "shx": "^0.2.2", + "@types/semver": "5.5.0", "tslint": "5.8.0", "typescript": "2.7.1" }, @@ -50,6 +49,7 @@ "es6-promisify": "^5.0.0", "glob": "^7.1.2", "lodash": "^4.17.4", + "isomorphic-fetch": "2.2.1", "moment": "2.21.0", "opn": "^5.3.0", "promisify-child-process": "^1.0.5", @@ -57,6 +57,7 @@ "publish-release": "0xproject/publish-release", "rimraf": "^2.6.2", "semver-diff": "^2.1.0", + "semver": "5.5.0", "semver-sort": "0.0.4" }, "publishConfig": { diff --git a/packages/monorepo-scripts/src/prepublish_checks.ts b/packages/monorepo-scripts/src/prepublish_checks.ts index 2c096d8f6..1c4ee1fc6 100644 --- a/packages/monorepo-scripts/src/prepublish_checks.ts +++ b/packages/monorepo-scripts/src/prepublish_checks.ts @@ -1,9 +1,128 @@ import * as _ from 'lodash'; import { exec as execAsync } from 'promisify-child-process'; +import semver = require('semver'); +import semverSort = require('semver-sort'); import { constants } from './constants'; +import { changelogUtils } from './utils/changelog_utils'; +import { npmUtils } from './utils/npm_utils'; import { utils } from './utils/utils'; +async function prepublishChecksAsync(): Promise<void> { + const shouldIncludePrivate = false; + const updatedPublicLernaPackages = await utils.getUpdatedLernaPackagesAsync(shouldIncludePrivate); + + await checkCurrentVersionMatchesLatestPublishedNPMPackageAsync(updatedPublicLernaPackages); + await checkChangelogFormatAsync(updatedPublicLernaPackages); + await checkGitTagsForNextVersionAndDeleteIfExistAsync(updatedPublicLernaPackages); + await checkPublishRequiredSetupAsync(); +} + +async function checkGitTagsForNextVersionAndDeleteIfExistAsync( + updatedPublicLernaPackages: LernaPackage[], +): Promise<void> { + const packageNames = _.map(updatedPublicLernaPackages, lernaPackage => lernaPackage.package.name); + const localGitTags = await utils.getLocalGitTagsAsync(); + const localTagVersionsByPackageName = await utils.getGitTagsByPackageNameAsync(packageNames, localGitTags); + + const remoteGitTags = await utils.getRemoteGitTagsAsync(); + const remoteTagVersionsByPackageName = await utils.getGitTagsByPackageNameAsync(packageNames, remoteGitTags); + + for (const lernaPackage of updatedPublicLernaPackages) { + const currentVersion = lernaPackage.package.version; + const packageName = lernaPackage.package.name; + const packageLocation = lernaPackage.location; + const nextVersion = await utils.getNextPackageVersionAsync(currentVersion, packageName, packageLocation); + + const localTagVersions = localTagVersionsByPackageName[packageName]; + if (_.includes(localTagVersions, nextVersion)) { + const tagName = `${packageName}@${nextVersion}`; + await utils.removeLocalTagAsync(tagName); + } + + const remoteTagVersions = remoteTagVersionsByPackageName[packageName]; + if (_.includes(remoteTagVersions, nextVersion)) { + const tagName = `:refs/tags/${packageName}@${nextVersion}`; + await utils.removeRemoteTagAsync(tagName); + } + } +} + +async function checkCurrentVersionMatchesLatestPublishedNPMPackageAsync( + updatedPublicLernaPackages: LernaPackage[], +): Promise<void> { + utils.log('Check package versions against npmjs.org...'); + const versionMismatches = []; + for (const lernaPackage of updatedPublicLernaPackages) { + const packageName = lernaPackage.package.name; + const packageVersion = lernaPackage.package.version; + const packageRegistryJsonIfExists = await npmUtils.getPackageRegistryJsonIfExistsAsync(packageName); + if (_.isUndefined(packageRegistryJsonIfExists)) { + continue; // noop for packages not yet published to NPM + } + const allVersionsIncludingUnpublished = npmUtils.getPreviouslyPublishedVersions(packageRegistryJsonIfExists); + const sortedVersions = semverSort.desc(allVersionsIncludingUnpublished); + const latestNPMVersion = sortedVersions[0]; + if (packageVersion !== latestNPMVersion) { + versionMismatches.push({ + packageJsonVersion: packageVersion, + npmVersion: latestNPMVersion, + packageName, + }); + } + } + if (!_.isEmpty(versionMismatches)) { + utils.log(`Found version mismatches between package.json and NPM published versions (might be unpublished).`); + _.each(versionMismatches, versionMismatch => { + utils.log( + `${versionMismatch.packageName}: ${versionMismatch.packageJsonVersion} package.json, ${ + versionMismatch.npmVersion + } on NPM`, + ); + }); + throw new Error(`Please fix the above package.json/NPM inconsistencies.`); + } +} + +async function checkChangelogFormatAsync(updatedPublicLernaPackages: LernaPackage[]): Promise<void> { + utils.log('Check CHANGELOGs for inconsistencies...'); + const changeLogInconsistencies = []; + for (const lernaPackage of updatedPublicLernaPackages) { + const packageName = lernaPackage.package.name; + const changelog = changelogUtils.getChangelogOrCreateIfMissing(packageName, lernaPackage.location); + + const currentVersion = lernaPackage.package.version; + if (!_.isEmpty(changelog)) { + const lastEntry = changelog[0]; + const doesLastEntryHaveTimestamp = !_.isUndefined(lastEntry.timestamp); + if (semver.lt(lastEntry.version, currentVersion)) { + changeLogInconsistencies.push({ + packageJsonVersion: currentVersion, + changelogVersion: lastEntry.version, + packageName, + }); + } else if (semver.gt(lastEntry.version, currentVersion) && doesLastEntryHaveTimestamp) { + // Remove incorrectly added timestamp + delete changelog[0].timestamp; + // Save updated CHANGELOG.json + await changelogUtils.writeChangelogJsonFileAsync(lernaPackage.location, changelog); + utils.log(`${packageName}: Removed timestamp from latest CHANGELOG.json entry.`); + } + } + } + if (!_.isEmpty(changeLogInconsistencies)) { + utils.log(`CHANGELOG versions cannot below package.json versions:`); + _.each(changeLogInconsistencies, inconsistency => { + utils.log( + `${inconsistency.packageName}: ${inconsistency.packageJsonVersion} package.json, ${ + inconsistency.changelogVersion + } CHANGELOG.json`, + ); + }); + throw new Error('Fix the above inconsistencies to continue.'); + } +} + async function checkPublishRequiredSetupAsync(): Promise<void> { // check to see if logged into npm before publishing try { @@ -65,7 +184,7 @@ async function checkPublishRequiredSetupAsync(): Promise<void> { } } -checkPublishRequiredSetupAsync().catch(err => { +prepublishChecksAsync().catch(err => { utils.log(err.message); process.exit(1); }); diff --git a/packages/monorepo-scripts/src/publish.ts b/packages/monorepo-scripts/src/publish.ts index 2efbc8bf2..72c6c0a71 100644 --- a/packages/monorepo-scripts/src/publish.ts +++ b/packages/monorepo-scripts/src/publish.ts @@ -1,18 +1,17 @@ #!/usr/bin/env node import * as promisify from 'es6-promisify'; -import * as fs from 'fs'; import * as _ from 'lodash'; import * as moment from 'moment'; import opn = require('opn'); -import * as path from 'path'; import { exec as execAsync, spawn } from 'promisify-child-process'; import * as prompt from 'prompt'; +import semver = require('semver'); import semverDiff = require('semver-diff'); import semverSort = require('semver-sort'); import { constants } from './constants'; -import { Changelog, PackageToVersionChange, SemVerIndex, VersionChangelog } from './types'; +import { PackageToVersionChange, SemVerIndex, VersionChangelog } from './types'; import { changelogUtils } from './utils/changelog_utils'; import { utils } from './utils/utils'; @@ -119,25 +118,23 @@ async function updateChangeLogsAsync(updatedPublicLernaPackages: LernaPackage[]) const packageToVersionChange: PackageToVersionChange = {}; for (const lernaPackage of updatedPublicLernaPackages) { const packageName = lernaPackage.package.name; - const changelogJSONPath = path.join(lernaPackage.location, 'CHANGELOG.json'); - const changelogJSON = utils.getChangelogJSONOrCreateIfMissing(changelogJSONPath); - let changelog: Changelog; - try { - changelog = JSON.parse(changelogJSON); - } catch (err) { - throw new Error( - `${lernaPackage.package.name}'s CHANGELOG.json contains invalid JSON. Please fix and try again.`, - ); - } + let changelog = changelogUtils.getChangelogOrCreateIfMissing(packageName, lernaPackage.location); const currentVersion = lernaPackage.package.version; - const shouldAddNewEntry = changelogUtils.shouldAddNewChangelogEntry(currentVersion, changelog); + const shouldAddNewEntry = changelogUtils.shouldAddNewChangelogEntry( + lernaPackage.package.name, + currentVersion, + changelog, + ); if (shouldAddNewEntry) { // Create a new entry for a patch version with generic changelog entry. - const nextPatchVersion = utils.getNextPatchVersion(currentVersion); + const nextPatchVersionIfValid = semver.inc(currentVersion, 'patch'); + if (_.isNull(nextPatchVersionIfValid)) { + throw new Error(`Encountered invalid semver version: ${currentVersion} for package: ${packageName}`); + } const newChangelogEntry: VersionChangelog = { timestamp: TODAYS_TIMESTAMP, - version: nextPatchVersion, + version: nextPatchVersionIfValid, changes: [ { note: 'Dependencies updated', @@ -145,7 +142,7 @@ async function updateChangeLogsAsync(updatedPublicLernaPackages: LernaPackage[]) ], }; changelog = [newChangelogEntry, ...changelog]; - packageToVersionChange[packageName] = semverDiff(currentVersion, nextPatchVersion); + packageToVersionChange[packageName] = semverDiff(currentVersion, nextPatchVersionIfValid); } else { // Update existing entry with timestamp const lastEntry = changelog[0]; @@ -160,14 +157,11 @@ async function updateChangeLogsAsync(updatedPublicLernaPackages: LernaPackage[]) } // Save updated CHANGELOG.json - fs.writeFileSync(changelogJSONPath, JSON.stringify(changelog, null, '\t')); - await utils.prettifyAsync(changelogJSONPath, constants.monorepoRootPath); + await changelogUtils.writeChangelogJsonFileAsync(lernaPackage.location, changelog); utils.log(`${packageName}: Updated CHANGELOG.json`); // Generate updated CHANGELOG.md const changelogMd = changelogUtils.generateChangelogMd(changelog); - const changelogMdPath = path.join(lernaPackage.location, 'CHANGELOG.md'); - fs.writeFileSync(changelogMdPath, changelogMd); - await utils.prettifyAsync(changelogMdPath, constants.monorepoRootPath); + await changelogUtils.writeChangelogMdFileAsync(lernaPackage.location, changelogMd); utils.log(`${packageName}: Updated CHANGELOG.md`); } @@ -217,12 +211,16 @@ async function lernaPublishAsync(packageToVersionChange: { [name: string]: strin } function updateVersionNumberIfNeeded(currentVersion: string, proposedNextVersion: string): string { + const updatedVersionIfValid = semver.inc(currentVersion, 'patch'); + if (_.isNull(updatedVersionIfValid)) { + throw new Error(`Encountered invalid semver: ${currentVersion}`); + } if (proposedNextVersion === currentVersion) { - return utils.getNextPatchVersion(currentVersion); + return updatedVersionIfValid; } const sortedVersions = semverSort.desc([proposedNextVersion, currentVersion]); if (sortedVersions[0] !== proposedNextVersion) { - return utils.getNextPatchVersion(currentVersion); + return updatedVersionIfValid; } return proposedNextVersion; } diff --git a/packages/monorepo-scripts/src/remove_tags.ts b/packages/monorepo-scripts/src/remove_tags.ts deleted file mode 100644 index 50e413495..000000000 --- a/packages/monorepo-scripts/src/remove_tags.ts +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env node - -import * as _ from 'lodash'; -import * as path from 'path'; -import { exec as execAsync } from 'promisify-child-process'; -import semverSort = require('semver-sort'); - -import { constants } from './constants'; -import { Changelog } from './types'; -import { utils } from './utils/utils'; - -(async () => { - const shouldIncludePrivate = true; - const updatedPublicLernaPackages = await utils.getUpdatedLernaPackagesAsync(shouldIncludePrivate); - - for (const lernaPackage of updatedPublicLernaPackages) { - const packageName = lernaPackage.package.name; - const currentVersion = lernaPackage.package.version; - const changelogJSONPath = path.join(lernaPackage.location, 'CHANGELOG.json'); - // Private packages don't have changelogs, and their versions are always incremented - // by a patch version. - const changelogJSONIfExists = utils.getChangelogJSONIfExists(changelogJSONPath); - - let latestChangelogVersion: string; - if (!_.isUndefined(changelogJSONIfExists)) { - let changelogs: Changelog; - try { - changelogs = JSON.parse(changelogJSONIfExists); - } catch (err) { - throw new Error( - `${lernaPackage.package.name}'s CHANGELOG.json contains invalid JSON. Please fix and try again.`, - ); - } - latestChangelogVersion = changelogs[0].version; - } else { - latestChangelogVersion = utils.getNextPatchVersion(currentVersion); - } - - const sortedVersions = semverSort.desc([latestChangelogVersion, currentVersion]); - if (sortedVersions[0] === latestChangelogVersion && latestChangelogVersion !== currentVersion) { - const tagName = `${packageName}@${latestChangelogVersion}`; - try { - await execAsync(`git tag -d ${tagName}`, { cwd: constants.monorepoRootPath }); - utils.log(`removed tag: ${tagName}`); - } catch (err) { - if (_.includes(err.message, 'not found')) { - utils.log(`Could not find tag: ${tagName}`); - } else { - throw err; - } - } - } - } -})().catch(err => { - utils.log(err); - process.exit(1); -}); diff --git a/packages/monorepo-scripts/src/types.ts b/packages/monorepo-scripts/src/types.ts index 36fb923b3..61bd75732 100644 --- a/packages/monorepo-scripts/src/types.ts +++ b/packages/monorepo-scripts/src/types.ts @@ -27,3 +27,16 @@ export enum SemVerIndex { export interface PackageToVersionChange { [name: string]: string; } + +export interface PackageRegistryJson { + versions: { + [version: string]: any; + }; + time: { + [version: string]: string; + }; +} + +export interface GitTagsByPackageName { + [packageName: string]: string[]; +} diff --git a/packages/monorepo-scripts/src/utils/changelog_utils.ts b/packages/monorepo-scripts/src/utils/changelog_utils.ts index edfe65a80..dbafb6f16 100644 --- a/packages/monorepo-scripts/src/utils/changelog_utils.ts +++ b/packages/monorepo-scripts/src/utils/changelog_utils.ts @@ -1,6 +1,11 @@ +import * as fs from 'fs'; import * as _ from 'lodash'; import * as moment from 'moment'; +import * as path from 'path'; +import { exec as execAsync } from 'promisify-child-process'; +import semver = require('semver'); +import { constants } from '../constants'; import { Change, Changelog, VersionChangelog } from '../types'; const CHANGELOG_MD_HEADER = ` @@ -44,12 +49,58 @@ export const changelogUtils = { return changelogMd; }, - shouldAddNewChangelogEntry(currentVersion: string, changelog: Changelog): boolean { + shouldAddNewChangelogEntry(packageName: string, currentVersion: string, changelog: Changelog): boolean { if (_.isEmpty(changelog)) { return true; } const lastEntry = changelog[0]; + if (semver.lt(lastEntry.version, currentVersion)) { + throw new Error( + `Found CHANGELOG version lower then current package version. ${packageName} current: ${currentVersion}, Changelog: ${ + lastEntry.version + }`, + ); + } const isLastEntryCurrentVersion = lastEntry.version === currentVersion; return isLastEntryCurrentVersion; }, + getChangelogJSONIfExists(changelogPath: string): string | undefined { + try { + const changelogJSON = fs.readFileSync(changelogPath, 'utf-8'); + return changelogJSON; + } catch (err) { + return undefined; + } + }, + getChangelogOrCreateIfMissing(packageName: string, packageLocation: string): Changelog { + const changelogJSONPath = path.join(packageLocation, 'CHANGELOG.json'); + let changelogJsonIfExists = this.getChangelogJSONIfExists(changelogJSONPath); + if (_.isUndefined(changelogJsonIfExists)) { + // If none exists, create new, empty one. + changelogJsonIfExists = '[]'; + fs.writeFileSync(changelogJSONPath, changelogJsonIfExists); + } + let changelog: Changelog; + try { + changelog = JSON.parse(changelogJsonIfExists); + } catch (err) { + throw new Error(`${packageName}'s CHANGELOG.json contains invalid JSON. Please fix and try again.`); + } + return changelog; + }, + async writeChangelogJsonFileAsync(packageLocation: string, changelog: Changelog): Promise<void> { + const changelogJSONPath = path.join(packageLocation, 'CHANGELOG.json'); + fs.writeFileSync(changelogJSONPath, JSON.stringify(changelog, null, '\t')); + await this.prettifyAsync(changelogJSONPath, constants.monorepoRootPath); + }, + async writeChangelogMdFileAsync(packageLocation: string, changelogMdString: string): Promise<void> { + const changelogMarkdownPath = path.join(packageLocation, 'CHANGELOG.md'); + fs.writeFileSync(changelogMarkdownPath, changelogMdString); + await this.prettifyAsync(changelogMarkdownPath, constants.monorepoRootPath); + }, + async prettifyAsync(filePath: string, cwd: string): Promise<void> { + await execAsync(`prettier --write ${filePath} --config .prettierrc`, { + cwd, + }); + }, }; diff --git a/packages/monorepo-scripts/src/utils/npm_utils.ts b/packages/monorepo-scripts/src/utils/npm_utils.ts new file mode 100644 index 000000000..cc1e046e7 --- /dev/null +++ b/packages/monorepo-scripts/src/utils/npm_utils.ts @@ -0,0 +1,28 @@ +import 'isomorphic-fetch'; +import * as _ from 'lodash'; + +import { PackageRegistryJson } from '../types'; + +const NPM_REGISTRY_BASE_URL = 'https://registry.npmjs.org'; +const SUCCESS_STATUS = 200; +const NOT_FOUND_STATUS = 404; + +export const npmUtils = { + async getPackageRegistryJsonIfExistsAsync(packageName: string): Promise<PackageRegistryJson | undefined> { + const url = `${NPM_REGISTRY_BASE_URL}/${packageName}`; + const response = await fetch(url); + + if (response.status === NOT_FOUND_STATUS) { + return undefined; + } else if (response.status !== SUCCESS_STATUS) { + throw new Error(`Request to ${url} failed. Check your internet connection and that npmjs.org is up.`); + } + const packageRegistryJson = await response.json(); + return packageRegistryJson; + }, + getPreviouslyPublishedVersions(packageRegistryJson: PackageRegistryJson): string[] { + const timeWithOnlyVersions = _.omit(packageRegistryJson.time, ['modified', 'created']); + const versions = _.keys(timeWithOnlyVersions); + return versions; + }, +}; diff --git a/packages/monorepo-scripts/src/utils/utils.ts b/packages/monorepo-scripts/src/utils/utils.ts index 0b8ac4c0b..20bc57bae 100644 --- a/packages/monorepo-scripts/src/utils/utils.ts +++ b/packages/monorepo-scripts/src/utils/utils.ts @@ -1,27 +1,17 @@ -import * as fs from 'fs'; import lernaGetPackages = require('lerna-get-packages'); import * as _ from 'lodash'; import { exec as execAsync } from 'promisify-child-process'; +import semver = require('semver'); import { constants } from '../constants'; -import { UpdatedPackage } from '../types'; +import { GitTagsByPackageName, UpdatedPackage } from '../types'; + +import { changelogUtils } from './changelog_utils'; export const utils = { log(...args: any[]): void { console.log(...args); // tslint:disable-line:no-console }, - getNextPatchVersion(currentVersion: string): string { - const versionSegments = currentVersion.split('.'); - const patch = _.parseInt(_.last(versionSegments) as string); - const newPatch = patch + 1; - const newPatchVersion = `${versionSegments[0]}.${versionSegments[1]}.${newPatch}`; - return newPatchVersion; - }, - async prettifyAsync(filePath: string, cwd: string): Promise<void> { - await execAsync(`prettier --write ${filePath} --config .prettierrc`, { - cwd, - }); - }, async getUpdatedLernaPackagesAsync(shouldIncludePrivate: boolean): Promise<LernaPackage[]> { const updatedPublicPackages = await this.getLernaUpdatedPackagesAsync(shouldIncludePrivate); const updatedPackageNames = _.map(updatedPublicPackages, pkg => pkg.name); @@ -43,22 +33,86 @@ export const utils = { } return updatedPackages; }, - getChangelogJSONIfExists(changelogPath: string): string | undefined { - try { - const changelogJSON = fs.readFileSync(changelogPath, 'utf-8'); - return changelogJSON; - } catch (err) { - return undefined; + async getNextPackageVersionAsync( + currentVersion: string, + packageName: string, + packageLocation: string, + ): Promise<string> { + let nextVersionIfValid; + const changelog = changelogUtils.getChangelogOrCreateIfMissing(packageName, packageLocation); + if (_.isEmpty(changelog)) { + nextVersionIfValid = semver.inc(currentVersion, 'patch'); + } + const lastEntry = changelog[0]; + nextVersionIfValid = semver.eq(lastEntry.version, currentVersion) + ? semver.inc(currentVersion, 'patch') + : lastEntry.version; + if (_.isNull(nextVersionIfValid)) { + throw new Error(`Encountered invalid semver: ${currentVersion} associated with ${packageName}`); } + return nextVersionIfValid; }, - getChangelogJSONOrCreateIfMissing(changelogPath: string): string { - const changelogIfExists = this.getChangelogJSONIfExists(changelogPath); - if (_.isUndefined(changelogIfExists)) { - // If none exists, create new, empty one. - const emptyChangelogJSON = JSON.stringify([]); - fs.writeFileSync(changelogPath, emptyChangelogJSON); - return emptyChangelogJSON; + async getRemoteGitTagsAsync(): Promise<string[]> { + const result = await execAsync(`git ls-remote --tags`, { + cwd: constants.monorepoRootPath, + }); + const tagsString = result.stdout; + const tagOutputs: string[] = tagsString.split('\n'); + const tags = _.compact( + _.map(tagOutputs, tagOutput => { + const tag = tagOutput.split('refs/tags/')[1]; + // Tags with `^{}` are duplicateous so we ignore them + // Source: https://stackoverflow.com/questions/15472107/when-listing-git-ls-remote-why-theres-after-the-tag-name + if (_.endsWith(tag, '^{}')) { + return undefined; + } + return tag; + }), + ); + return tags; + }, + async getLocalGitTagsAsync(): Promise<string[]> { + const result = await execAsync(`git tags`, { + cwd: constants.monorepoRootPath, + }); + const tagsString = result.stdout; + const tags = tagsString.split('\n'); + return tags; + }, + async getGitTagsByPackageNameAsync(packageNames: string[], gitTags: string[]): Promise<GitTagsByPackageName> { + const tagVersionByPackageName: GitTagsByPackageName = {}; + _.each(gitTags, tag => { + const packageNameIfExists = _.find(packageNames, name => { + return _.includes(tag, `${name}@`); + }); + if (_.isUndefined(packageNameIfExists)) { + return; // ignore tags not related to a package we care about. + } + const splitTag = tag.split(`${packageNameIfExists}@`); + if (splitTag.length !== 2) { + throw new Error(`Unexpected tag name found: ${tag}`); + } + const version = splitTag[1]; + (tagVersionByPackageName[packageNameIfExists] || (tagVersionByPackageName[packageNameIfExists] = [])).push( + version, + ); + }); + return tagVersionByPackageName; + }, + async removeLocalTagAsync(tagName: string): Promise<void> { + const result = await execAsync(`git tag -d ${tagName}`, { + cwd: constants.monorepoRootPath, + }); + if (!_.isEmpty(result.stderr)) { + throw new Error(`Failed to delete local git tag. Got err: ${result.stderr}`); + } + }, + async removeRemoteTagAsync(tagName: string): Promise<void> { + const result = await execAsync(`git push origin ${tagName}`, { + cwd: constants.monorepoRootPath, + }); + if (!_.isEmpty(result.stderr)) { + throw new Error(`Failed to delete remote git tag. Got err: ${result.stderr}`); } - return changelogIfExists; }, }; diff --git a/packages/order-utils/CHANGELOG.json b/packages/order-utils/CHANGELOG.json index f3c54711f..6290eee0f 100644 --- a/packages/order-utils/CHANGELOG.json +++ b/packages/order-utils/CHANGELOG.json @@ -1,18 +1,19 @@ [ { + "timestamp": 1529397769, + "version": "0.0.7", "changes": [ { - "note": "Export parseECSignature method", - "pr": 684 + "note": "Dependencies updated" } ] }, { - "version": "0.1.0", + "timestamp": 1527616612, + "version": "0.0.6", "changes": [ { - "note": "Make order-utils compatible with V2 of 0x protocol", - "pr": 636 + "note": "Dependencies updated" } ] }, diff --git a/packages/order-utils/CHANGELOG.md b/packages/order-utils/CHANGELOG.md index 5b10c13bc..81b66373a 100644 --- a/packages/order-utils/CHANGELOG.md +++ b/packages/order-utils/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.0.7 - _June 19, 2018_ + + * Dependencies updated + +## v0.0.6 - _May 29, 2018_ + + * Dependencies updated + ## v0.0.5 - _May 22, 2018_ * Add orderStateUtils, a module for computing order state needed to decide if an order is still valid -## v0.0.4 - _May 4, 2018_ +## v0.0.4 - _May 5, 2018_ * Dependencies updated diff --git a/packages/order-utils/package.json b/packages/order-utils/package.json index 8f37bb138..bd18b7855 100644 --- a/packages/order-utils/package.json +++ b/packages/order-utils/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/order-utils", - "version": "0.0.6", + "version": "1.0.0", "engines": { "node": ">=6.12" }, @@ -51,10 +51,10 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/order-utils/README.md", "devDependencies": { - "@0xproject/dev-utils": "^0.4.2", - "@0xproject/migrations": "^0.0.6", - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/dev-utils": "^0.4.4", + "@0xproject/migrations": "^0.0.8", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "@types/ethereumjs-abi": "^0.6.0", "@types/bn.js": "^4.11.0", "@types/lodash": "4.14.104", @@ -73,20 +73,20 @@ "typescript": "2.7.1" }, "dependencies": { - "@0xproject/assert": "^0.2.10", - "@0xproject/base-contract": "^0.3.2", + "@0xproject/assert": "^0.2.12", + "@0xproject/base-contract": "^0.3.4", "@0xproject/json-schemas": "1.0.0", - "@0xproject/sol-compiler": "^0.5.0", + "@0xproject/sol-compiler": "^0.5.2", "@0xproject/types": "^1.0.0", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", - "@0xproject/web3-wrapper": "^0.6.4", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", + "@0xproject/web3-wrapper": "^0.7.1", "@types/node": "^8.0.53", "bn.js": "^4.11.8", "ethereum-types": "^0.0.1", "ethereumjs-abi": "^0.6.4", "ethereumjs-util": "^5.1.1", - "ethers": "^3.0.15", + "ethers": "3.0.22", "lodash": "^4.17.4" }, "publishConfig": { diff --git a/packages/order-watcher/CHANGELOG.json b/packages/order-watcher/CHANGELOG.json index dde78445a..4afd4b9b5 100644 --- a/packages/order-watcher/CHANGELOG.json +++ b/packages/order-watcher/CHANGELOG.json @@ -1,5 +1,41 @@ [ { + "timestamp": 1529397769, + "version": "0.0.6", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1527617805, + "version": "0.0.5", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1527617227, + "version": "0.0.4", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1527616612, + "version": "0.0.3", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { "timestamp": 1527008794, "version": "0.0.2", "changes": [ diff --git a/packages/order-watcher/CHANGELOG.md b/packages/order-watcher/CHANGELOG.md index 999d62f44..5e216f90c 100644 --- a/packages/order-watcher/CHANGELOG.md +++ b/packages/order-watcher/CHANGELOG.md @@ -5,6 +5,22 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.0.6 - _June 19, 2018_ + + * Dependencies updated + +## v0.0.5 - _May 29, 2018_ + + * Dependencies updated + +## v0.0.4 - _May 29, 2018_ + + * Dependencies updated + +## v0.0.3 - _May 29, 2018_ + + * Dependencies updated + ## v0.0.2 - _May 22, 2018_ * Dependencies updated diff --git a/packages/order-watcher/package.json b/packages/order-watcher/package.json index 2e5dfb094..c407d25bd 100644 --- a/packages/order-watcher/package.json +++ b/packages/order-watcher/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/order-watcher", - "version": "0.0.2", + "version": "0.0.6", "description": "An order watcher daemon that watches for order validity", "keywords": [ "0x", @@ -47,12 +47,12 @@ "node": ">=6.0.0" }, "devDependencies": { - "@0xproject/abi-gen": "^0.3.0", - "@0xproject/dev-utils": "^0.4.2", - "@0xproject/migrations": "^0.0.6", - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/sol-compiler": "^0.5.0", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/abi-gen": "^0.3.2", + "@0xproject/dev-utils": "^0.4.4", + "@0xproject/migrations": "^0.0.8", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/sol-compiler": "^0.5.2", + "@0xproject/tslint-config": "^0.4.20", "@types/bintrees": "^1.0.2", "@types/lodash": "4.14.104", "@types/mocha": "^2.2.42", @@ -77,19 +77,19 @@ "typescript": "2.7.1" }, "dependencies": { - "@0xproject/assert": "^0.2.10", - "@0xproject/base-contract": "^0.3.2", - "@0xproject/contract-wrappers": "^0.0.2", - "@0xproject/fill-scenarios": "^0.0.2", - "@0xproject/json-schemas": "0.7.22", - "@0xproject/order-utils": "0.0.5", - "@0xproject/types": "0.7.0", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", - "@0xproject/web3-wrapper": "^0.6.4", + "@0xproject/assert": "^0.2.12", + "@0xproject/base-contract": "^0.3.4", + "@0xproject/contract-wrappers": "^0.0.5", + "@0xproject/fill-scenarios": "^0.0.4", + "@0xproject/json-schemas": "0.8.1", + "@0xproject/order-utils": "^0.0.7", + "@0xproject/types": "^0.8.1", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", + "@0xproject/web3-wrapper": "^0.7.1", "ethereum-types": "^0.0.1", "bintrees": "^1.0.2", - "ethers": "^3.0.15", + "ethers": "3.0.22", "lodash": "^4.17.4" }, "publishConfig": { diff --git a/packages/react-docs-example/package.json b/packages/react-docs-example/package.json index 76e780c44..3a743df77 100644 --- a/packages/react-docs-example/package.json +++ b/packages/react-docs-example/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@0xproject/react-docs-example", - "version": "0.0.12", + "version": "0.0.13", "engines": { "node": ">=6.12" }, @@ -26,7 +26,7 @@ "url": "https://github.com/0xProject/0x-monorepo.git" }, "devDependencies": { - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/tslint-config": "^0.4.20", "@types/lodash": "4.14.104", "@types/material-ui": "0.18.0", "@types/node": "^8.0.53", @@ -50,7 +50,7 @@ "webpack-dev-server": "^2.11.1" }, "dependencies": { - "@0xproject/react-docs": "^0.0.12", + "@0xproject/react-docs": "^0.0.14", "basscss": "^8.0.3", "lodash": "^4.17.4", "material-ui": "^0.17.1", diff --git a/packages/react-docs/CHANGELOG.json b/packages/react-docs/CHANGELOG.json index 32fa49264..30e48197d 100644 --- a/packages/react-docs/CHANGELOG.json +++ b/packages/react-docs/CHANGELOG.json @@ -1,5 +1,23 @@ [ { + "timestamp": 1529397769, + "version": "0.0.14", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "version": "0.0.13", + "changes": [ + { + "note": "Incorrect publish that was unpublished" + } + ], + "timestamp": 1527810075 + }, + { "timestamp": 1527009133, "version": "0.0.12", "changes": [ diff --git a/packages/react-docs/CHANGELOG.md b/packages/react-docs/CHANGELOG.md index e46198f6c..fcbf3698b 100644 --- a/packages/react-docs/CHANGELOG.md +++ b/packages/react-docs/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.0.14 - _June 19, 2018_ + + * Dependencies updated + +## v0.0.13 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.0.12 - _May 22, 2018_ * Dependencies updated -## v0.0.11 - _May 4, 2018_ +## v0.0.11 - _May 5, 2018_ * Dependencies updated diff --git a/packages/react-docs/package.json b/packages/react-docs/package.json index 5e8492d25..8c70f4f6d 100644 --- a/packages/react-docs/package.json +++ b/packages/react-docs/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/react-docs", - "version": "0.0.12", + "version": "0.0.14", "engines": { "node": ">=6.12" }, @@ -25,9 +25,9 @@ "url": "https://github.com/0xProject/0x-monorepo.git" }, "devDependencies": { - "@0xproject/dev-utils": "^0.4.2", - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/dev-utils": "^0.4.4", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "@types/compare-versions": "^3.0.0", "copyfiles": "^1.2.0", "make-promises-safe": "^1.1.0", @@ -36,8 +36,8 @@ "typescript": "2.7.1" }, "dependencies": { - "@0xproject/react-shared": "^0.1.7", - "@0xproject/utils": "^0.6.2", + "@0xproject/react-shared": "^0.2.1", + "@0xproject/utils": "^0.7.1", "@types/lodash": "4.14.104", "@types/material-ui": "0.18.0", "@types/node": "^8.0.53", diff --git a/packages/react-shared/CHANGELOG.json b/packages/react-shared/CHANGELOG.json index 5227bbf72..deee2c6e6 100644 --- a/packages/react-shared/CHANGELOG.json +++ b/packages/react-shared/CHANGELOG.json @@ -1,7 +1,15 @@ [ { - "timestamp": 1527009133, - "version": "0.1.7", + "timestamp": 1529397769, + "version": "0.2.1", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "version": "0.2.0", "changes": [ { "note": "Dependencies updated" diff --git a/packages/react-shared/CHANGELOG.md b/packages/react-shared/CHANGELOG.md index 68eac96cf..b28923eec 100644 --- a/packages/react-shared/CHANGELOG.md +++ b/packages/react-shared/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.2.1 - _June 19, 2018_ + + * Dependencies updated + +## v0.2.0 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.1.7 - _May 22, 2018_ * Dependencies updated -## v0.1.6 - _May 4, 2018_ +## v0.1.6 - _May 5, 2018_ * Dependencies updated diff --git a/packages/react-shared/package.json b/packages/react-shared/package.json index d6f748580..b2ba67ed3 100644 --- a/packages/react-shared/package.json +++ b/packages/react-shared/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/react-shared", - "version": "0.1.7", + "version": "0.2.1", "engines": { "node": ">=6.12" }, @@ -25,9 +25,9 @@ "url": "https://github.com/0xProject/0x-monorepo.git" }, "devDependencies": { - "@0xproject/dev-utils": "^0.4.2", - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/dev-utils": "^0.4.4", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "copyfiles": "^1.2.0", "make-promises-safe": "^1.1.0", "shx": "^0.2.2", diff --git a/packages/sol-compiler/CHANGELOG.json b/packages/sol-compiler/CHANGELOG.json index e0ebd3a2d..bb1a5f006 100644 --- a/packages/sol-compiler/CHANGELOG.json +++ b/packages/sol-compiler/CHANGELOG.json @@ -1,5 +1,14 @@ [ { + "timestamp": 1529397769, + "version": "0.5.2", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { "version": "0.5.1", "changes": [ { diff --git a/packages/sol-compiler/CHANGELOG.md b/packages/sol-compiler/CHANGELOG.md index ee9b53f4e..524a361de 100644 --- a/packages/sol-compiler/CHANGELOG.md +++ b/packages/sol-compiler/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.5.2 - _June 19, 2018_ + + * Dependencies updated + +## v0.5.1 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.5.0 - _May 22, 2018_ * Properly export the executable binary (#588) -## v0.4.3 - _May 4, 2018_ +## v0.4.3 - _May 5, 2018_ * Dependencies updated diff --git a/packages/sol-compiler/package.json b/packages/sol-compiler/package.json index 14eba283f..deeed8299 100644 --- a/packages/sol-compiler/package.json +++ b/packages/sol-compiler/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/sol-compiler", - "version": "0.5.0", + "version": "0.5.2", "engines": { "node": ">=6.12" }, @@ -53,9 +53,9 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/sol-compiler/README.md", "devDependencies": { - "@0xproject/dev-utils": "^0.4.2", - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/dev-utils": "^0.4.4", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "@types/mkdirp": "^0.5.2", "@types/require-from-string": "^1.2.0", "@types/semver": "^5.5.0", @@ -76,13 +76,13 @@ "zeppelin-solidity": "1.8.0" }, "dependencies": { - "@0xproject/assert": "0.2.10", - "@0xproject/json-schemas": "0.7.22", - "@0xproject/sol-resolver": "^0.0.5", - "@0xproject/types": "^0.7.0", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", - "@0xproject/web3-wrapper": "^0.6.4", + "@0xproject/assert": "0.2.12", + "@0xproject/json-schemas": "0.8.1", + "@0xproject/sol-resolver": "^0.0.7", + "@0xproject/types": "^0.8.1", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", + "@0xproject/web3-wrapper": "^0.7.1", "@types/yargs": "^11.0.0", "ethereum-types": "^0.0.1", "chalk": "^2.3.0", diff --git a/packages/sol-cov/CHANGELOG.json b/packages/sol-cov/CHANGELOG.json index 7e934ad6e..464a5a13c 100644 --- a/packages/sol-cov/CHANGELOG.json +++ b/packages/sol-cov/CHANGELOG.json @@ -1,81 +1,24 @@ [ { - "version": "0.2.0", + "timestamp": 1529397769, + "version": "0.1.1", "changes": [ { - "note": "Fixed a bug causing RegExp to crash if contract code is longer that 32767 characters", - "pr": 675 - }, - { - "note": "Fixed a bug caused by Geth debug trace depth being 1-indexed", - "pr": 675 - }, - { - "note": "Fixed a bug when the tool crashed on empty traces", - "pr": 675 - }, - { - "note": "Use `BlockchainLifecycle` to support reverts on Geth", - "pr": 675 - }, - { - "note": "Add `ProfilerSubprovider` as a hacky way to profile code using coverage tools", - "pr": 675 - }, - { - "note": "Collect traces from `estimate_gas` calls", - "pr": 675 - }, - { - "note": "Fix a race condition caused by not awaiting the transaction before getting a trace", - "pr": 675 - }, - { - "note": "Add `start`/`stop` functionality to `CoverageSubprovider` and `ProfilerSubprovider`", - "pr": 675 - }, - { - "note": "Skip interface artifacts with a warning instead of failing", - "pr": 675 - }, - { - "note": "Fix solcVersion regex in parameter validation", - "pr": 690 - }, - { - "note": "Fix a bug when in TruffleArtifactsAdapter causing it to throw if compiler.json is not there", - "pr": 690 - }, - { - "note": "HUGE perf improvements", - "pr": 690 + "note": "Dependencies updated" } ] }, { - "timestamp": 1527009134, "version": "0.1.0", "changes": [ { - "note": "Add artifact adapter as a parameter for CoverageSubprovider. Export AbstractArtifactAdapter", - "pr": 589 - }, - { - "note": "Implement SolCompilerArtifactAdapter and TruffleArtifactAdapter", - "pr": 589 - }, - { - "note": "Properly parse multi-level traces", - "pr": 589 - }, - { - "note": "Add support for solidity libraries", - "pr": 589 + "note": "Incorrect publish that was unpublished" } - ] + ], + "timestamp": 1527810075 }, { - "timestamp": 1527009133, + "timestamp": 1527009134, "version": "0.0.11", "changes": [ { diff --git a/packages/sol-cov/CHANGELOG.md b/packages/sol-cov/CHANGELOG.md index f0312d297..d8f7c5310 100644 --- a/packages/sol-cov/CHANGELOG.md +++ b/packages/sol-cov/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.1.1 - _June 19, 2018_ + + * Dependencies updated + +## v0.1.0 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.0.11 - _May 22, 2018_ * Dependencies updated -## v0.0.10 - _May 4, 2018_ +## v0.0.10 - _May 5, 2018_ * Dependencies updated diff --git a/packages/sol-cov/package.json b/packages/sol-cov/package.json index 1d9d7f94d..39618eacf 100644 --- a/packages/sol-cov/package.json +++ b/packages/sol-cov/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/sol-cov", - "version": "0.0.11", + "version": "0.1.1", "engines": { "node": ">=6.12" }, @@ -50,12 +50,12 @@ }, "homepage": "https://github.com/0xProject/0x.js/packages/sol-cov/README.md", "dependencies": { - "@0xproject/sol-compiler": "^0.5.0", - "@0xproject/subproviders": "^0.10.2", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", - "@0xproject/web3-wrapper": "^0.6.4", - "@0xproject/dev-utils": "^0.4.2", + "@0xproject/sol-compiler": "^0.5.2", + "@0xproject/subproviders": "^0.10.4", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", + "@0xproject/web3-wrapper": "^0.7.1", + "@0xproject/dev-utils": "^0.4.4", "ethereum-types": "^0.0.1", "ethereumjs-util": "^5.1.1", "glob": "^7.1.2", @@ -68,8 +68,8 @@ "solidity-parser-antlr": "^0.2.12" }, "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "@types/istanbul": "^0.4.30", "@types/loglevel": "^1.5.3", "@types/mkdirp": "^0.5.1", diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts index 0fa7f873e..065a48434 100644 --- a/packages/sol-cov/src/coverage_subprovider.ts +++ b/packages/sol-cov/src/coverage_subprovider.ts @@ -2,8 +2,8 @@ import * as _ from 'lodash'; import { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_adapter'; import { collectCoverageEntries } from './collect_coverage_entries'; -import { TraceCollectionSubprovider } from './trace_collection_subprovider'; import { SingleFileSubtraceHandler, TraceCollector } from './trace_collector'; +import { TraceInfoSubprovider } from './trace_info_subprovider'; import { BranchCoverage, ContractData, @@ -22,7 +22,7 @@ import { utils } from './utils'; * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. * It's used to compute your code coverage while running solidity tests. */ -export class CoverageSubprovider extends TraceCollectionSubprovider { +export class CoverageSubprovider extends TraceInfoSubprovider { private _coverageCollector: TraceCollector; /** * Instantiates a CoverageSubprovider instance @@ -39,7 +39,7 @@ export class CoverageSubprovider extends TraceCollectionSubprovider { super(defaultFromAddress, traceCollectionSubproviderConfig); this._coverageCollector = new TraceCollector(artifactAdapter, isVerbose, coverageHandler); } - public async handleTraceInfoAsync(traceInfo: TraceInfo): Promise<void> { + protected async _handleTraceInfoAsync(traceInfo: TraceInfo): Promise<void> { await this._coverageCollector.computeSingleTraceCoverageAsync(traceInfo); } /** diff --git a/packages/sol-cov/src/index.ts b/packages/sol-cov/src/index.ts index 10f6d9597..003a27374 100644 --- a/packages/sol-cov/src/index.ts +++ b/packages/sol-cov/src/index.ts @@ -1,6 +1,7 @@ export { CoverageSubprovider } from './coverage_subprovider'; // HACK: ProfilerSubprovider is a hacky way to do profiling using coverage tools. Not production ready export { ProfilerSubprovider } from './profiler_subprovider'; +export { RevertTraceSubprovider } from './revert_trace_subprovider'; export { SolCompilerArtifactAdapter } from './artifact_adapters/sol_compiler_artifact_adapter'; export { TruffleArtifactAdapter } from './artifact_adapters/truffle_artifact_adapter'; export { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_adapter'; diff --git a/packages/sol-cov/src/profiler_subprovider.ts b/packages/sol-cov/src/profiler_subprovider.ts index 62ed1b472..9f98da524 100644 --- a/packages/sol-cov/src/profiler_subprovider.ts +++ b/packages/sol-cov/src/profiler_subprovider.ts @@ -2,8 +2,8 @@ import * as _ from 'lodash'; import { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_adapter'; import { collectCoverageEntries } from './collect_coverage_entries'; -import { TraceCollectionSubprovider } from './trace_collection_subprovider'; import { SingleFileSubtraceHandler, TraceCollector } from './trace_collector'; +import { TraceInfoSubprovider } from './trace_info_subprovider'; import { ContractData, Coverage, SourceRange, Subtrace, TraceInfo } from './types'; import { utils } from './utils'; @@ -11,7 +11,7 @@ import { utils } from './utils'; * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. * ProfilerSubprovider is used to profile Solidity code while running tests. */ -export class ProfilerSubprovider extends TraceCollectionSubprovider { +export class ProfilerSubprovider extends TraceInfoSubprovider { private _profilerCollector: TraceCollector; /** * Instantiates a ProfilerSubprovider instance @@ -28,7 +28,7 @@ export class ProfilerSubprovider extends TraceCollectionSubprovider { super(defaultFromAddress, traceCollectionSubproviderConfig); this._profilerCollector = new TraceCollector(artifactAdapter, isVerbose, profilerHandler); } - public async handleTraceInfoAsync(traceInfo: TraceInfo): Promise<void> { + protected async _handleTraceInfoAsync(traceInfo: TraceInfo): Promise<void> { await this._profilerCollector.computeSingleTraceCoverageAsync(traceInfo); } /** diff --git a/packages/sol-cov/src/revert_trace.ts b/packages/sol-cov/src/revert_trace.ts new file mode 100644 index 000000000..a78d1afa8 --- /dev/null +++ b/packages/sol-cov/src/revert_trace.ts @@ -0,0 +1,90 @@ +import { logUtils } from '@0xproject/utils'; +import { OpCode, StructLog } from 'ethereum-types'; + +import * as _ from 'lodash'; + +import { EvmCallStack } from './types'; +import { utils } from './utils'; + +export function getRevertTrace(structLogs: StructLog[], startAddress: string): EvmCallStack { + const evmCallStack: EvmCallStack = []; + const addressStack = [startAddress]; + if (_.isEmpty(structLogs)) { + return []; + } + const normalizedStructLogs = utils.normalizeStructLogs(structLogs); + // tslint:disable-next-line:prefer-for-of + for (let i = 0; i < normalizedStructLogs.length; i++) { + const structLog = normalizedStructLogs[i]; + if (structLog.depth !== addressStack.length - 1) { + throw new Error("Malformed trace. Trace depth doesn't match call stack depth"); + } + // After that check we have a guarantee that call stack is never empty + // If it would: callStack.length - 1 === structLog.depth === -1 + // That means that we can always safely pop from it + + if (utils.isCallLike(structLog.op)) { + const currentAddress = _.last(addressStack) as string; + const jumpAddressOffset = 1; + const newAddress = utils.getAddressFromStackEntry( + structLog.stack[structLog.stack.length - jumpAddressOffset - 1], + ); + + // Sometimes calls don't change the execution context (current address). When we do a transfer to an + // externally owned account - it does the call and immediately returns because there is no fallback + // function. We manually check if the call depth had changed to handle that case. + const nextStructLog = normalizedStructLogs[i + 1]; + if (nextStructLog.depth !== structLog.depth) { + addressStack.push(newAddress); + evmCallStack.push({ + address: currentAddress, + structLog, + }); + } + } else if (utils.isEndOpcode(structLog.op) && structLog.op !== OpCode.Revert) { + // Just like with calls, sometimes returns/stops don't change the execution context (current address). + const nextStructLog = normalizedStructLogs[i + 1]; + if (_.isUndefined(nextStructLog) || nextStructLog.depth !== structLog.depth) { + evmCallStack.pop(); + addressStack.pop(); + } + if (structLog.op === OpCode.SelfDestruct) { + // After contract execution, we look at all sub-calls to external contracts, and for each one, fetch + // the bytecode and compute the coverage for the call. If the contract is destroyed with a call + // to `selfdestruct`, we are unable to fetch it's bytecode and compute coverage. + // TODO: Refactor this logic to fetch the sub-called contract bytecode before the selfdestruct is called + // in order to handle this edge-case. + logUtils.warn( + "Detected a selfdestruct. Sol-cov currently doesn't support that scenario. We'll just skip the trace part for a destructed contract", + ); + } + } else if (structLog.op === OpCode.Revert) { + evmCallStack.push({ + address: _.last(addressStack) as string, + structLog, + }); + return evmCallStack; + } else if (structLog.op === OpCode.Create) { + // TODO: Extract the new contract address from the stack and handle that scenario + logUtils.warn( + "Detected a contract created from within another contract. Sol-cov currently doesn't support that scenario. We'll just skip that trace", + ); + return []; + } else { + if (structLog !== _.last(normalizedStructLogs)) { + const nextStructLog = normalizedStructLogs[i + 1]; + if (nextStructLog.depth === structLog.depth) { + continue; + } else if (nextStructLog.depth === structLog.depth - 1) { + addressStack.pop(); + } else { + throw new Error('Malformed trace. Unexpected call depth change'); + } + } + } + } + if (evmCallStack.length !== 0) { + logUtils.warn('Malformed trace. Call stack non empty at the end. (probably out of gas)'); + } + return []; +} diff --git a/packages/sol-cov/src/revert_trace_subprovider.ts b/packages/sol-cov/src/revert_trace_subprovider.ts new file mode 100644 index 000000000..b1d4da10c --- /dev/null +++ b/packages/sol-cov/src/revert_trace_subprovider.ts @@ -0,0 +1,114 @@ +import { stripHexPrefix } from 'ethereumjs-util'; +import * as _ from 'lodash'; +import { getLogger, levels, Logger } from 'loglevel'; + +import { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_adapter'; +import { constants } from './constants'; +import { getRevertTrace } from './revert_trace'; +import { parseSourceMap } from './source_maps'; +import { TraceCollectionSubprovider } from './trace_collection_subprovider'; +import { ContractData, EvmCallStack, SourceRange } from './types'; +import { utils } from './utils'; + +/** + * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. + * It is used to report call stack traces whenever a revert occurs. + */ +export class RevertTraceSubprovider extends TraceCollectionSubprovider { + // Lock is used to not accept normal transactions while doing call/snapshot magic because they'll be reverted later otherwise + private _contractsData!: ContractData[]; + private _artifactAdapter: AbstractArtifactAdapter; + private _logger: Logger; + + /** + * Instantiates a RevertTraceSubprovider instance + * @param artifactAdapter Adapter for used artifacts format (0x, truffle, giveth, etc.) + * @param defaultFromAddress default from address to use when sending transactions + * @param isVerbose If true, we will log any unknown transactions. Otherwise we will ignore them + */ + constructor(artifactAdapter: AbstractArtifactAdapter, defaultFromAddress: string, isVerbose: boolean = true) { + const traceCollectionSubproviderConfig = { + shouldCollectTransactionTraces: true, + shouldCollectGasEstimateTraces: true, + shouldCollectCallTraces: true, + }; + super(defaultFromAddress, traceCollectionSubproviderConfig); + this._artifactAdapter = artifactAdapter; + this._logger = getLogger('sol-cov'); + this._logger.setLevel(isVerbose ? levels.TRACE : levels.ERROR); + } + // tslint:disable-next-line:no-unused-variable + protected async _recordTxTraceAsync(address: string, data: string | undefined, txHash: string): Promise<void> { + await this._web3Wrapper.awaitTransactionMinedAsync(txHash, 0); + const trace = await this._web3Wrapper.getTransactionTraceAsync(txHash, { + disableMemory: true, + disableStack: false, + disableStorage: true, + }); + const evmCallStack = getRevertTrace(trace.structLogs, address); + if (evmCallStack.length > 0) { + // if getRevertTrace returns a call stack it means there was a + // revert. + await this._printStackTraceAsync(evmCallStack); + } + } + private async _printStackTraceAsync(evmCallStack: EvmCallStack): Promise<void> { + const sourceRanges: SourceRange[] = []; + if (_.isUndefined(this._contractsData)) { + this._contractsData = await this._artifactAdapter.collectContractsDataAsync(); + } + for (const evmCallStackEntry of evmCallStack) { + const isContractCreation = evmCallStackEntry.address === constants.NEW_CONTRACT; + if (isContractCreation) { + this._logger.error('Contract creation not supported'); + continue; + } + const bytecode = await this._web3Wrapper.getContractCodeAsync(evmCallStackEntry.address); + const contractData = utils.getContractDataIfExists(this._contractsData, bytecode); + if (_.isUndefined(contractData)) { + const errMsg = isContractCreation + ? `Unknown contract creation transaction` + : `Transaction to an unknown address: ${evmCallStackEntry.address}`; + this._logger.warn(errMsg); + continue; + } + const bytecodeHex = stripHexPrefix(bytecode); + const sourceMap = isContractCreation ? contractData.sourceMap : contractData.sourceMapRuntime; + const pcToSourceRange = parseSourceMap( + contractData.sourceCodes, + sourceMap, + bytecodeHex, + contractData.sources, + ); + // tslint:disable-next-line:no-unnecessary-initializer + let sourceRange: SourceRange | undefined = undefined; + let pc = evmCallStackEntry.structLog.pc; + // Sometimes there is not a mapping for this pc (e.g. if the revert + // actually happens in assembly). In that case, we want to keep + // searching backwards by decrementing the pc until we find a + // mapped source range. + while (_.isUndefined(sourceRange)) { + sourceRange = pcToSourceRange[pc]; + pc -= 1; + if (pc <= 0) { + this._logger.warn( + `could not find matching sourceRange for structLog: ${evmCallStackEntry.structLog}`, + ); + continue; + } + } + sourceRanges.push(sourceRange); + } + if (sourceRanges.length > 0) { + this._logger.error('\n\nStack trace for REVERT:\n'); + _.forEach(_.reverse(sourceRanges), sourceRange => { + this._logger.error( + `${sourceRange.fileName}:${sourceRange.location.start.line}:${sourceRange.location.start.column}`, + ); + }); + this._logger.error('\n'); + } else { + this._logger.error('Could not determine stack trace'); + } + } +} diff --git a/packages/sol-cov/src/trace.ts b/packages/sol-cov/src/trace.ts index 45e45e9c5..635019fc0 100644 --- a/packages/sol-cov/src/trace.ts +++ b/packages/sol-cov/src/trace.ts @@ -1,32 +1,25 @@ -import { addressUtils, BigNumber, logUtils } from '@0xproject/utils'; +import { logUtils } from '@0xproject/utils'; import { OpCode, StructLog } from 'ethereum-types'; -import { addHexPrefix } from 'ethereumjs-util'; import * as _ from 'lodash'; +import { utils } from './utils'; + export interface TraceByContractAddress { [contractAddress: string]: StructLog[]; } -function getAddressFromStackEntry(stackEntry: string): string { - const hexBase = 16; - return addressUtils.padZeros(new BigNumber(addHexPrefix(stackEntry)).toString(hexBase)); -} - export function getTracesByContractAddress(structLogs: StructLog[], startAddress: string): TraceByContractAddress { const traceByContractAddress: TraceByContractAddress = {}; let currentTraceSegment = []; - const callStack = [startAddress]; + const addressStack = [startAddress]; if (_.isEmpty(structLogs)) { return traceByContractAddress; } - if (structLogs[0].depth === 1) { - // Geth uses 1-indexed depth counter whilst ganache starts from 0 - _.forEach(structLogs, structLog => structLog.depth--); - } + const normalizedStructLogs = utils.normalizeStructLogs(structLogs); // tslint:disable-next-line:prefer-for-of - for (let i = 0; i < structLogs.length; i++) { - const structLog = structLogs[i]; - if (structLog.depth !== callStack.length - 1) { + for (let i = 0; i < normalizedStructLogs.length; i++) { + const structLog = normalizedStructLogs[i]; + if (structLog.depth !== addressStack.length - 1) { throw new Error("Malformed trace. Trace depth doesn't match call stack depth"); } // After that check we have a guarantee that call stack is never empty @@ -34,36 +27,26 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress // That means that we can always safely pop from it currentTraceSegment.push(structLog); - const isCallLike = _.includes( - [OpCode.CallCode, OpCode.StaticCall, OpCode.Call, OpCode.DelegateCall], - structLog.op, - ); - const isEndOpcode = _.includes( - [OpCode.Return, OpCode.Stop, OpCode.Revert, OpCode.Invalid, OpCode.SelfDestruct], - structLog.op, - ); - if (isCallLike) { - const currentAddress = _.last(callStack) as string; + if (utils.isCallLike(structLog.op)) { + const currentAddress = _.last(addressStack) as string; const jumpAddressOffset = 1; - const newAddress = getAddressFromStackEntry( + const newAddress = utils.getAddressFromStackEntry( structLog.stack[structLog.stack.length - jumpAddressOffset - 1], ); - if (structLog === _.last(structLogs)) { - throw new Error('Malformed trace. CALL-like opcode can not be the last one'); - } + // Sometimes calls don't change the execution context (current address). When we do a transfer to an // externally owned account - it does the call and immediately returns because there is no fallback // function. We manually check if the call depth had changed to handle that case. - const nextStructLog = structLogs[i + 1]; + const nextStructLog = normalizedStructLogs[i + 1]; if (nextStructLog.depth !== structLog.depth) { - callStack.push(newAddress); + addressStack.push(newAddress); traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( currentTraceSegment, ); currentTraceSegment = []; } - } else if (isEndOpcode) { - const currentAddress = callStack.pop() as string; + } else if (utils.isEndOpcode(structLog.op)) { + const currentAddress = addressStack.pop() as string; traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( currentTraceSegment, ); @@ -85,12 +68,12 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress ); return traceByContractAddress; } else { - if (structLog !== _.last(structLogs)) { - const nextStructLog = structLogs[i + 1]; + if (structLog !== _.last(normalizedStructLogs)) { + const nextStructLog = normalizedStructLogs[i + 1]; if (nextStructLog.depth === structLog.depth) { continue; } else if (nextStructLog.depth === structLog.depth - 1) { - const currentAddress = callStack.pop() as string; + const currentAddress = addressStack.pop() as string; traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( currentTraceSegment, ); @@ -101,11 +84,11 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress } } } - if (callStack.length !== 0) { + if (addressStack.length !== 0) { logUtils.warn('Malformed trace. Call stack non empty at the end'); } if (currentTraceSegment.length !== 0) { - const currentAddress = callStack.pop() as string; + const currentAddress = addressStack.pop() as string; traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( currentTraceSegment, ); diff --git a/packages/sol-cov/src/trace_collection_subprovider.ts b/packages/sol-cov/src/trace_collection_subprovider.ts index 742735935..9866472b9 100644 --- a/packages/sol-cov/src/trace_collection_subprovider.ts +++ b/packages/sol-cov/src/trace_collection_subprovider.ts @@ -6,8 +6,7 @@ import * as _ from 'lodash'; import { Lock } from 'semaphore-async-await'; import { constants } from './constants'; -import { getTracesByContractAddress } from './trace'; -import { BlockParamLiteral, TraceInfo, TraceInfoExistingContract, TraceInfoNewContract } from './types'; +import { BlockParamLiteral } from './types'; interface MaybeFakeTxData extends TxData { isFakeTransaction?: boolean; @@ -27,13 +26,14 @@ export interface TraceCollectionSubproviderConfig { /** * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface. - * It collects traces of all transactions that were sent and all calls that were executed through JSON RPC. + * It collects traces of all transactions that were sent and all calls that were executed through JSON RPC. It must + * be extended by implementing the _recordTxTraceAsync method which is called for every transaction. */ export abstract class TraceCollectionSubprovider extends Subprovider { + protected _web3Wrapper!: Web3Wrapper; // Lock is used to not accept normal transactions while doing call/snapshot magic because they'll be reverted later otherwise private _lock = new Lock(); private _defaultFromAddress: string; - private _web3Wrapper!: Web3Wrapper; private _isEnabled = true; private _config: TraceCollectionSubproviderConfig; /** @@ -58,11 +58,6 @@ export abstract class TraceCollectionSubprovider extends Subprovider { this._isEnabled = false; } /** - * Called for each subtrace. - * @param traceInfo Trace info for this subtrace. - */ - public abstract handleTraceInfoAsync(traceInfo: TraceInfo): Promise<void>; - /** * This method conforms to the web3-provider-engine interface. * It is called internally by the ProviderEngine when it is this subproviders * turn to handle a JSON RPC request. @@ -119,6 +114,11 @@ export abstract class TraceCollectionSubprovider extends Subprovider { super.setEngine(engine); this._web3Wrapper = new Web3Wrapper(engine); } + protected abstract async _recordTxTraceAsync( + address: string, + data: string | undefined, + txHash: string, + ): Promise<void>; private async _onTransactionSentAsync( txData: MaybeFakeTxData, err: Error | null, @@ -160,52 +160,6 @@ export abstract class TraceCollectionSubprovider extends Subprovider { await this._recordCallOrGasEstimateTraceAsync(callData); cb(); } - private async _recordTxTraceAsync(address: string, data: string | undefined, txHash: string): Promise<void> { - await this._web3Wrapper.awaitTransactionMinedAsync(txHash, 0); - const trace = await this._web3Wrapper.getTransactionTraceAsync(txHash, { - disableMemory: true, - disableStack: false, - disableStorage: true, - }); - const tracesByContractAddress = getTracesByContractAddress(trace.structLogs, address); - const subcallAddresses = _.keys(tracesByContractAddress); - if (address === constants.NEW_CONTRACT) { - for (const subcallAddress of subcallAddresses) { - let traceInfo: TraceInfoNewContract | TraceInfoExistingContract; - if (subcallAddress === 'NEW_CONTRACT') { - const traceForThatSubcall = tracesByContractAddress[subcallAddress]; - traceInfo = { - subtrace: traceForThatSubcall, - txHash, - address: subcallAddress, - bytecode: data as string, - }; - } else { - const runtimeBytecode = await this._web3Wrapper.getContractCodeAsync(subcallAddress); - const traceForThatSubcall = tracesByContractAddress[subcallAddress]; - traceInfo = { - subtrace: traceForThatSubcall, - txHash, - address: subcallAddress, - runtimeBytecode, - }; - } - await this.handleTraceInfoAsync(traceInfo); - } - } else { - for (const subcallAddress of subcallAddresses) { - const runtimeBytecode = await this._web3Wrapper.getContractCodeAsync(subcallAddress); - const traceForThatSubcall = tracesByContractAddress[subcallAddress]; - const traceInfo: TraceInfoExistingContract = { - subtrace: traceForThatSubcall, - txHash, - address: subcallAddress, - runtimeBytecode, - }; - await this.handleTraceInfoAsync(traceInfo); - } - } - } private async _recordCallOrGasEstimateTraceAsync(callData: Partial<CallData>): Promise<void> { // We don't want other transactions to be exeucted during snashotting period, that's why we lock the // transaction execution for all transactions except our fake ones. diff --git a/packages/sol-cov/src/trace_info_subprovider.ts b/packages/sol-cov/src/trace_info_subprovider.ts new file mode 100644 index 000000000..635a68f58 --- /dev/null +++ b/packages/sol-cov/src/trace_info_subprovider.ts @@ -0,0 +1,59 @@ +import * as _ from 'lodash'; + +import { constants } from './constants'; +import { getTracesByContractAddress } from './trace'; +import { TraceCollectionSubprovider } from './trace_collection_subprovider'; +import { TraceInfo, TraceInfoExistingContract, TraceInfoNewContract } from './types'; + +// TraceInfoSubprovider is extended by subproviders which need to work with one +// TraceInfo at a time. It has one abstract method: _handleTraceInfoAsync, which +// is called for each TraceInfo. +export abstract class TraceInfoSubprovider extends TraceCollectionSubprovider { + protected abstract _handleTraceInfoAsync(traceInfo: TraceInfo): Promise<void>; + protected async _recordTxTraceAsync(address: string, data: string | undefined, txHash: string): Promise<void> { + await this._web3Wrapper.awaitTransactionMinedAsync(txHash, 0); + const trace = await this._web3Wrapper.getTransactionTraceAsync(txHash, { + disableMemory: true, + disableStack: false, + disableStorage: true, + }); + const tracesByContractAddress = getTracesByContractAddress(trace.structLogs, address); + const subcallAddresses = _.keys(tracesByContractAddress); + if (address === constants.NEW_CONTRACT) { + for (const subcallAddress of subcallAddresses) { + let traceInfo: TraceInfoNewContract | TraceInfoExistingContract; + if (subcallAddress === 'NEW_CONTRACT') { + const traceForThatSubcall = tracesByContractAddress[subcallAddress]; + traceInfo = { + subtrace: traceForThatSubcall, + txHash, + address: subcallAddress, + bytecode: data as string, + }; + } else { + const runtimeBytecode = await this._web3Wrapper.getContractCodeAsync(subcallAddress); + const traceForThatSubcall = tracesByContractAddress[subcallAddress]; + traceInfo = { + subtrace: traceForThatSubcall, + txHash, + address: subcallAddress, + runtimeBytecode, + }; + } + await this._handleTraceInfoAsync(traceInfo); + } + } else { + for (const subcallAddress of subcallAddresses) { + const runtimeBytecode = await this._web3Wrapper.getContractCodeAsync(subcallAddress); + const traceForThatSubcall = tracesByContractAddress[subcallAddress]; + const traceInfo: TraceInfoExistingContract = { + subtrace: traceForThatSubcall, + txHash, + address: subcallAddress, + runtimeBytecode, + }; + await this._handleTraceInfoAsync(traceInfo); + } + } + } +} diff --git a/packages/sol-cov/src/types.ts b/packages/sol-cov/src/types.ts index 896d4a7b5..cef7141cb 100644 --- a/packages/sol-cov/src/types.ts +++ b/packages/sol-cov/src/types.ts @@ -107,3 +107,10 @@ export type TraceInfo = TraceInfoNewContract | TraceInfoExistingContract; export enum BlockParamLiteral { Latest = 'latest', } + +export interface EvmCallStackEntry { + structLog: StructLog; + address: string; +} + +export type EvmCallStack = EvmCallStackEntry[]; diff --git a/packages/sol-cov/src/utils.ts b/packages/sol-cov/src/utils.ts index 0b32df02e..4f16a1cda 100644 --- a/packages/sol-cov/src/utils.ts +++ b/packages/sol-cov/src/utils.ts @@ -1,3 +1,6 @@ +import { addressUtils, BigNumber } from '@0xproject/utils'; +import { OpCode, StructLog } from 'ethereum-types'; +import { addHexPrefix } from 'ethereumjs-util'; import * as _ from 'lodash'; import { ContractData, LineColumn, SingleFileSourceRange } from './types'; @@ -42,4 +45,25 @@ export const utils = { }); return contractData; }, + isCallLike(op: OpCode): boolean { + return _.includes([OpCode.CallCode, OpCode.StaticCall, OpCode.Call, OpCode.DelegateCall], op); + }, + isEndOpcode(op: OpCode): boolean { + return _.includes([OpCode.Return, OpCode.Stop, OpCode.Revert, OpCode.Invalid, OpCode.SelfDestruct], op); + }, + getAddressFromStackEntry(stackEntry: string): string { + const hexBase = 16; + return addressUtils.padZeros(new BigNumber(addHexPrefix(stackEntry)).toString(hexBase)); + }, + normalizeStructLogs(structLogs: StructLog[]): StructLog[] { + if (structLogs[0].depth === 1) { + // Geth uses 1-indexed depth counter whilst ganache starts from 0 + const newStructLogs = _.map(structLogs, structLog => ({ + ...structLog, + depth: structLog.depth - 1, + })); + return newStructLogs; + } + return structLogs; + }, }; diff --git a/packages/sol-resolver/CHANGELOG.json b/packages/sol-resolver/CHANGELOG.json index 895bd2104..4c4fcc25f 100644 --- a/packages/sol-resolver/CHANGELOG.json +++ b/packages/sol-resolver/CHANGELOG.json @@ -1,18 +1,23 @@ [ { - "version": "0.0.5", + "timestamp": 1529397769, + "version": "0.0.7", "changes": [ { - "note": "Fix a bug in FsResolver where it tries to read directories as files", - "pr": 589 - }, - { - "note": "Fix a bug in NameResolver where it is not ignoring .sol files", - "pr": 589 + "note": "Dependencies updated" } ] }, { + "version": "0.0.6", + "changes": [ + { + "note": "Incorrect publish that was unpublished" + } + ], + "timestamp": 1527810075 + }, + { "timestamp": 1527009133, "version": "0.0.5", "changes": [ diff --git a/packages/sol-resolver/CHANGELOG.md b/packages/sol-resolver/CHANGELOG.md index bd94b1b41..514121ee1 100644 --- a/packages/sol-resolver/CHANGELOG.md +++ b/packages/sol-resolver/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.0.7 - _June 19, 2018_ + + * Dependencies updated + +## v0.0.6 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.0.5 - _May 22, 2018_ * Dependencies updated -## v0.0.4 - _May 4, 2018_ +## v0.0.4 - _May 5, 2018_ * Dependencies updated diff --git a/packages/sol-resolver/package.json b/packages/sol-resolver/package.json index 6c2ed8f8b..ae36648e9 100644 --- a/packages/sol-resolver/package.json +++ b/packages/sol-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/sol-resolver", - "version": "0.0.5", + "version": "0.0.7", "engines": { "node": ">=6.12" }, @@ -24,8 +24,8 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/resolver/README.md", "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "copyfiles": "^1.2.0", "make-promises-safe": "^1.1.0", "shx": "^0.2.2", @@ -33,7 +33,7 @@ "typescript": "2.7.1" }, "dependencies": { - "@0xproject/types": "^0.7.0", + "@0xproject/types": "^0.8.1", "@0xproject/typescript-typings": "^0.0.3", "lodash": "^4.17.4" }, diff --git a/packages/sra-report/CHANGELOG.json b/packages/sra-report/CHANGELOG.json index 015279157..d4ca1aebb 100644 --- a/packages/sra-report/CHANGELOG.json +++ b/packages/sra-report/CHANGELOG.json @@ -1,5 +1,41 @@ [ { + "timestamp": 1529397769, + "version": "0.1.4", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1527617805, + "version": "0.1.3", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1527617227, + "version": "0.1.2", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1527616612, + "version": "0.1.1", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { "version": "0.1.0", "changes": [ { diff --git a/packages/sra-report/CHANGELOG.md b/packages/sra-report/CHANGELOG.md index 208a1e174..8acda5aa5 100644 --- a/packages/sra-report/CHANGELOG.md +++ b/packages/sra-report/CHANGELOG.md @@ -5,11 +5,27 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.1.4 - _June 19, 2018_ + + * Dependencies updated + +## v0.1.3 - _May 29, 2018_ + + * Dependencies updated + +## v0.1.2 - _May 29, 2018_ + + * Dependencies updated + +## v0.1.1 - _May 29, 2018_ + + * Dependencies updated + ## v0.1.0 - _May 22, 2018_ * Properly export the executable binary (#588) -## v0.0.14 - _May 4, 2018_ +## v0.0.14 - _May 5, 2018_ * Dependencies updated diff --git a/packages/sra-report/package.json b/packages/sra-report/package.json index 2e120d661..379b8cb1e 100644 --- a/packages/sra-report/package.json +++ b/packages/sra-report/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/sra-report", - "version": "0.1.0", + "version": "0.1.4", "engines": { "node": ">=6.12" }, @@ -32,21 +32,21 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/sra-report/README.md", "dependencies": { - "@0xproject/assert": "^0.2.10", - "@0xproject/types": "0.7.0", - "@0xproject/order-utils": "0.0.5", - "@0xproject/connect": "0.6.12", - "@0xproject/json-schemas": "0.7.22", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", + "@0xproject/assert": "^0.2.12", + "@0xproject/types": "^0.8.1", + "@0xproject/order-utils": "^0.0.7", + "@0xproject/connect": "0.6.15", + "@0xproject/json-schemas": "0.8.1", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", "chalk": "^2.3.0", "lodash": "^4.17.4", "newman": "^3.9.3", "yargs": "^10.0.3" }, "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "@types/lodash": "4.14.104", "@types/mocha": "^2.2.48", "@types/nock": "^9.1.2", diff --git a/packages/subproviders/CHANGELOG.json b/packages/subproviders/CHANGELOG.json index d7fe5e330..65a74f7a8 100644 --- a/packages/subproviders/CHANGELOG.json +++ b/packages/subproviders/CHANGELOG.json @@ -1,5 +1,14 @@ [ { + "timestamp": 1529397769, + "version": "0.10.4", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { "version": "0.10.3", "changes": [ { diff --git a/packages/subproviders/CHANGELOG.md b/packages/subproviders/CHANGELOG.md index 8c4990a7c..855524e4a 100644 --- a/packages/subproviders/CHANGELOG.md +++ b/packages/subproviders/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.10.4 - _June 19, 2018_ + + * Dependencies updated + +## v0.10.3 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.10.2 - _May 22, 2018_ * Dependencies updated -## v0.10.1 - _May 4, 2018_ +## v0.10.1 - _May 5, 2018_ * Dependencies updated diff --git a/packages/subproviders/package.json b/packages/subproviders/package.json index b222ace3b..2f3ffe22e 100644 --- a/packages/subproviders/package.json +++ b/packages/subproviders/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/subproviders", - "version": "0.10.2", + "version": "0.10.4", "engines": { "node": ">=6.12" }, @@ -40,10 +40,10 @@ } }, "dependencies": { - "@0xproject/assert": "^0.2.10", - "@0xproject/types": "^0.7.0", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", + "@0xproject/assert": "^0.2.12", + "@0xproject/types": "^0.8.1", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", "@ledgerhq/hw-app-eth": "^4.3.0", "@ledgerhq/hw-transport-u2f": "^4.3.0", "ethereum-types": "^0.0.1", @@ -59,9 +59,9 @@ "web3-provider-engine": "^14.0.4" }, "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", - "@0xproject/utils": "^0.6.2", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", + "@0xproject/utils": "^0.7.1", "@types/bip39": "^2.4.0", "@types/bn.js": "^4.11.0", "@types/hdkey": "^0.7.0", diff --git a/packages/testnet-faucets/package.json b/packages/testnet-faucets/package.json index 2d1252596..6753285cd 100644 --- a/packages/testnet-faucets/package.json +++ b/packages/testnet-faucets/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@0xproject/testnet-faucets", - "version": "1.0.30", + "version": "1.0.34", "engines": { "node": ">=6.12" }, @@ -19,9 +19,9 @@ "license": "Apache-2.0", "dependencies": { "0x.js": "^0.38.0", - "@0xproject/subproviders": "^0.10.2", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", + "@0xproject/subproviders": "^0.10.4", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", "body-parser": "^1.17.1", "ethereumjs-tx": "^1.3.3", "ethereumjs-util": "^5.1.1", @@ -32,7 +32,7 @@ "web3-provider-engine": "^14.0.4" }, "devDependencies": { - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/tslint-config": "^0.4.20", "@types/body-parser": "^1.16.1", "@types/express": "^4.0.35", "@types/lodash": "4.14.104", diff --git a/packages/tslint-config/CHANGELOG.json b/packages/tslint-config/CHANGELOG.json index 4868b3983..ffb0c4e81 100644 --- a/packages/tslint-config/CHANGELOG.json +++ b/packages/tslint-config/CHANGELOG.json @@ -1,5 +1,23 @@ [ { + "timestamp": 1529397769, + "version": "0.4.20", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "version": "0.4.19", + "changes": [ + { + "note": "Incorrect publish that was unpublished" + } + ], + "timestamp": 1527810075 + }, + { "timestamp": 1527009133, "version": "0.4.18", "changes": [ diff --git a/packages/tslint-config/CHANGELOG.md b/packages/tslint-config/CHANGELOG.md index 56b65cadd..2a862f8e1 100644 --- a/packages/tslint-config/CHANGELOG.md +++ b/packages/tslint-config/CHANGELOG.md @@ -5,6 +5,14 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.4.20 - _June 19, 2018_ + + * Dependencies updated + +## v0.4.19 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.4.18 - _May 22, 2018_ * Dependencies updated diff --git a/packages/tslint-config/package.json b/packages/tslint-config/package.json index 452ac48a4..9cb6a2da0 100644 --- a/packages/tslint-config/package.json +++ b/packages/tslint-config/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/tslint-config", - "version": "0.4.18", + "version": "0.4.20", "engines": { "node": ">=6.12" }, @@ -34,7 +34,7 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/tslint-config/README.md", "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", + "@0xproject/monorepo-scripts": "^0.2.1", "@types/lodash": "4.14.104", "copyfiles": "^1.2.0", "make-promises-safe": "^1.1.0", diff --git a/packages/types/CHANGELOG.json b/packages/types/CHANGELOG.json index 6acfbb98a..40197ab92 100644 --- a/packages/types/CHANGELOG.json +++ b/packages/types/CHANGELOG.json @@ -1,5 +1,14 @@ [ { + "timestamp": 1529397769, + "version": "0.8.1", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { "version": "0.8.0", "changes": [ { diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 68e5ed438..aa3ba5eab 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.8.1 - _June 19, 2018_ + + * Dependencies updated + +## v0.8.0 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.7.0 - _May 22, 2018_ * Moved ExchangeContractErrs, DoneCallback, Token, OrderRelevantState, OrderStateValid, OrderStateInvalid, OrderState, OrderAddresses and OrderValues types from 0x.js (#579) -## v0.6.3 - _May 4, 2018_ +## v0.6.3 - _May 5, 2018_ * Dependencies updated diff --git a/packages/types/package.json b/packages/types/package.json index fd2073db3..0d5e308b9 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -24,8 +24,8 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/types/README.md", "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "copyfiles": "^1.2.0", "make-promises-safe": "^1.1.0", "shx": "^0.2.2", diff --git a/packages/typescript-typings/CHANGELOG.json b/packages/typescript-typings/CHANGELOG.json index 555da22d1..5b5d5c31d 100644 --- a/packages/typescript-typings/CHANGELOG.json +++ b/packages/typescript-typings/CHANGELOG.json @@ -1,5 +1,14 @@ [ { + "timestamp": 1529397769, + "version": "0.4.1", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { "version": "0.4.0", "changes": [ { diff --git a/packages/typescript-typings/CHANGELOG.md b/packages/typescript-typings/CHANGELOG.md index e12ce63f2..a34ff86e1 100644 --- a/packages/typescript-typings/CHANGELOG.md +++ b/packages/typescript-typings/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.4.1 - _June 19, 2018_ + + * Dependencies updated + +## v0.4.0 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.3.2 - _May 22, 2018_ * Dependencies updated -## v0.3.1 - _May 4, 2018_ +## v0.3.1 - _May 5, 2018_ * Dependencies updated diff --git a/packages/typescript-typings/package.json b/packages/typescript-typings/package.json index 0dde47c97..f10d35666 100644 --- a/packages/typescript-typings/package.json +++ b/packages/typescript-typings/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/typescript-typings", - "version": "0.3.2", + "version": "0.4.1", "engines": { "node": ">=6.12" }, @@ -29,7 +29,7 @@ "bignumber.js": "~4.1.0" }, "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", + "@0xproject/monorepo-scripts": "^0.2.1", "copyfiles": "^1.2.0", "shx": "^0.2.2" }, diff --git a/packages/utils/CHANGELOG.json b/packages/utils/CHANGELOG.json index 339d73e05..ac54cc42c 100644 --- a/packages/utils/CHANGELOG.json +++ b/packages/utils/CHANGELOG.json @@ -1,27 +1,28 @@ [ { - "version": "0.6.3", + "timestamp": 1529397769, + "version": "0.7.1", "changes": [ { - "note": "Added errorUtils.spawnSwitchErr" + "note": "Dependencies updated" } ] }, { - "timestamp": 1527009133, - "version": "0.6.2", + "version": "0.7.0", "changes": [ { - "note": "Dependencies updated" + "note": "Incorrect publish that was unpublished" } - ] + ], + "timestamp": 1527810075 }, { - "version": "0.7.0", + "timestamp": 1527009133, + "version": "0.6.2", "changes": [ { - "note": "Add logUtils.warn", - "pr": 589 + "note": "Dependencies updated" } ] }, diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md index 0c01bf4f1..60a575297 100644 --- a/packages/utils/CHANGELOG.md +++ b/packages/utils/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.7.1 - _June 19, 2018_ + + * Dependencies updated + +## v0.7.0 - _June 1, 2018_ + + * Incorrect publish that was unpublished + ## v0.6.2 - _May 22, 2018_ * Dependencies updated -## v0.6.1 - _May 4, 2018_ +## v0.6.1 - _May 5, 2018_ * Dependencies updated diff --git a/packages/utils/package.json b/packages/utils/package.json index 3828fa9ee..06d67566c 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/utils", - "version": "0.6.2", + "version": "0.7.1", "engines": { "node": ">=6.12" }, @@ -24,8 +24,8 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/utils/README.md", "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "@types/lodash": "4.14.104", "copyfiles": "^1.2.0", "make-promises-safe": "^1.1.0", @@ -36,11 +36,11 @@ }, "dependencies": { "ethereum-types": "^0.0.1", - "@0xproject/typescript-typings": "^0.3.2", + "@0xproject/typescript-typings": "^0.4.1", "@types/node": "^8.0.53", "ethereumjs-util": "^5.1.1", "bignumber.js": "~4.1.0", - "ethers": "^3.0.15", + "ethers": "3.0.22", "js-sha3": "^0.7.0", "lodash": "^4.17.4", "web3": "^0.20.0" diff --git a/packages/web3-wrapper/CHANGELOG.json b/packages/web3-wrapper/CHANGELOG.json index bd4bf06dd..624ad7151 100644 --- a/packages/web3-wrapper/CHANGELOG.json +++ b/packages/web3-wrapper/CHANGELOG.json @@ -1,5 +1,15 @@ [ { + "timestamp": 1529397769, + "version": "0.7.1", + "changes": [ + { + "note": "Dependencies updated" + } + ] + }, + { + "timestamp": 1528070400, "version": "0.7.0", "changes": [ { diff --git a/packages/web3-wrapper/CHANGELOG.md b/packages/web3-wrapper/CHANGELOG.md index 4b8fb7bac..1ac36a316 100644 --- a/packages/web3-wrapper/CHANGELOG.md +++ b/packages/web3-wrapper/CHANGELOG.md @@ -5,11 +5,19 @@ Edit the package's CHANGELOG.json file only. CHANGELOG +## v0.7.1 - _June 19, 2018_ + + * Dependencies updated + +## v0.7.0 - _June 4, 2018_ + + * Add default parameters when sending a raw payload + ## v0.6.4 - _May 22, 2018_ * Dependencies updated -## v0.6.3 - _May 4, 2018_ +## v0.6.3 - _May 5, 2018_ * Dependencies updated diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json index de2b72ac6..3c5b2c616 100644 --- a/packages/web3-wrapper/package.json +++ b/packages/web3-wrapper/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/web3-wrapper", - "version": "0.6.4", + "version": "0.7.1", "engines": { "node": ">=6.12" }, @@ -45,8 +45,8 @@ }, "homepage": "https://github.com/0xProject/0x-monorepo/packages/web3-wrapper/README.md", "devDependencies": { - "@0xproject/monorepo-scripts": "^0.1.20", - "@0xproject/tslint-config": "^0.4.18", + "@0xproject/monorepo-scripts": "^0.2.1", + "@0xproject/tslint-config": "^0.4.20", "@types/lodash": "4.14.104", "chai": "^4.0.1", "chai-as-promised": "^7.1.0", @@ -64,10 +64,10 @@ "typescript": "2.7.1" }, "dependencies": { - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", "ethereum-types": "^0.0.1", - "ethers": "^3.0.15", + "ethers": "3.0.22", "lodash": "^4.17.4", "web3": "^0.20.0" }, diff --git a/packages/web3-wrapper/src/web3_wrapper.ts b/packages/web3-wrapper/src/web3_wrapper.ts index 5d2eedcb3..6ea69883c 100644 --- a/packages/web3-wrapper/src/web3_wrapper.ts +++ b/packages/web3-wrapper/src/web3_wrapper.ts @@ -491,8 +491,13 @@ export class Web3Wrapper { } private async _sendRawPayloadAsync<A>(payload: Partial<JSONRPCRequestPayload>): Promise<A> { const sendAsync = this._web3.currentProvider.sendAsync.bind(this._web3.currentProvider); - payload.id = this._jsonRpcRequestId++; - const response = await promisify<JSONRPCResponsePayload>(sendAsync)(payload); + const payloadWithDefaults = { + id: this._jsonRpcRequestId++, + params: [], + jsonrpc: '2.0', + ...payload, + }; + const response = await promisify<JSONRPCResponsePayload>(sendAsync)(payloadWithDefaults); const result = response.result; return result; } diff --git a/packages/website/md/docs/sol_cov/usage.md b/packages/website/md/docs/sol_cov/usage.md index 59638f611..433cfad96 100644 --- a/packages/website/md/docs/sol_cov/usage.md +++ b/packages/website/md/docs/sol_cov/usage.md @@ -11,9 +11,6 @@ In order to use `CoverageSubprovider` with your favorite framework you need to p If you are generating your artifacts with [@0xproject/sol-compiler](LINK) you can use the `SolCompilerArtifactsAdapter` we've implemented for you. ```typescript -<<<<<<< HEAD -import { CoverageSubprovider } from '@0xproject/sol-cov'; -======= import { SolCompilerArtifactsAdapter } from '@0xproject/sol-cov'; const artifactsPath = 'src/artifacts'; const contractsPath = 'src/contracts'; @@ -42,7 +39,6 @@ Look at the code of the two adapters above for examples. ```typescript import { CoverageSubprovider } from '@0xproject/sol-cov'; import ProviderEngine = require('web3-provider-engine'); ->>>>>>> Improve sol-cov docs const provider = new ProviderEngine(); @@ -51,12 +47,8 @@ const contractsPath = 'src/contracts'; const networkId = 50; // Some calls might not have `from` address specified. Nevertheless - transactions need to be submitted from an address with at least some funds. defaultFromAddress is the address that will be used to submit those calls as transactions from. const defaultFromAddress = '0x5409ed021d9299bf6814279a6a1411a7e866a631'; -<<<<<<< HEAD -const coverageSubprovider = new CoverageSubprovider(artifactsPath, contractsPath, defaultFromAddress); -======= const isVerbose = true; const coverageSubprovider = new CoverageSubprovider(artifactsAdapter, defaultFromAddress, isVerbose); ->>>>>>> Improve sol-cov docs provider.addProvider(coverageSubprovider); ``` diff --git a/packages/website/package.json b/packages/website/package.json index 5287414c7..a2ac617eb 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -1,6 +1,6 @@ { "name": "@0xproject/website", - "version": "0.0.33", + "version": "0.0.37", "engines": { "node": ">=6.12" }, @@ -18,14 +18,14 @@ "author": "Fabio Berger", "license": "Apache-2.0", "dependencies": { - "@0xproject/contract-wrappers": "^0.0.2", - "@0xproject/react-docs": "^0.0.12", - "@0xproject/react-shared": "^0.1.7", - "@0xproject/subproviders": "^0.10.2", - "@0xproject/types": "0.7.0", - "@0xproject/typescript-typings": "^0.3.2", - "@0xproject/utils": "^0.6.2", - "@0xproject/web3-wrapper": "^0.6.4", + "@0xproject/contract-wrappers": "^0.0.5", + "@0xproject/react-docs": "^0.0.14", + "@0xproject/react-shared": "^0.2.1", + "@0xproject/subproviders": "^0.10.4", + "@0xproject/types": "^0.8.1", + "@0xproject/typescript-typings": "^0.4.1", + "@0xproject/utils": "^0.7.1", + "@0xproject/web3-wrapper": "^0.7.1", "accounting": "^0.4.1", "basscss": "^8.0.3", "blockies": "^0.0.2", diff --git a/packages/website/public/images/eth_dollar.svg b/packages/website/public/images/eth_dollar.svg new file mode 100644 index 000000000..0afec94fa --- /dev/null +++ b/packages/website/public/images/eth_dollar.svg @@ -0,0 +1,29 @@ +<svg width="76" height="46" viewBox="0 0 76 46" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g filter="url(#filter0_d)"> +<path d="M-2.34315e-08 10.7545L18.9187 -1.15499e-08L65.2081 26.3534L46.2894 37.1079L-2.34315e-08 10.7545Z" transform="translate(5.62109 1.17188)" fill="#DCD3EB"/> +<path d="M20.5403 1.84086L65.2081 27.2738L47.911 37.1079L3.24321 11.6749L20.5403 1.84086ZM20.5403 0L0 11.6749L47.911 38.9487L68.4513 27.2738L20.5403 0Z" transform="translate(4 0.25)" fill="#AAA7C9"/> +<path d="M9.92618 13.54C7.05152 13.54 4.44712 12.9587 2.62896 11.9171C0.90908 10.9483 3.74905e-07 9.66451 3.74905e-07 8.2112C3.74905e-07 6.27346 1.6216 4.23882 4.44712 2.64018C7.39549 0.944652 11.2775 3.69596e-07 15.0613 3.69596e-07C17.9359 3.69596e-07 20.5403 0.581324 22.3585 1.62286C24.0784 2.59174 24.9874 3.87549 24.9874 5.3288C24.9874 7.26655 23.3658 9.30118 20.5403 10.8998C17.5919 12.5711 13.7099 13.54 9.92618 13.54Z" transform="translate(26.3359 13.3047)" fill="#CAC3E5"/> +<path d="M15.8578 1.59864C18.585 1.59864 21.042 2.13152 22.7619 3.1004C23.7692 3.68172 24.9731 4.67482 24.9731 6.1039C24.9731 7.72677 23.4744 9.5434 20.9437 10.9967C18.0936 12.6196 14.3836 13.54 10.7473 13.54C8.02001 13.54 5.56304 13.0071 3.84316 12.0383C2.8358 11.4569 1.63188 10.4638 1.63188 9.03475C1.63188 7.41188 3.13063 5.59524 5.66132 4.14193C8.48684 2.51907 12.1969 1.59864 15.8578 1.59864ZM15.8578 -3.69596e-07C12.0986 -3.69596e-07 8.04458 0.944652 4.85051 2.76129C-0.825098 5.98279 -1.6359 10.7545 3.03235 13.4189C5.07164 14.5815 7.82345 15.1386 10.7473 15.1386C14.5064 15.1386 18.5604 14.194 21.7545 12.3774C27.4301 9.15585 28.2409 4.38415 23.5727 1.71975C21.5088 0.557102 18.757 -3.69596e-07 15.8578 -3.69596e-07Z" transform="translate(25.5391 12.5078)" fill="#AAA7C9"/> +<path d="M1.81816 5.69213L8.89425 6.73367L11.8426 0L-7.49809e-07 1.64709L1.81816 5.69213Z" transform="translate(34.3945 15.875)" fill="#AAA7C9"/> +<path d="M3.74905e-07 6.07968L10.7124 5.03814L3.63632 4.02083L1.81816 3.69596e-07L3.74905e-07 6.07968Z" transform="translate(31.7422 18.0312)" fill="#AAA7C9"/> +<path d="M2.9238 3.63328C2.01472 3.63328 1.20392 3.46372 0.638813 3.14884C0.343976 2.97929 -4.68631e-08 2.68862 -4.68631e-08 2.3253C-4.68631e-08 1.86508 0.491395 1.28376 1.27763 0.847764C2.23585 0.314884 3.46433 0 4.69282 0C5.6019 0 6.4127 0.169553 6.97781 0.484437C7.27265 0.65399 7.61662 0.944652 7.61662 1.30798C7.61662 1.76819 7.12523 2.34952 6.339 2.78551C5.40534 3.31839 4.15229 3.63328 2.9238 3.63328Z" transform="translate(7.85938 9.69531)" fill="#DCD3EB"/> +<path d="M5.5202 1.59864C6.28186 1.59864 6.96981 1.74397 7.3875 1.98619C7.51035 2.05886 7.58406 2.1073 7.60863 2.15574C7.55949 2.27685 7.33836 2.59174 6.74868 2.93084C5.93788 3.39106 4.80767 3.68172 3.7266 3.68172C2.96494 3.68172 2.27699 3.53639 1.8593 3.29417C1.73645 3.2215 1.66275 3.17306 1.63818 3.12462C1.68732 3.00351 1.90844 2.68862 2.49812 2.34952C3.30892 1.8893 4.43913 1.59864 5.5202 1.59864ZM5.5202 0C4.218 0 2.79295 0.314884 1.68732 0.968874C-0.278265 2.08308 -0.573102 3.75438 1.0485 4.67482C1.76102 5.08659 2.71924 5.28036 3.7266 5.28036C5.0288 5.28036 6.45385 4.96548 7.55949 4.31149C9.52507 3.19728 9.8199 1.52598 8.1983 0.605546C7.48578 0.217997 6.52756 0 5.5202 0Z" transform="translate(7.05469 8.85156)" fill="#AAA7C9"/> +<path d="M2.9238 3.63327C2.01472 3.63327 1.20392 3.46372 0.638815 3.14884C0.343978 2.97928 0 2.68862 0 2.3253C0 1.86508 0.491394 1.28376 1.27763 0.847763C2.23585 0.314882 3.46434 -1.47838e-06 4.69282 -1.47838e-06C5.6019 -1.47838e-06 6.4127 0.169551 6.97781 0.484435C7.27264 0.653988 7.61662 0.944652 7.61662 1.30798C7.61662 1.76819 7.12523 2.34952 6.339 2.78551C5.40535 3.31839 4.15229 3.63327 2.9238 3.63327Z" transform="translate(49.332 33.2891)" fill="#CAC3E5"/> +<path d="M5.5202 1.59864C6.28186 1.59864 6.96981 1.74397 7.3875 1.98619C7.51035 2.05886 7.58405 2.1073 7.60862 2.15574C7.55948 2.27685 7.33836 2.59174 6.74868 2.93084C5.93788 3.39106 4.80767 3.68172 3.7266 3.68172C2.96494 3.68172 2.27699 3.53639 1.8593 3.29417C1.73646 3.22151 1.66274 3.17306 1.63817 3.12462C1.68731 3.00351 1.90844 2.68862 2.49812 2.34952C3.30892 1.86508 4.43913 1.59864 5.5202 1.59864ZM5.5202 0C4.218 0 2.79296 0.314884 1.68732 0.968874C-0.278264 2.08308 -0.573102 3.75439 1.0485 4.67482C1.76102 5.08659 2.71924 5.28036 3.7266 5.28036C5.0288 5.28036 6.45385 4.96548 7.55949 4.31149C9.52507 3.19728 9.8199 1.52598 8.1983 0.605546C7.48578 0.193775 6.52756 0 5.5202 0Z" transform="translate(48.5273 32.4648)" fill="#AAA7C9"/> +<path d="M2.9238 3.63328C2.01472 3.63328 1.20392 3.46372 0.638813 3.14884C0.343976 2.97929 1.49962e-06 2.68862 1.49962e-06 2.3253C1.49962e-06 1.86508 0.491396 1.28376 1.27763 0.847764C2.23585 0.314884 3.46433 -3.69596e-07 4.69282 -3.69596e-07C5.6019 -3.69596e-07 6.4127 0.169553 6.97781 0.484436C7.27265 0.653989 7.61662 0.944652 7.61662 1.30798C7.61662 1.76819 7.12523 2.34952 6.33899 2.78551C5.40534 3.31839 4.15229 3.63328 2.9238 3.63328Z" transform="translate(61.3945 26.4336)" fill="#DCD3EB"/> +<path d="M5.5202 1.59864C6.28186 1.59864 6.96981 1.74397 7.3875 1.98619C7.51034 2.05886 7.58405 2.1073 7.60862 2.15574C7.55948 2.27685 7.33836 2.59174 6.74868 2.93084C5.93788 3.39106 4.80767 3.68172 3.7266 3.68172C2.96494 3.68172 2.27699 3.53639 1.8593 3.29417C1.73645 3.2215 1.66275 3.17306 1.63818 3.12462C1.68732 3.00351 1.90844 2.68863 2.49812 2.34952C3.30892 1.8893 4.43913 1.59864 5.5202 1.59864ZM5.5202 -3.69596e-07C4.218 -3.69596e-07 2.79295 0.314884 1.68731 0.968873C-0.278266 2.08308 -0.5731 3.75439 1.0485 4.67482C1.76103 5.08659 2.71924 5.28036 3.7266 5.28036C5.0288 5.28036 6.45385 4.96548 7.55949 4.31149C9.52507 3.19728 9.81991 1.52598 8.1983 0.605546C7.48578 0.217996 6.52756 -3.69596e-07 5.5202 -3.69596e-07Z" transform="translate(60.5938 25.5859)" fill="#AAA7C9"/> +<path d="M2.9238 3.63328C2.01472 3.63328 1.20392 3.46372 0.638814 3.14884C0.343977 2.97929 7.49809e-07 2.68862 7.49809e-07 2.3253C7.49809e-07 1.86508 0.491395 1.28376 1.27763 0.847764C2.23585 0.314884 3.46434 9.2399e-08 4.69282 9.2399e-08C5.6019 9.2399e-08 6.4127 0.169553 6.97781 0.484437C7.27264 0.65399 7.61662 0.944652 7.61662 1.30798C7.61662 1.76819 7.12523 2.34952 6.339 2.78551C5.40534 3.31839 4.15229 3.63328 2.9238 3.63328Z" transform="translate(19.9219 2.82031)" fill="#CAC3E5"/> +<path d="M5.5202 1.59864C6.28186 1.59864 6.96981 1.74397 7.3875 1.98619C7.51035 2.05886 7.58406 2.1073 7.60863 2.15574C7.55949 2.27685 7.33836 2.59174 6.74868 2.93084C5.93788 3.39106 4.80767 3.68172 3.7266 3.68172C2.96494 3.68172 2.27699 3.53639 1.8593 3.29417C1.73645 3.2215 1.66274 3.17306 1.63817 3.12462C1.68731 3.00351 1.90844 2.68862 2.49812 2.34952C3.30892 1.86508 4.43913 1.59864 5.5202 1.59864ZM5.5202 -4.61995e-08C4.218 -4.61995e-08 2.79295 0.314884 1.68732 0.968874C-0.278265 2.08308 -0.573101 3.75439 1.0485 4.67482C1.76103 5.08659 2.71924 5.28036 3.7266 5.28036C5.0288 5.28036 6.45385 4.96548 7.55949 4.31149C9.52507 3.19728 9.8199 1.52598 8.1983 0.605546C7.48578 0.193775 6.52756 -4.61995e-08 5.5202 -4.61995e-08Z" transform="translate(19.1172 1.99219)" fill="#AAA7C9"/> +</g> +<defs> +<filter id="filter0_d" x="0.799705" y="0.25" width="74.8519" height="45.3493" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/> +<feOffset dy="3.20029"/> +<feGaussianBlur stdDeviation="1.60015"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/> +</filter> +</defs> +</svg> diff --git a/packages/website/public/images/eth_token.svg b/packages/website/public/images/eth_token.svg new file mode 100644 index 000000000..9392692f9 --- /dev/null +++ b/packages/website/public/images/eth_token.svg @@ -0,0 +1,20 @@ +<svg width="54" height="36" viewBox="0 0 54 36" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g filter="url(#filter0_d)"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M45.9288 8.37974H44.6437C43.5923 6.66375 41.7231 5.06216 39.2698 3.68937C30.2743 -1.22979 15.788 -1.22979 6.79252 3.68937C4.3392 5.06216 2.47001 6.66375 1.41859 8.37974H0.0166892V12.2693C-0.21696 15.5869 2.00271 19.0189 6.67569 21.5356C15.6712 26.4548 30.1575 26.4548 39.153 21.5356C43.8259 19.0189 46.0456 15.5869 45.812 12.2693V8.37974H45.9288Z" transform="translate(4.07422 6.77344)" fill="#AAA7C9"/> +<path d="M39.2239 21.4212C30.2284 26.3404 15.7421 26.3404 6.74662 21.4212C-2.24888 16.5021 -2.24888 8.60854 6.74662 3.68937C15.7421 -1.22979 30.2284 -1.22979 39.2239 3.68937C48.2194 8.60854 48.2194 16.6165 39.2239 21.4212Z" transform="translate(4 3)" fill="#CAC3E6"/> +<path d="M19.7434 21.2782C30.6473 21.2782 39.4867 16.5149 39.4867 10.6391C39.4867 4.7633 30.6473 0 19.7434 0C8.83941 0 0 4.7633 0 10.6391C0 16.5149 8.83941 21.2782 19.7434 21.2782Z" transform="translate(7.35938 4.51562)" fill="#DCD3EB"/> +<path d="M2.45332 7.89354L12.6171 9.49513L16.8228 -2.18199e-07L-4.45651e-07 2.17358L2.45332 7.89354Z" transform="translate(20.3242 9.55078)" fill="#AAA7C9"/> +<path d="M0 8.69434L15.304 7.43595L5.25711 5.71996L2.68697 4.36398e-07L0 8.69434Z" transform="translate(16.3516 12.2969)" fill="#AAA7C9"/> +</g> +<defs> +<filter id="filter0_d" x="0.799705" y="0.599779" width="52.4036" height="35.399" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/> +<feOffset dy="0.800074"/> +<feGaussianBlur stdDeviation="1.60015"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/> +</filter> +</defs> +</svg> diff --git a/packages/website/public/images/eth_token_erc20.svg b/packages/website/public/images/eth_token_erc20.svg new file mode 100644 index 000000000..6313c826d --- /dev/null +++ b/packages/website/public/images/eth_token_erc20.svg @@ -0,0 +1,22 @@ +<svg width="66" height="38" viewBox="0 0 66 38" fill="none" xmlns="http://www.w3.org/2000/svg"> +<rect width="36.2389" height="14.3077" rx="2.40022" transform="translate(26.7617 0.457031)" fill="#3289F1"/> +<path d="M3.01758 9.09766C2.20703 9.09766 1.55111 8.85677 1.0498 8.375C0.548503 7.88997 0.297852 7.26009 0.297852 6.48535V6.34863C0.297852 5.80827 0.397135 5.33138 0.595703 4.91797C0.797526 4.50456 1.09049 4.18555 1.47461 3.96094C1.85872 3.73307 2.31445 3.61914 2.8418 3.61914C3.58398 3.61914 4.16992 3.85026 4.59961 4.3125C5.0293 4.77148 5.24414 5.41276 5.24414 6.23633V6.87598H1.97266C2.03125 7.1722 2.15983 7.40495 2.3584 7.57422C2.55697 7.74349 2.81413 7.82812 3.12988 7.82812C3.65072 7.82812 4.05762 7.64583 4.35059 7.28125L5.10254 8.16992C4.89746 8.45312 4.60612 8.67936 4.22852 8.84863C3.85417 9.01465 3.45052 9.09766 3.01758 9.09766ZM2.83203 4.88867C2.35026 4.88867 2.0638 5.20768 1.97266 5.8457H3.63281V5.71875C3.63932 5.45508 3.57259 5.25163 3.43262 5.1084C3.29264 4.96191 3.09245 4.88867 2.83203 4.88867ZM9.31514 5.20605L8.77315 5.16699C8.25557 5.16699 7.92354 5.32975 7.77706 5.65527V9H6.13155V3.7168H7.67452L7.72823 4.39551C8.00492 3.87793 8.39066 3.61914 8.88545 3.61914C9.06123 3.61914 9.21423 3.63867 9.34444 3.67773L9.31514 5.20605ZM12.2533 7.82812C12.4844 7.82812 12.6635 7.76628 12.7904 7.64258C12.9174 7.51562 12.9792 7.33984 12.976 7.11523H14.519C14.519 7.69466 14.3106 8.16992 13.894 8.54102C13.4805 8.91211 12.9467 9.09766 12.2924 9.09766C11.5242 9.09766 10.9187 8.85677 10.476 8.375C10.0333 7.89323 9.81192 7.22591 9.81192 6.37305V6.30469C9.81192 5.77083 9.90958 5.30046 10.1049 4.89355C10.3035 4.4834 10.5883 4.16927 10.9594 3.95117C11.3305 3.72982 11.7699 3.61914 12.2777 3.61914C12.9646 3.61914 13.5098 3.80957 13.9135 4.19043C14.3171 4.57129 14.519 5.08724 14.519 5.73828H12.976C12.976 5.46484 12.9093 5.25488 12.7758 5.1084C12.6423 4.96191 12.4633 4.88867 12.2387 4.88867C11.8122 4.88867 11.5632 5.16048 11.4916 5.7041C11.4688 5.87663 11.4574 6.11426 11.4574 6.41699C11.4574 6.94759 11.5209 7.31543 11.6479 7.52051C11.7748 7.72559 11.9766 7.82812 12.2533 7.82812ZM20.3575 9H15.3966V7.92578L17.6818 5.52344C18.2449 4.88216 18.5265 4.37272 18.5265 3.99512C18.5265 3.68913 18.4597 3.45638 18.3263 3.29688C18.1928 3.13737 17.9991 3.05762 17.7452 3.05762C17.4946 3.05762 17.2911 3.16504 17.1349 3.37988C16.9786 3.59147 16.9005 3.85677 16.9005 4.17578H15.2501C15.2501 3.73958 15.3592 3.33757 15.5773 2.96973C15.7954 2.59863 16.0981 2.30892 16.4855 2.10059C16.8728 1.89225 17.3058 1.78809 17.7843 1.78809C18.5525 1.78809 19.1433 1.96549 19.5568 2.32031C19.9734 2.67513 20.1818 3.18457 20.1818 3.84863C20.1818 4.12858 20.1297 4.40202 20.0255 4.66895C19.9213 4.93262 19.7586 5.21094 19.5372 5.50391C19.3191 5.79362 18.9659 6.18262 18.4776 6.6709L17.5597 7.73047H20.3575V9ZM26.3328 6.09473C26.3328 7.05501 26.1164 7.79557 25.6834 8.31641C25.2537 8.83724 24.6466 9.09766 23.8621 9.09766C23.0711 9.09766 22.4591 8.83561 22.0262 8.31152C21.5932 7.78743 21.3768 7.0485 21.3768 6.09473V4.7959C21.3768 3.83561 21.5916 3.09505 22.0213 2.57422C22.4542 2.05339 23.0646 1.79297 23.8524 1.79297C24.6401 1.79297 25.2505 2.05501 25.6834 2.5791C26.1164 3.10319 26.3328 3.84375 26.3328 4.80078V6.09473ZM24.6873 4.58594C24.6873 4.07487 24.6206 3.69401 24.4871 3.44336C24.3537 3.18945 24.1421 3.0625 23.8524 3.0625C23.5692 3.0625 23.3625 3.17969 23.2322 3.41406C23.1053 3.64844 23.0369 4.00326 23.0272 4.47852V6.29492C23.0272 6.82552 23.0939 7.21452 23.2274 7.46191C23.3608 7.70605 23.5724 7.82812 23.8621 7.82812C24.1421 7.82812 24.3488 7.70931 24.4822 7.47168C24.6157 7.23079 24.6841 6.85482 24.6873 6.34375V4.58594Z" transform="translate(32 2.19922)" fill="white"/> +<g filter="url(#filter0_d)"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M36.9872 6.66078H35.9523C35.1056 5.2968 33.6003 4.02375 31.6246 2.93256C24.3804 -0.977521 12.7144 -0.977521 5.47013 2.93256C3.49443 4.02375 1.98914 5.2968 1.14241 6.66078H0.0134401V9.75247C-0.174722 12.3895 1.61281 15.1175 5.37605 17.118C12.6203 21.0281 24.2863 21.0281 31.5305 17.118C35.2938 15.1175 37.0813 12.3895 36.8931 9.75247V6.66078H36.9872Z" transform="translate(3.46484 12.9961)" fill="#AAA7C9"/> +<path d="M31.5877 17.027C24.3434 20.9371 12.6774 20.9371 5.43317 17.027C-1.81106 13.117 -1.81106 6.84264 5.43317 2.93256C12.6774 -0.977521 24.3434 -0.977521 31.5877 2.93256C38.8319 6.84264 38.8319 13.2079 31.5877 17.027Z" transform="translate(3.40625 9.99609)" fill="#CAC3E6"/> +<path d="M15.8997 16.9134C24.6808 16.9134 31.7993 13.1272 31.7993 8.45669C31.7993 3.78619 24.6808 0 15.8997 0C7.11853 0 0 3.78619 0 8.45669C0 13.1272 7.11853 16.9134 15.8997 16.9134Z" transform="translate(6.11328 11.1992)" fill="#DCD3EB"/> +<path d="M1.9757 6.27432L10.1607 7.54737L13.5476 -1.73439e-07L-3.5889e-07 1.72771L1.9757 6.27432Z" transform="translate(16.5547 15.2031)" fill="#AAA7C9"/> +<path d="M0 6.91084L12.3246 5.91059L4.23364 4.54661L2.16386 3.46879e-07L0 6.91084Z" transform="translate(13.3555 17.3867)" fill="#AAA7C9"/> +</g> +<defs> +<filter id="filter0_d" x="0.205955" y="7.59587" width="43.4464" height="29.4511" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/> +<feOffset dy="0.800074"/> +<feGaussianBlur stdDeviation="1.60015"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/> +</filter> +</defs> +</svg> diff --git a/packages/website/public/images/ether_alt.svg b/packages/website/public/images/ether_alt.svg new file mode 100644 index 000000000..82199d14d --- /dev/null +++ b/packages/website/public/images/ether_alt.svg @@ -0,0 +1,7 @@ +<svg width="29" height="47" viewBox="0 0 29 47" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M14.4883 6.11532e-07L0 6.49253L14.4883 14.9288L28.9665 6.49253L14.4883 6.11532e-07Z" transform="translate(0 17.1875)" fill="#267DFF"/> +<path d="M0 23.6857L14.4883 32.122V0L0 23.6857Z" fill="#267DFF"/> +<path d="M0 0V32.112L14.4782 23.6757L0 0Z" transform="translate(14.5039)" fill="#267DFF"/> +<path d="M0 -1.22306e-06L14.4883 20.1088V8.43629L0 -1.22306e-06Z" transform="translate(0 26.8906)" fill="#267DFF"/> +<path d="M0 8.43629V20.1088L14.4883 -1.22306e-06L0 8.43629Z" transform="translate(14.5117 26.8594)" fill="#267DFF"/> +</svg> diff --git a/packages/website/public/images/fake_toggle.svg b/packages/website/public/images/fake_toggle.svg new file mode 100644 index 000000000..c9632d0da --- /dev/null +++ b/packages/website/public/images/fake_toggle.svg @@ -0,0 +1,4 @@ +<svg width="36" height="23" viewBox="0 0 36 23" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M0 11.4379C0 5.12093 5.12093 0 11.4379 0H23.8494C30.1664 0 35.2873 5.12093 35.2873 11.4379V11.4379C35.2873 17.7549 30.1664 22.8758 23.8494 22.8758H11.4379C5.12092 22.8758 0 17.7549 0 11.4379V11.4379Z" fill="#E0E0E0"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M6.85185 13.8889C10.636 13.8889 13.7037 10.7798 13.7037 6.94444C13.7037 3.10913 10.636 0 6.85185 0C3.06768 0 0 3.10913 0 6.94444C0 10.7798 3.06768 13.8889 6.85185 13.8889Z" transform="translate(3.49609 4.53125)" fill="white"/> +</svg> diff --git a/packages/website/public/images/zrx_ecosystem.svg b/packages/website/public/images/zrx_ecosystem.svg new file mode 100644 index 000000000..f8aed4637 --- /dev/null +++ b/packages/website/public/images/zrx_ecosystem.svg @@ -0,0 +1,253 @@ +<svg width="352" height="162" viewBox="0 0 352 162" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<g filter="url(#filter0_d)"> +<rect width="96.165" height="52.7562" rx="4" transform="translate(4 101)" fill="#545454"/> +<rect width="29.5892" height="52.7562" rx="4" transform="translate(4 101)" fill="#808080"/> +<g opacity="0.4"> +<path d="M0 3.28518V14.7525C0 14.8229 0.0570457 14.88 0.127415 14.88H12.5223C12.6631 14.88 12.7772 14.7659 12.7772 14.6251V14.532C12.7772 14.4427 12.7048 14.3703 12.6154 14.3703H12.5811C12.5107 14.3703 12.4537 14.3132 12.4537 14.2429V14.1963C12.4537 14.1517 12.4175 14.1155 12.3728 14.1155C12.3282 14.1155 12.292 14.0793 12.292 14.0346V13.6401C12.292 13.5508 12.2196 13.4784 12.1302 13.4784C12.0409 13.4784 11.9685 13.406 11.9685 13.3166V13.177C11.9685 13.1323 11.9323 13.0961 11.8876 13.0961C11.843 13.0961 11.8068 13.0599 11.8068 13.0153V12.8756C11.8068 12.7863 11.7343 12.7139 11.645 12.7139C11.5557 12.7139 11.4833 12.6415 11.4833 12.5522V11.9837C11.4833 11.8944 11.4109 11.822 11.3215 11.822C11.2322 11.822 11.1598 11.7496 11.1598 11.6603V11.2658C11.1598 11.2211 11.1236 11.1849 11.0789 11.1849C11.0343 11.1849 10.9981 11.1487 10.9981 11.104V10.837C10.9981 10.7477 10.9257 10.6753 10.8363 10.6753C10.747 10.6753 10.6746 10.6028 10.6746 10.5135V10.0137C10.6746 9.74576 10.4574 9.52852 10.1894 9.52852H10.1501C9.90384 9.52852 9.70418 9.32886 9.70418 9.08257V8.96009C9.70418 8.78144 9.55936 8.63661 9.38071 8.63661C9.20206 8.63661 9.05724 8.49179 9.05724 8.31314V8.25437C9.05724 8.04326 8.8861 7.87213 8.67499 7.87213H8.65289C8.42958 7.87213 8.24855 7.6911 8.24855 7.46778V7.17134C8.24855 6.78431 7.9348 6.47056 7.54777 6.47056H7.43987C6.99325 6.47056 6.63119 6.1085 6.63119 5.66188V4.1252C6.63119 3.66127 6.2551 3.28518 5.79117 3.28518H5.62752C5.25397 3.28518 4.95115 2.98237 4.95115 2.60882C4.95115 2.23528 4.64834 1.93246 4.27479 1.93246H3.99287C3.46362 1.93246 3.03458 1.49947 3.03458 0.970218C3.03458 0.436584 2.60198 0 2.06835 0H1.59715C0.715067 0 0 0.715067 0 1.59715V3.28518Z" transform="translate(60.4883 136.168)" fill="#7EBD91" stroke="#CCFFBF" stroke-width="0.381182"/> +<path d="M0 1.72904V7.76449C0 7.80153 0.030024 7.83155 0.0670605 7.83155H12.6431C12.7171 7.83155 12.7772 7.77151 12.7772 7.69743C12.7772 7.62336 12.7171 7.56331 12.6431 7.56331H12.5208C12.4837 7.56331 12.4537 7.53329 12.4537 7.49625C12.4537 7.45921 12.4237 7.42919 12.3866 7.42919H12.3728C12.3282 7.42919 12.292 7.39298 12.292 7.34832V7.25562C12.292 7.1663 12.2196 7.09389 12.1302 7.09389H12.0691C12.0135 7.09389 11.9685 7.04885 11.9685 6.9933V6.97357C11.9685 6.92891 11.9323 6.89271 11.8876 6.89271C11.843 6.89271 11.8068 6.8565 11.8068 6.81184V6.79212C11.8068 6.73656 11.7617 6.69152 11.7062 6.69152H11.645C11.5557 6.69152 11.4833 6.61911 11.4833 6.52979V6.38384C11.4833 6.29451 11.4109 6.2221 11.3215 6.2221C11.2322 6.2221 11.1598 6.14969 11.1598 6.06036V5.96767C11.1598 5.923 11.1236 5.8868 11.0789 5.8868C11.0343 5.8868 10.9981 5.85059 10.9981 5.80593V5.75268C10.9981 5.6786 10.938 5.61856 10.8639 5.61856H10.8363C10.747 5.61856 10.6746 5.54614 10.6746 5.45682V5.31678C10.6746 5.15012 10.5395 5.01501 10.3728 5.01501H9.93889C9.80927 5.01501 9.70418 4.90993 9.70418 4.7803C9.70418 4.65067 9.5991 4.54559 9.46947 4.54559H9.25842C9.14731 4.54559 9.05724 4.45551 9.05724 4.34441C9.05724 4.2333 8.96716 4.14322 8.85605 4.14322H8.61739C8.41369 4.14322 8.24855 3.97809 8.24855 3.77439C8.24855 3.57069 8.08342 3.40556 7.87972 3.40556H7.43987C6.99325 3.40556 6.63119 3.0435 6.63119 2.59688V2.5673C6.63119 2.10434 6.25589 1.72904 5.79293 1.72904H5.30713C5.11053 1.72904 4.95115 1.56967 4.95115 1.37306C4.95115 1.17646 4.79178 1.01708 4.59517 1.01708H3.54312C3.26226 1.01708 3.03458 0.789403 3.03458 0.508542C3.03458 0.227682 2.8069 0 2.52604 0H1.59715C0.715067 0 0 0.715067 0 1.59715V1.72904Z" transform="translate(86.043 143.219) scale(-1 1)" fill="#C99957" stroke="#F0D165" stroke-width="0.381182"/> +</g> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(35.6055 107.762)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(35.6055 111.148)" fill="#636363"/> +<rect width="9.41476" height="2.02908" rx="1.01454" transform="translate(35.6055 114.527)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(35.6055 117.91)" fill="#636363"/> +<rect width="8.06979" height="2.02908" rx="1.01454" transform="translate(35.6055 121.289)" fill="#636363"/> +<rect width="9.41476" height="2.02908" rx="1.01454" transform="translate(35.6055 124.672)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(35.6055 128.055)" fill="#636363"/> +<rect width="6.72483" height="2.02908" rx="1.01454" transform="translate(35.6055 131.438)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(35.6055 134.816)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(35.6055 138.199)" fill="#636363"/> +<rect width="8.06979" height="2.02908" rx="1.01454" transform="translate(35.6055 141.582)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(35.6055 144.965)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(35.6055 148.348)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(35.6055 151.727)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(46.3672 107.762)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(35.6055 104.383)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(46.3672 104.383)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(46.3672 111.148)" fill="#636363"/> +<rect width="12.1047" height="2.02908" rx="1.01454" transform="translate(46.3672 114.527)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(46.3672 117.91)" fill="#636363"/> +<rect width="10.3754" height="2.02908" rx="1.01454" transform="translate(46.3672 121.289)" fill="#636363"/> +<rect width="12.1047" height="2.02908" rx="1.01454" transform="translate(46.3672 124.672)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(46.3672 128.055)" fill="#636363"/> +<rect width="8.64621" height="2.02908" rx="1.01454" transform="translate(46.3672 131.438)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(46.3672 134.816)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(46.3672 138.199)" fill="#636363"/> +<rect width="10.3754" height="2.02908" rx="1.01454" transform="translate(46.3672 141.582)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(46.3672 144.965)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(46.3672 148.348)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(46.3672 151.727)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(89.4062 107.762)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(89.4062 104.383)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(89.4062 111.148)" fill="#636363"/> +<rect width="9.41476" height="2.02908" rx="1.01454" transform="translate(89.4062 114.527)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(89.4062 117.91)" fill="#636363"/> +<rect width="8.06979" height="2.02908" rx="1.01454" transform="translate(89.4062 121.289)" fill="#636363"/> +<rect width="9.41476" height="2.02908" rx="1.01454" transform="translate(89.4062 124.672)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(89.4062 128.055)" fill="#636363"/> +<rect width="6.72483" height="2.02908" rx="1.01454" transform="translate(89.4062 131.438)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(89.4062 134.816)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(89.4062 138.199)" fill="#636363"/> +<rect width="8.06979" height="2.02908" rx="1.01454" transform="translate(89.4062 141.582)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(89.4062 144.965)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(89.4062 148.348)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(89.4062 151.727)" fill="#636363"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(63.8516 114.527)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(64.5234 113.176)" fill="#5F7866"/> +<rect width="0.672483" height="1.35272" rx="0.336241" transform="translate(65.8672 113.176)" fill="#5F7866"/> +<rect width="0.672483" height="1.35272" rx="0.336241" transform="translate(67.2148 112.496)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(68.5586 113.176)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(69.9023 114.527)" fill="#7D6A4F"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(71.25 114.527)" fill="#7D6A4F"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(72.5938 113.848)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(73.9414 113.848)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(75.2812 113.176)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(76.6289 112.496)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(77.9727 113.176)" fill="#7D6A4F"/> +<rect width="0.672483" height="2.70545" rx="0.336241" transform="translate(79.3203 113.848)" fill="#7D6A4F"/> +</g> +<g style="mix-blend-mode:luminosity" filter="url(#filter1_d)"> +<g style="mix-blend-mode:difference" filter="url(#filter2_dd)"> +<rect width="96.165" height="52.7562" rx="4" transform="translate(347.164 101) scale(-1 1)" fill="#545454"/> +<path d="M0 4C0 1.79086 1.79086 0 4 0H29.5892V52.7562H4C1.79086 52.7562 0 50.9653 0 48.7562V4Z" transform="translate(347.164 101) scale(-1 1)" fill="#808080"/> +<g opacity="0.4"> +<path d="M0 3.28518V14.7525C0 14.8229 0.0570457 14.88 0.127415 14.88H12.5223C12.6631 14.88 12.7772 14.7659 12.7772 14.6251V14.532C12.7772 14.4427 12.7048 14.3703 12.6154 14.3703H12.5811C12.5107 14.3703 12.4537 14.3132 12.4537 14.2429V14.1963C12.4537 14.1517 12.4175 14.1155 12.3728 14.1155C12.3282 14.1155 12.292 14.0793 12.292 14.0346V13.6401C12.292 13.5508 12.2196 13.4784 12.1302 13.4784C12.0409 13.4784 11.9685 13.406 11.9685 13.3166V13.177C11.9685 13.1323 11.9323 13.0961 11.8876 13.0961C11.843 13.0961 11.8068 13.0599 11.8068 13.0153V12.8756C11.8068 12.7863 11.7343 12.7139 11.645 12.7139C11.5557 12.7139 11.4833 12.6415 11.4833 12.5522V11.9837C11.4833 11.8944 11.4109 11.822 11.3215 11.822C11.2322 11.822 11.1598 11.7496 11.1598 11.6603V11.2658C11.1598 11.2211 11.1236 11.1849 11.0789 11.1849C11.0343 11.1849 10.9981 11.1487 10.9981 11.104V10.837C10.9981 10.7477 10.9257 10.6753 10.8363 10.6753C10.747 10.6753 10.6746 10.6028 10.6746 10.5135V10.0137C10.6746 9.74576 10.4574 9.52852 10.1894 9.52852H10.1501C9.90384 9.52852 9.70418 9.32886 9.70418 9.08257V8.96009C9.70418 8.78144 9.55936 8.63661 9.38071 8.63661C9.20206 8.63661 9.05724 8.49179 9.05724 8.31314V8.25437C9.05724 8.04326 8.8861 7.87213 8.67499 7.87213H8.65289C8.42958 7.87213 8.24855 7.6911 8.24855 7.46778V7.17134C8.24855 6.78431 7.9348 6.47056 7.54777 6.47056H7.43987C6.99325 6.47056 6.63119 6.1085 6.63119 5.66188V4.1252C6.63119 3.66127 6.2551 3.28518 5.79117 3.28518H5.62752C5.25397 3.28518 4.95115 2.98237 4.95115 2.60882C4.95115 2.23528 4.64834 1.93246 4.27479 1.93246H3.99287C3.46362 1.93246 3.03458 1.49947 3.03458 0.970218C3.03458 0.436584 2.60198 0 2.06835 0H1.59715C0.715067 0 0 0.715067 0 1.59715V3.28518Z" transform="translate(290.676 136.168) scale(-1 1)" fill="#7EBD91" stroke="#CCFFBF" stroke-width="0.381182"/> +<path d="M0 1.72904V7.76449C0 7.80153 0.030024 7.83155 0.0670605 7.83155H12.6431C12.7171 7.83155 12.7772 7.77151 12.7772 7.69743C12.7772 7.62336 12.7171 7.56331 12.6431 7.56331H12.5208C12.4837 7.56331 12.4537 7.53329 12.4537 7.49625C12.4537 7.45921 12.4237 7.42919 12.3866 7.42919H12.3728C12.3282 7.42919 12.292 7.39298 12.292 7.34832V7.25562C12.292 7.1663 12.2196 7.09389 12.1302 7.09389H12.0691C12.0135 7.09389 11.9685 7.04885 11.9685 6.9933V6.97357C11.9685 6.92891 11.9323 6.89271 11.8876 6.89271C11.843 6.89271 11.8068 6.8565 11.8068 6.81184V6.79212C11.8068 6.73656 11.7617 6.69152 11.7062 6.69152H11.645C11.5557 6.69152 11.4833 6.61911 11.4833 6.52979V6.38384C11.4833 6.29451 11.4109 6.2221 11.3215 6.2221C11.2322 6.2221 11.1598 6.14969 11.1598 6.06036V5.96767C11.1598 5.923 11.1236 5.8868 11.0789 5.8868C11.0343 5.8868 10.9981 5.85059 10.9981 5.80593V5.75268C10.9981 5.6786 10.938 5.61856 10.8639 5.61856H10.8363C10.747 5.61856 10.6746 5.54614 10.6746 5.45682V5.31678C10.6746 5.15012 10.5395 5.01501 10.3728 5.01501H9.93889C9.80927 5.01501 9.70418 4.90993 9.70418 4.7803C9.70418 4.65067 9.5991 4.54559 9.46947 4.54559H9.25842C9.14731 4.54559 9.05724 4.45551 9.05724 4.34441C9.05724 4.2333 8.96716 4.14322 8.85605 4.14322H8.61739C8.41369 4.14322 8.24855 3.97809 8.24855 3.77439C8.24855 3.57069 8.08342 3.40556 7.87972 3.40556H7.43987C6.99325 3.40556 6.63119 3.0435 6.63119 2.59688V2.5673C6.63119 2.10434 6.25589 1.72904 5.79293 1.72904H5.30713C5.11053 1.72904 4.95115 1.56967 4.95115 1.37306C4.95115 1.17646 4.79178 1.01708 4.59517 1.01708H3.54312C3.26226 1.01708 3.03458 0.789403 3.03458 0.508542C3.03458 0.227682 2.8069 0 2.52604 0H1.59715C0.715067 0 0 0.715067 0 1.59715V1.72904Z" transform="translate(265.121 143.219)" fill="#C99957" stroke="#F0D165" stroke-width="0.381182"/> +</g> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(315.559 107.762) scale(-1 1)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(315.559 111.148) scale(-1 1)" fill="#636363"/> +<rect width="9.41476" height="2.02908" rx="1.01454" transform="translate(315.559 114.527) scale(-1 1)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(315.559 117.91) scale(-1 1)" fill="#636363"/> +<rect width="8.06979" height="2.02908" rx="1.01454" transform="translate(315.559 121.289) scale(-1 1)" fill="#636363"/> +<rect width="9.41476" height="2.02908" rx="1.01454" transform="translate(315.559 124.672) scale(-1 1)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(315.559 128.055) scale(-1 1)" fill="#636363"/> +<rect width="6.72483" height="2.02908" rx="1.01454" transform="translate(315.559 131.438) scale(-1 1)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(315.559 134.816) scale(-1 1)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(315.559 138.199) scale(-1 1)" fill="#636363"/> +<rect width="8.06979" height="2.02908" rx="1.01454" transform="translate(315.559 141.582) scale(-1 1)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(315.559 144.965) scale(-1 1)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(315.559 148.348) scale(-1 1)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(315.559 151.727) scale(-1 1)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(304.797 107.762) scale(-1 1)" fill="#636363"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(315.559 104.383) scale(-1 1)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(304.797 104.383) scale(-1 1)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(304.797 111.148) scale(-1 1)" fill="#636363"/> +<rect width="12.1047" height="2.02908" rx="1.01454" transform="translate(304.797 114.527) scale(-1 1)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(304.797 117.91) scale(-1 1)" fill="#636363"/> +<rect width="10.3754" height="2.02908" rx="1.01454" transform="translate(304.797 121.289) scale(-1 1)" fill="#636363"/> +<rect width="12.1047" height="2.02908" rx="1.01454" transform="translate(304.797 124.672) scale(-1 1)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(304.797 128.055) scale(-1 1)" fill="#636363"/> +<rect width="8.64621" height="2.02908" rx="1.01454" transform="translate(304.797 131.438) scale(-1 1)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(304.797 134.816) scale(-1 1)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(304.797 138.199) scale(-1 1)" fill="#636363"/> +<rect width="10.3754" height="2.02908" rx="1.01454" transform="translate(304.797 141.582) scale(-1 1)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(304.797 144.965) scale(-1 1)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(304.797 148.348) scale(-1 1)" fill="#636363"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(304.797 151.727) scale(-1 1)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(261.758 107.762) scale(-1 1)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(261.758 104.383) scale(-1 1)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(261.758 111.148) scale(-1 1)" fill="#636363"/> +<rect width="9.41476" height="2.02908" rx="1.01454" transform="translate(261.758 114.527) scale(-1 1)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(261.758 117.91) scale(-1 1)" fill="#636363"/> +<rect width="8.06979" height="2.02908" rx="1.01454" transform="translate(261.758 121.289) scale(-1 1)" fill="#636363"/> +<rect width="9.41476" height="2.02908" rx="1.01454" transform="translate(261.758 124.672) scale(-1 1)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(261.758 128.055) scale(-1 1)" fill="#636363"/> +<rect width="6.72483" height="2.02908" rx="1.01454" transform="translate(261.758 131.438) scale(-1 1)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(261.758 134.816) scale(-1 1)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(261.758 138.199) scale(-1 1)" fill="#636363"/> +<rect width="8.06979" height="2.02908" rx="1.01454" transform="translate(261.758 141.582) scale(-1 1)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(261.758 144.965) scale(-1 1)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(261.758 148.348) scale(-1 1)" fill="#636363"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(261.758 151.727) scale(-1 1)" fill="#636363"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(287.312 114.527) scale(-1 1)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(286.641 113.176) scale(-1 1)" fill="#5F7866"/> +<rect width="0.672483" height="1.35272" rx="0.336241" transform="translate(285.297 113.176) scale(-1 1)" fill="#5F7866"/> +<rect width="0.672483" height="1.35272" rx="0.336241" transform="translate(283.949 112.496) scale(-1 1)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(282.605 113.176) scale(-1 1)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(281.262 114.527) scale(-1 1)" fill="#7D6A4F"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(279.914 114.527) scale(-1 1)" fill="#7D6A4F"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(278.57 113.848) scale(-1 1)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(277.223 113.848) scale(-1 1)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(275.883 113.176) scale(-1 1)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(274.535 112.496) scale(-1 1)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(273.191 113.176) scale(-1 1)" fill="#7D6A4F"/> +<rect width="0.672483" height="2.70545" rx="0.336241" transform="translate(271.844 113.848) scale(-1 1)" fill="#7D6A4F"/> +</g> +</g> +<g style="mix-blend-mode:hard-light" filter="url(#filter3_d)"> +<rect width="96.165" height="52.7562" rx="4" transform="translate(129 100.246)" fill="#15095E"/> +<rect width="29.5892" height="52.7562" rx="4" transform="translate(129 100.246)" fill="#010036"/> +<g opacity="0.4"> +<path d="M0 3.28518V14.7525C0 14.8229 0.0570457 14.88 0.127415 14.88H12.5223C12.6631 14.88 12.7772 14.7659 12.7772 14.6251V14.532C12.7772 14.4427 12.7048 14.3703 12.6154 14.3703H12.5811C12.5107 14.3703 12.4537 14.3132 12.4537 14.2429V14.1963C12.4537 14.1517 12.4175 14.1155 12.3728 14.1155C12.3282 14.1155 12.292 14.0793 12.292 14.0346V13.6401C12.292 13.5508 12.2196 13.4784 12.1302 13.4784C12.0409 13.4784 11.9685 13.406 11.9685 13.3166V13.177C11.9685 13.1323 11.9323 13.0961 11.8876 13.0961C11.843 13.0961 11.8068 13.0599 11.8068 13.0153V12.8756C11.8068 12.7863 11.7343 12.7139 11.645 12.7139C11.5557 12.7139 11.4833 12.6415 11.4833 12.5522V11.9837C11.4833 11.8944 11.4109 11.822 11.3215 11.822C11.2322 11.822 11.1598 11.7496 11.1598 11.6603V11.2658C11.1598 11.2211 11.1236 11.1849 11.0789 11.1849C11.0343 11.1849 10.9981 11.1487 10.9981 11.104V10.837C10.9981 10.7477 10.9257 10.6753 10.8363 10.6753C10.747 10.6753 10.6746 10.6028 10.6746 10.5135V10.0137C10.6746 9.74576 10.4574 9.52852 10.1894 9.52852H10.1501C9.90384 9.52852 9.70418 9.32886 9.70418 9.08257V8.96009C9.70418 8.78144 9.55936 8.63661 9.38071 8.63661C9.20206 8.63661 9.05724 8.49179 9.05724 8.31314V8.25437C9.05724 8.04326 8.8861 7.87213 8.67499 7.87213H8.65289C8.42958 7.87213 8.24855 7.6911 8.24855 7.46778V7.17134C8.24855 6.78431 7.9348 6.47056 7.54777 6.47056H7.43987C6.99325 6.47056 6.63119 6.1085 6.63119 5.66188V4.1252C6.63119 3.66127 6.2551 3.28518 5.79117 3.28518H5.62752C5.25397 3.28518 4.95115 2.98237 4.95115 2.60882C4.95115 2.23528 4.64834 1.93246 4.27479 1.93246H3.99287C3.46362 1.93246 3.03458 1.49947 3.03458 0.970218C3.03458 0.436584 2.60198 0 2.06835 0H1.59715C0.715067 0 0 0.715067 0 1.59715V3.28518Z" transform="translate(185.488 135.418)" fill="#7EBD91" stroke="#CCFFBF" stroke-width="0.381182"/> +<path d="M0 1.72904V7.76449C0 7.80153 0.030024 7.83155 0.0670605 7.83155H12.6431C12.7171 7.83155 12.7772 7.77151 12.7772 7.69743C12.7772 7.62336 12.7171 7.56331 12.6431 7.56331H12.5208C12.4837 7.56331 12.4537 7.53329 12.4537 7.49625C12.4537 7.45921 12.4237 7.42919 12.3866 7.42919H12.3728C12.3282 7.42919 12.292 7.39298 12.292 7.34832V7.25562C12.292 7.1663 12.2196 7.09389 12.1302 7.09389H12.0691C12.0135 7.09389 11.9685 7.04885 11.9685 6.9933V6.97357C11.9685 6.92891 11.9323 6.89271 11.8876 6.89271C11.843 6.89271 11.8068 6.8565 11.8068 6.81184V6.79212C11.8068 6.73656 11.7617 6.69152 11.7062 6.69152H11.645C11.5557 6.69152 11.4833 6.61911 11.4833 6.52979V6.38384C11.4833 6.29451 11.4109 6.2221 11.3215 6.2221C11.2322 6.2221 11.1598 6.14969 11.1598 6.06036V5.96767C11.1598 5.923 11.1236 5.8868 11.0789 5.8868C11.0343 5.8868 10.9981 5.85059 10.9981 5.80593V5.75268C10.9981 5.6786 10.938 5.61856 10.8639 5.61856H10.8363C10.747 5.61856 10.6746 5.54614 10.6746 5.45682V5.31678C10.6746 5.15012 10.5395 5.01501 10.3728 5.01501H9.93889C9.80927 5.01501 9.70418 4.90993 9.70418 4.7803C9.70418 4.65067 9.5991 4.54559 9.46947 4.54559H9.25842C9.14731 4.54559 9.05724 4.45551 9.05724 4.34441C9.05724 4.2333 8.96716 4.14322 8.85605 4.14322H8.61739C8.41369 4.14322 8.24855 3.97809 8.24855 3.77439C8.24855 3.57069 8.08342 3.40556 7.87972 3.40556H7.43987C6.99325 3.40556 6.63119 3.0435 6.63119 2.59688V2.5673C6.63119 2.10434 6.25589 1.72904 5.79293 1.72904H5.30713C5.11053 1.72904 4.95115 1.56967 4.95115 1.37306C4.95115 1.17646 4.79178 1.01708 4.59517 1.01708H3.54312C3.26226 1.01708 3.03458 0.789403 3.03458 0.508542C3.03458 0.227682 2.8069 0 2.52604 0H1.59715C0.715067 0 0 0.715067 0 1.59715V1.72904Z" transform="translate(211.043 142.469) scale(-1 1)" fill="#C95E57" stroke="#942C39" stroke-width="0.381182"/> +</g> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(160.605 107.008)" fill="#010036"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(160.605 110.395)" fill="#010036"/> +<rect width="9.41476" height="2.02908" rx="1.01454" transform="translate(160.605 113.773)" fill="#010036"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(160.605 117.156)" fill="#010036"/> +<rect width="8.06979" height="2.02908" rx="1.01454" transform="translate(160.605 120.535)" fill="#010036"/> +<rect width="9.41476" height="2.02908" rx="1.01454" transform="translate(160.605 123.918)" fill="#010036"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(160.605 127.301)" fill="#010036"/> +<rect width="6.72483" height="2.02908" rx="1.01454" transform="translate(160.605 130.684)" fill="#010036"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(160.605 134.062)" fill="#010036"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(160.605 137.445)" fill="#010036"/> +<rect width="8.06979" height="2.02908" rx="1.01454" transform="translate(160.605 140.828)" fill="#010036"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(160.605 144.211)" fill="#010036"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(160.605 147.594)" fill="#010036"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(160.605 150.973)" fill="#010036"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(171.367 107.008)" fill="#010036"/> +<rect width="8.74228" height="2.02908" rx="1.01454" transform="translate(160.605 103.629)" fill="#010036"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(171.367 103.629)" fill="#010036"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(171.367 110.395)" fill="#010036"/> +<rect width="12.1047" height="2.02908" rx="1.01454" transform="translate(171.367 113.773)" fill="#010036"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(171.367 117.156)" fill="#010036"/> +<rect width="10.3754" height="2.02908" rx="1.01454" transform="translate(171.367 120.535)" fill="#010036"/> +<rect width="12.1047" height="2.02908" rx="1.01454" transform="translate(171.367 123.918)" fill="#010036"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(171.367 127.301)" fill="#010036"/> +<rect width="8.64621" height="2.02908" rx="1.01454" transform="translate(171.367 130.684)" fill="#010036"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(171.367 134.062)" fill="#010036"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(171.367 137.445)" fill="#010036"/> +<rect width="10.3754" height="2.02908" rx="1.01454" transform="translate(171.367 140.828)" fill="#010036"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(171.367 144.211)" fill="#010036"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(171.367 147.594)" fill="#010036"/> +<rect width="11.2401" height="2.02908" rx="1.01454" transform="translate(171.367 150.973)" fill="#010036"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(214.406 107.008)" fill="#010036"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(214.406 103.629)" fill="#010036"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(214.406 110.395)" fill="#010036"/> +<rect width="9.41476" height="2.02908" rx="1.01454" transform="translate(214.406 113.773)" fill="#010036"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(214.406 117.156)" fill="#010036"/> +<rect width="8.06979" height="2.02908" rx="1.01454" transform="translate(214.406 120.535)" fill="#010036"/> +<rect width="9.41476" height="2.02908" rx="1.01454" transform="translate(214.406 123.918)" fill="#010036"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(214.406 127.301)" fill="#010036"/> +<rect width="6.72483" height="2.02908" rx="1.01454" transform="translate(214.406 130.684)" fill="#010036"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(214.406 134.062)" fill="#010036"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(214.406 137.445)" fill="#010036"/> +<rect width="8.06979" height="2.02908" rx="1.01454" transform="translate(214.406 140.828)" fill="#010036"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(214.406 144.211)" fill="#010036"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(214.406 147.594)" fill="#010036"/> +<rect width="8.74227" height="2.02908" rx="1.01454" transform="translate(214.406 150.973)" fill="#010036"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(188.852 115.773)" fill="#5F7866"/> +<path d="M0 0.336241C0 0.15054 0.15054 0 0.336241 0C0.521942 0 0.672483 0.15054 0.672483 0.336241V1.69284C0.672483 1.87854 0.521942 2.02908 0.336241 2.02908C0.15054 2.02908 0 1.87854 0 1.69284V0.336241Z" transform="translate(189.523 114.422)" fill="#5F7866"/> +<rect width="0.672483" height="1.35272" rx="0.336241" transform="translate(190.867 113.422)" fill="#5F7866"/> +<rect width="0.672483" height="1.35272" rx="0.336241" transform="translate(192.215 113.742)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(193.559 112.422)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(194.902 113.773)" fill="#7D6A4F"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(196.25 113.773)" fill="#7D6A4F"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(197.594 113.094)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(198.938 111.094)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(200.281 109.422)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(201.629 107.742)" fill="#5F7866"/> +<rect width="0.672483" height="2.02908" rx="0.336241" transform="translate(202.973 108.422)" fill="#7D6A4F"/> +<rect width="0.672483" height="2.70545" rx="0.336241" transform="translate(204.32 109.094)" fill="#7D6A4F"/> +</g> +<rect width="80" height="48" transform="translate(137)" fill="url(#pattern0)"/> +<line x1="1" y1="-1" x2="32" y2="-1" transform="translate(176 58) rotate(90)" stroke="#3289F1" stroke-width="2" stroke-linecap="round"/> +<path d="M30 0H6V118.5H0" transform="translate(302.5 58.5) rotate(90)" stroke="#3289F1" stroke-width="2" stroke-linecap="round"/> +<path d="M30 117.5H6V0H0" transform="translate(170.5 58.5) rotate(90)" stroke="#3289F1" stroke-width="2" stroke-linecap="round"/> +<defs> +<filter id="filter0_d" x="0" y="101" width="104.165" height="60.7562" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/> +<feOffset dy="4"/> +<feGaussianBlur stdDeviation="2"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/> +</filter> +<filter id="filter1_d" x="247" y="101" width="104.165" height="60.7562" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/> +<feOffset dy="4"/> +<feGaussianBlur stdDeviation="2"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/> +</filter> +<filter id="filter2_dd" x="247" y="101" width="104.165" height="60.7562" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/> +<feOffset dy="4"/> +<feGaussianBlur stdDeviation="2"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/> +<feOffset dy="4"/> +<feGaussianBlur stdDeviation="2"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> +<feBlend mode="normal" in2="effect1_dropShadow" result="effect2_dropShadow"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow" result="shape"/> +</filter> +<filter id="filter3_d" x="125" y="100.246" width="104.165" height="60.7562" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/> +<feOffset dy="4"/> +<feGaussianBlur stdDeviation="2"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/> +</filter> +<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1"> +<use xlink:href="#image0" transform="scale(0.00142857 0.00235294)"/> +</pattern> +<image id="image0" width="700" height="425" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAAGpCAYAAABvSeX2AAAAAXNSR0IArs4c6QAAQABJREFUeAHsvQeUZVd5pv2deEPFjurcCigBikhCASRA2IyNsQk2wTbBGLANxmHs4f8nrX/NWvYaMx7HZQ94AJtshBEWFtEWmIyFhEAGCYSy1Gp1tzpUd4UbTvrf99y63aVSVXVV1831bun2PfekvfezT937nu98+/vMVERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABPqIgNNHbVVTRWBgCfzXK7f2VN+yLDNvZ2AbpgKbxrdExTwrpZkdyio2FqGpQ445fsWKqWv1bIP5TmzTcWZuLbVCmFjmB5amkQ3VapaE45ZkOMSt25FKZknBNX80tfVHYtsf4mRh0ab3+haV6nbmusCOzThWcBKbqdat5rk2UiqZoe5jaEchcMyroo60fs5U6n6gHHp/GJVnPu1vji2LuvN1NlFP7bJNBXvV00fNsNzzBWNhgVkEXgce8AG1bqEbWD1ObajoWR3s42MVc5wxCwrg6qcW41WqRnZgyLehKLPiMbOZsdCco1XzRzA+lcTSiczi8cBG4ymrhqNW9SrmzuC62eFYdCSy5FjJSmN1y7zQ4nrNbDIzf9izxK+b7xXQjAmbrhctKZVxvdSslBQsK8yYW0pw/Ki5ad3qUcHCIZw3COwwrg3vQNXGikWbHKvZ+rpnbuzZJK47zwvQ/ilznRKuO7NqFFutOGJOddLSac+y0YKVM7SlhraVAKQeWhIkFoZVqyVlq9UzK1RjcwIX7a9b5dHAJh3UVSvb2FlVXPNmtX0jlrhTAOnb1vERe/jYjP3NfdMWuPjbmHMR/I8PPzTnkxZFQAS6RQDfdioiIAIi0D8EoH0hmpxf8syuzBL7BcuyTzsehCbEt5tBbFBzzlUcbewaq+GrArGvIgIiIAIi0LsEJHh7d2zUMhEQgXkEHFjPYH1+JwzF7/DdzKJq9jqvFHw9rtl7HBgNq1iXepk5HdKfFN+J49iOYXyVdqjOeUj0UQREQAREYBkEJHiXAUm7iIAIdJcAragQl26aJH9dtOjX6TkAgy7cIWI8jvb/qrq3dK/nVL58AJ8nx2Lz486YeGto1PrQtRfswGN9+m2oiIAIiIAI9CQBCd6eHBY1SgREYC4BuDC4I3HykXo1ejUkLvwzIWipLyF6kygNwzD+GHwLrvOc7B5+qXmd0bvwXW64NNQgdkuwPquIgAiIgAj0JgEJ3t4cF7VKBERgloBnzuhMmtzgW/wfAvjoprMiM98M0ZtB9PpRepqThR+pjkdX17207mGll4vi9lpdU/hOTGKyV9YHc9V0QYmACIjAWiYgwbuWR199F4EeJUBbaT45zXF2mcV/79bjqxP459KyO9+Oys8Zdo6C9Fkbpwr/Z/3B8E1RKbajtdjSoGguXR/aVCZrmb3swsAKiFphiF6gIgIiIAIi0JsEJHh7c1zUKhFY0wRShEUbcp3dqefeXE/iCxB+AUJ3vtQ9gShByAY4+FppKvjVDXX3wcxJ/jCehrtD0Tevjd9y9ZnMLhwJzQvRNsaqUhEBERABEehJAm38KejJ/qpRIiACPU6AERZqjnO5W/Y/WUyyHRH8Y126JyxRuNWBu0Pmx7bHcf9gLHR/lFayGxNEbKCfb7sKI0Icg0vD1hSKW0UEREAERKBnCUjw9uzQqGEisDYJOE72HIvcm6pOvCGAb+zJxG6TEvQurLwwtFpq1cR/n6Xhj1zL7qKTL9efRDM3T7Psd06Mq8Kloc4YvEvr8WWfUzuKgAiIgAi0h4AEb3u46qwiIAIrINB0Bsgy5ydiSz7ueMl4SIvtCoUkzxPCRFyrZmPFcunj00FyLbx7D9VKmOy2gvYsZ9cZCN2zdnq2ZT2su/XlHKF9REAEREAEukVAgrdb5FWvCIjAcQJw2YVR13ltlKZ/l6aJ564ixFfu7Quf3yyLn24V76Pp+vqLpstIIZu4LTXE7quk9sIzPNu0EYJ3MpGV9/hoakEEREAEeo9AG73beq+zapEIiEDvEYALrG0quW8e8Z0P1qLYW64Lw8l6EsP3t5ClPzlcKbwT6dCMUR6oSimuMwpiWI9P9ZXH/8WJDk7hZEw4sUJL9Mnaru0iIAIiIAKtJSALb2t56mwiIALLJJBrRGhFeAb811Ip/oMEmSQiGEpXYdx9cs24nU8tMX8yfMdw5t+zxZy/nQxrFoae+YdCTHA7dSeHOrJf7CiavQguDYrO8GTsa/VTAKfuBHc+fI6g+5+1ehWo371MQIK3l0dHbROBASZAgTuUFv44qru/fyxFzFzMKmuVdbeJjdKjGkY2Mun/zXo//HHi1L9e9l0LJ0PMaTt1wTtTMzujYLZ7PaSNwpE1ca+59wxW/jzpSOCcF0fpxWGWfK1gzmNrDoQ6LAJ9QECCtw8GSU0UgUEjgGQQzkQ5+L82bW8qOBC7MOu2yyrmwm8h9mJ/wrOPQ+I+B6HKHohg3c28Uxe8Cb45ZzgoEczIbDgs1SqDTQDSNh9nh0Oe2fY0cy7G04JLN5ad59zz+NRzP3HX9J7Th49dkU+2HGwU6p0I9CUBCd6+HDY1WgT6l4DjZ2466d5Qt+TnqRz8lvkwLMwk16N43FyLkq1+0Xs/HHefjz0TF369PjwSMJct9+td+OiF17LJ0whJlgtdVqAyeASaNzE+F5zNgXkXe2F65cz+8MqZLL6wHFS3rx/27dYHa/aB22IrlqL37B7NJlLcRzUPHTwo6pEI9C8BCd7+HTu1XAT6ikCuCzNnDO6vH0eq4J+E1syTQnRCHLBuBxWmVee5SdV/d1iI31wJM5upOlaAcGVM3ZWUKhyPr9iBr09+g8LvWGVACOTXASY2mm1wvOwiJDO5Jp5wL3SC7PIRC3cnGOyZGcc2DLk2XE7txu9G9tkfRrZlNKhceGbtpswCS9MVXkwDgk7dEIFeJyDB2+sjpPaJwAAQYMKzmu9stiC92Y3SKxgloeEL0MHOUYcgogLSDr8pK2T3zYwk79xTc239TGLlgBPcll+qUWZXnoOvT6YURnphlf4kwKx+vCzwtglONZeksXuJm8bPLTjZ+U4xO9NJYqsfxiOAIMHkSlw7cI/ZsQFu2xj///ONyG7fE9mO8dDKxfhzcVK7txi4uv/pz0tBrV4DBCR418Agq4si0G0CWezsnPbtE5GfXIHsvwgL1h0rGP0vaaWrT3t/5I56P/Jc+xTioK04MkTDpcFsTFq325fWyupnTDre2TjOFqjcp6W+cw1cWi4zp36Jm9hZSexhcwQ3G94bQQIjRZ+Dmxq6KTB19Y5x1/ZPpvbuf6vZnonUdq/zbGzUsTvvrtz0iX+p22jZkzvDykZEe4tAxwhI8HYMtSoSgbVHwIHAwAS1S6ac2qfierST/rrdErvH6UPzRIjQMDIZvD+spdfEFt+dzT6Gpgw/mRSn2K0hMkNCV4aT7Xy8Ui10nkDjbmR2TMehRK+w0L/QKdtVThY9q5amu1Na9mGtdZx01sLf2DvFoY2hxYRHiN0S9ts07Np39yT2gdtrlmDd6etdHOPALSZ7HJs+dd7WonnwjXnKJXGw8z1XjSIgAk8lIMH7VCZaIwIisFoCFAywksWB+5xaEn089eKtjE/KLGjdLg7CnyW09M3E45s856NJ0XmelzkT1K8xn3GfpOSJMiB2ikX0Rf67J6HV4c3N4XOc9XCwPhc3XFfVM+/KmnmXWL1yZuY5boabHSeuY6xxRcYJc4jgYp29LuddnhGE7TqkpR4tOPaZuyP71F2RDYVmW2HVrWPsw4JrkzPRZ303OrYDGfcYpkxFBESgNwlI8PbmuKhVItDfBKAismrwM1OhfcCieD1FZi8VD8K7grBkQepctGG8+MEoi34WT6ptEmIoY+a0Jcp++Oz+5rNC2wQJb5PYt7e6tkTLB2sTR6mpL7E8nDnZMzD78BoMK1wUkkvTtHBulsF9hTGe6Z6AZbolsGQQu08SuvnaE//w3HRj2DICKy4C7f7dbXX75sOxbRxybBguDhTCLm7f4J1j2bHkpiwLYPXXhXCCoJZEoPcISPD23pioRSLQ9wRcJ31dHDt/C4UBmxqEABVEjxU+fIZIsulK/BKEAn6nN+78P7mB9yRt5Xy7mEoHokdit4ODCu6cNOY0rPCj+PG6wC24lzhe+txy1bukkqU7Xade5PCl8Dfh8wQ+UaAodvNjTi5IuUczU/TOda7tO5bae2+t2aNHU9sF/12ONy38PHOCsB8jsf1g/eb0S07m41pahMV3F1mv1SIgAh0lIMHbUdyqTAQGnECuNty3R3H6l1kI0UG/Bq7r0ULLc4TH2gXXfwdyUXw/yrIPU1DBpRN6FjY8fEM29FWjAzRUT8PBswK/T4ndTgwqxoJ3GAhnB335NC9Lr0xi/3Io2kvGguSZ2ZCLCHcxXBOyPFNfyrHL/2PbGgp0JQ8XaLnlhLVtELv37EvsPd+uWQX+2jvGcntwbvXlmfnDWctcm/Kjm+t+PBPjWpl7nXAfFREQgd4iIMHbW+Oh1ohAXxNwAue/xG76hzFm9eQPjXtY7DZBu7BAx1mMR9P+e9YP2UNp3f96UnZtCLnU3CMQTXO+JSuI2XsWZuY/+3TMYqr2QeeaneyDd8RCoAkXLaUV14pQkJcjru2lccW72HXiq9KCc7Yb1NwE2e0c3HTUmPgDw8N01JwI2ZCkDZG70u6yVk5EGy2ajZdcu+VHkd1wZz13X9gGscttTfcJ3sDFUMUj8Gh4tFL7+BOI7xz28l3dSmFofxEYUAJzvsoHtIfqlgiIQPsJQAQgrNM7zU/fkVDs8vnuqWmP9rd1gRo4297x0+Jwzf1oFAdX1D3bNwqfz2AaYqpw4gBnKrXztni2BROUDI+5+6mPJ3rRQ0tUmrlYdEYSJzw989wrA8ueA7PupUgHfU4ae6ElnrleZGnMCwpRP3zMFqNrQ4vgN8XuhjIy70E1f/SOmv3zj2M7bdiB+G1MTptPrIa6h53k9itj584K/HeXutQ/NP9gfRYBEegKAQnermBXpSIwGAT4Qw/Zx8fO73aT+Neaj5SXVAA92HU+9s4wSymL3Z1p6HwsdZKfilOnwhRseHJ9vCS+A5cGfMRj7n7r4/FOdGOBqjIXt6w896sNYJQ9Fx7eVzqO/7wsSS6YdoafYYUEc87qmDiI6ypHjAXwbzgqNI49cR5+Xl3J4+vi/DthxT00k9r7v1O3ew4kthv+uiF+HRmJYaFSQBi7qBh/crKcIjDDUnJ3oaO1TgREoBsEJHi7QV11isAAEOCEL8TYNbeSfnDGi1/r+pQl/VtoMUwDRG6oRde5Nfev8Zz6jQ6s1fmkJ6hezr1zIICmIYz6uqMdHCKyoxs30vTSTv5087JLLalfDkvuVdl4ujvJkjHGQI6pcHHrRD9YLvE6WonvLXZfUeH56xjGEG3bCnH7o/2JfRBid6rKZBLw3UY7ODltfuFxES6EwM8mNs5U/okZBPG/igiIQB8QkODtg0FSE0Wg1whQ7HqJN1JzCzekaf2nOGt9IAxd6ETmJebX7FesWrgjHk//yk0cqyIAVR0qKMZj7vPPhnZbxPLXa+PU0fbMKj8mG8HFACdnO98Lsovjafcqz/UucEeiyzAprJAhXS8nCyLaVy4sc3E75w6Cn9tdODltGLF1NyCe7jfvjexDd9QthDX/NIQhY5QGdmHBwm2BY6Vq9rXd98f3NLq64J5aKQIi0GMEJHh7bEDUHBHoeQL40Ydld6s3M/LxqgN/S+QKzn12e77hy2wghE8aJVYz/8+zjcEDw8fsszPepB1GZIZhCKIrLylxiv4yTzbYu2X0O2jYYz1Etzg/c91n18vBxU5av7roeudkpWQ4mWIEBewWYGIg/XAhdnNRi0M7IW7njgAFKgXtBvjmlnHf8vHb6/aZH0a2DcJ3BIlEMOwnLXlq7CC68b7dCEW2nB48cNJTagcREIEOEJDg7QBkVSECA0MAigGhxs7IkuDGyEsvmRvMf3D6iJ7gsXXmpF72RPpBt+Rci8hYd8NjI7fsTldSG4UoXouFCPKSInaF45zjFbxnOll6XRLY5e7G9FzfqY3WfN+8OIKHAlMzQNTCKzcXhhC77XRTmG3Zom+5NRZbTxuBxR7N++tv1Oy2RxPbAZcGZk9bjtjlUwz0ad+xMPr0kaElLMGLtkIbREAEukVAgrdb5FWvCPQZgdy/0nMudwruP2ZRuj2foNZNBdNmfozFa0G0IYu9TyBT11UwYx8dDL+NZYKjWm0q3IZR9hz8YFzmpM41Wdm51EuTC92SW0oSqEcIQQRTgI8zYi9HvFngDcGTD16OMXSZLVvxbvTHDdG+LaOu/RiT0j7y3bodQMSNszYy4fXyxC77U4WY316JP7dpKj5UwQTG3H1jxa3RASIgAt0gIMHbDeqqUwT6kACMmteNW/gPSZpsypMz9GEfVtTkXLMxyUR6flAu/E0wWXj1xWfB9xNxWg2TmwaxzDob0HSJWGB2lgVI05ulF2Ni2XNnnPC8kZlsPMGdQA0XgwOTKD0aKGupbzmhL1e+5NZDhZbbIaQD3jjm2K0Pxgg7VkfrMtuOyAxsf+6VsYz2JjDv+rD8b/HTfzyzAisxEKmIgAj0DwEJ3v4ZK7VUBLpEABa7zH4yceJ/gERgeNo1Y+h0IHJipGDzI+9VfuQ+MlKwd7iD9K3ZNMI2rqyzU0sugLi9zimGFzh+7aLIydYj7lYu8JncAQnNUOZYNil0u3RVLqdaJNGzdYivO4rXJ79Hf926bURSkdGiu2AUhsXOSQQF9L9SS+/9ZlT/l3s912DIVhEBEegjAoP01d1H2NVUEegPAnysj9/217le/Lf1JEEUJoidNfZDn1s9EVIgctL/FEXBHlg+v4jRW4fX0iS4tSko5y43h36pdXO3NZeb7zy+udx8n7+On1l3czvfWZrrGAMMU+8QMmwn/JWvxrSyK50gO6+SJhvzLb4HyyfUIo2hHHCIvfwUzfPwXD1cKFBpud0GFwaK9L/6atW+/Uhsu9e7VoQrAqM0rKQrLvx5EJcEExmjG+9OkmqGDBW4DexhAmqaCIjAfAISvPOJ6LMIdINAr/12sj2YqRV77hviOPo7F8u52O0Gmx6oE/OvLAwy+/Ge+C+O7XOPIQVtEM1ANGH9ooUMm6pq7nLzgKXWzd3WXG6+8/jmcvN9/jp+Zt3N7XxnmV2HKBsY0CwNhuLhmFbslGZ7rmrs4OAzrduz+Xobx/bJvxS67MVWuCzsP5bm8XXvPxTDX9fLM6nRn5fbV1IooOGpHG8Yy26+fh0SCeeclneGLyxvN+0lAiLQZgISvG0GrNOLwLIILCWclnWC1u5EsePM+L8/FaR/HENBYKL9mi6MGcuwVY9MpPbJW+ujb7gOGW9hOmSIq0XV09xtc5ebJJdaN3dbc7n5zuOby833+ev4uaFdT7zPWUejbYBrDpZ7q00jqxij5uKAhhCclYOzb9zSL4VilhEXNgy59p1HI/vwdyOjW8MZ6718rBZKJnGyvnFiWg3W3WE/+db2NLsVOah5b6AiAiLQZwQkePtswNTcwSRQv6R31EWG+FvhQf+lzj73jzPETl2jEbiecqEh6Zqthy/otx9M7dlnJXb+Ts9mjsDuvdjNytwhnbvcPPNS6+Zuay4333l8c7n5fgrrmDKZk7CYLW8QCienjSG+7viQY5+9O7Kb76rbEJJEbEQYMo7dqWpUilsPv5Sw6t50YAq6GcxP9VyDwFl9EIF+JSDB268jp3YPFAHMfu+J/lA/YfK5E9ed33fdRD/s80alDOvhVM3shtti+29bPStBAM9UGimW5+3a8x8p5BBlK0+ZTAv2osK9x3tCFwa+to/nkyvtvd+s2rceSWzLsGslWK5Pxarb7DL/Kn3cEXiuUztUrd2UIexafrcx90ajubPeRUAEepqABG9PD48at1YIbH4ciqMHCifn1FL/ukOZd03GlFLHTYk90LgeaALF02Zk5bp/f2r/9J3IXn5taC4EL8Vjv03mywUvrLuYlJhbQPtNw7G9uUsJ2O9E8oiDyOj2f2+t2v2HUrgwYFIZdqBldzWFdaR4xAGX538umfuAh8lqeRKN1ZxUx4qACHSFgARvV7CrUhF4MoEtCILfCwVhGOy+sv/GCtKuljmPqRca1WNtoFA8DaL38z9I7NIzEzt9s2fTh1NkFOuxhi6jOXRn4OP6CFbrfvNsoNiF5dW2wmXhngOpvffbVZtEVIkzN0CUYttqxW4TH32AEy+5yUV0h5QqmidXEQER6DsCErx9N2Rq8CASiD0ozC4X6rWjXnruwaL30gJ+5WXJWnhAKKRG4Cs6Uc3so9+M7D//HB6dw7Whis/9ZOWlbuMrxK9AFYKXMo4WzX4otLSPFRs+u7f8OLJPfj+2ItwXdiG5BLe1SpLm1t16tm/jkcrnPZy1VeftB8ZqowgMGgEJ3kEbUfWnLwkcXtdd+xrn59Od4VDsvzFN0pEQv+wriLzUl8xX02iKqu0QV/fuz+yLd8b2wst8c6utE1qradtKj/URcs7NLZc4sscVLwUnbzg2Dzu5K8ZH7qjZl++PbT1uQEYRRYPxdVtZUtwRjBSCz4+Ugr1ZM95ZKyvQuURABDpGQIK3Y6hVkQgsTuCJrYtv68QWh+li02wsetz75SLS5mb6ZlgSe/5UG+JwK0TvZ34Q2zMQsYHL08cgHvvItYH9QI6Jhh8vlntZ76YQs9TlOxFf9xD8pv/22zW794kEk9Xc4/F1lxy0FW4km0IVdt1z4hseR+xdBuI9pfKVUzpKB4mACLSYgH7WWgxUpxOBUyGQTjClVfcKRVohKr4qm8m2MSxZb0uf7nGaWzMzeA3hsfrEEbMbb4/sN18U5u4BeRavXlaOczpBoyXcYHPRG1PQ9Wi7aVFneLzteBJy/xOpveffqna0ltlufObV2ip/3TloDCmWrVDK7q+Fta9NowJXjzzm4tGyCPQdAQnevhsyNXgQCTyw54mudYuPbX3f888a2vaGhnWyR1VP1wgtXDEpMUrVJkyauvPRxG7/cWKXneNZPEEJ1j+lKXhP2YLZ5q5SzA6FDpJJOPb1ByL76HfrSJrh5JZe3nTk1vYWt4EjOIwZffsK0c33HKhMF5M+Mtu3mIVOJwKDQkCCd1BGUv3oawLu9tGutT+DD+eOavgit+JclcG1QXJ3+UNBYRRAC41h0tonkdXr3O1uPqFtahrZ6fpEI7EPHq368BegeOyViXdsCyMxbETWtALad+OddfvsPZFtAGsmmGCiiXaVPOeckyVRtXrDFGzISdbGytrVCZ1XBETgSQQkeJ+EQx9EoDsEqmN5bteOVw49YQlErhuV39DPyQc6Dm5OhfQtHceEqYcOZ3bzHZH94vMK5sPHlGKN1tNeLxSWTDPMpvJ66IUms018MeTYTJTZ+26r2Z17Ets6OptMos36k4K37qTfCSfr/3bZ5OqIfL7XLwC1TwTWCAEJ3jUy0OpmbxO44MHV/aieau88OHFOD/kXIMDAS/szxsCp9rx1x1Ek8nUaxNmXfpjaRacn9ozTkXYYvqbWB1Zetp3xeJFTwRhzttuKl/66FOBbkTzigYOJvf/WWj5JbTc+s3B7OwumbFoRZu6jSfrJGu5YkHiwndXp3CIgAh0iIMHbIdCqRgSWIjAys9TW9myj0GGiiTAqvP7wkOMjuL4m5pwiak7+GkIo5RIm83/sm3X779uLVqJ1Etm/KCZ7udCSyrTCdM2ImFyvS4Wysg4xy3TAzGZ364OJfeS7NcjNzLbDstsuf9353eXktFqQTUWOfTpwhhoh2+bvtKLPEyvaWzuLgAi0h4AEb3u46qwisCICd2/ufJQGWrLM9Tetr7q/XIRDZNLjwmxFQLuwMy2P28Yd+zHSDn/6tthefnVgPnx56drQK36xS2Hx4Seb1bpjzQSi3HK7Dq4ho/DR/fQP6vaJOyPbhHi74yW35fF1F+PAv4kCJqjNZPaluGh3+bGveNSLwdJ6EegzAhK8fTZgau5gEohLmzresQwqbLgSvbKQxKeludjtjtjpeMfbVCEtpbRC7sCj9y/eFdvFO1w7c6trM0epeNtUaatOiyYyHi/dGpqhylp16pOdJ/fXxU5bIG55c/Dub9bsWw/FtgvxdWkxb+fktKe0DdbdCG4MI0F200iRKYp7feCe0gOtEAERWISABO8iYLRaBDpJoJh1dtIaLY5x4oTDUfJGB7OuEjx310/76kecIbSY4tYgHP/xjtj+40+HVoCrQxUG/F6ewAadmSfMoGuDtdlHdi5l8vJQ5za4f+zBjQEzpz1wJLPTN7gWYn1nxS5iUUPxV6L00IFj1c8OI+kEQ/apiIAIDAYBCd7BGEf1os8JHHkY2Qs6VPgTnsKMt2k0+Omy715ahfqV2G0NfHLkxK/T4IN674HUvnR3Ytdf6JsH59Relk7UdRSeTDMcJZiohY60u70Us/R73jjs2u2PxPb336uj7iy37NLK3O7JafNHPENqbT718C25uToR7685bQ4FMb8B+iwCItBWAhK8bcWrk4vA8giMdvDXndbdSj2xkgVvznxMCYLAkeBd3jgtdy8aSsfLZp//fmQX73TzpAlTk70fm9fHL4IDa3QnxO4oYumug2X38z+I7B/BaQRZ6zaPuHkyj+VybuV+0LuWYNJeMpLcvG4kwN9Ei/4qbm9lK3UuERCBUyUgwXuq5HScCLSQwGWjnftTpPWuFgfP2mfeC6swR1IAq7SWAH1RRzAB65FDmd3w7cje+lMFC6uZxRBUudtAa6tr2dlCCl5cD7T4tuO64HnpMcH4ukzM8e6v1eybub+ug+gMTiMsWst6s/wToVnmZ655BfvR/qH4C4xN7ch/d/kAtacI9AGBzv3K9gEMNVEEukXgCczu70TJYLXy0hg+pd7r6rGFTr+EEOgEnBbXQf/UzWOOffuBxK68J7ZLz8PDcsbm7dFC0Ue3BgryXPC2uJ10U2DZhhBjBxEG4f23Ve2HiGhxFib5ccJcBDSd+StotGP+vz6eduyvx5+e3OdOe/0QQHl+B/RZBERgSQISvEvi0UYR6AyBoenOBOJ1ISpmhgs7Kl7wSx7MjU47zHidQdbztVDfMabs+JBjN9wa2Xk7PCvDsjkN14ZejM3LTHtsV4DgzLU6pCdEaKtKPpkPvzYbEYnh7v2JfeiOuk1UIXYxOY2FHj3dFLt5VzPPHqhUbzwQVZF4woNbx6xCbxUEnUcERKCrBCR4u4pflYtAg8CGI5WOoAiSxB51gtfAd3dDNwVGRzrbA5VwYtZmiNwHDmZ2I1wbXvv8wALc2+QCr8cGgPKO9z+0tvJqbJXeJYMx+OuOI77uLfdEdtNdkRXxy7OTySQgdHuhJHBnCIP6dy4fj2+PIHwb/rutGaCv9EIH1QYREAFMSFURARHoOoFDG4Y60gYImkIlDd9I665KZwjQurllzOzr98b2rNNde/ou3+IjXTZpLtF1Zlyj1MsF8BL7LWcT3RQ2QfAzVNsHbqvZ1x6IbdOQa8OIzkAuvVDYzyr8OM63mZueVzoSV9LW/iz+j17opNogAiIgwatrQAR6gcD+PHhrm1uCkFOWhj/jVLzz3Iyzp9pcn06fE6Dvagn+ocUgs4/fGtt/3uJZCdbOSgUe1T02BmxrAL1HX166OJzqBLumvy6TRxyppPZXmJz2I/gv716HiWE4d69YdjlATCUcWla9289uPJAMI/lFqwelpr8EERCBHiDQ2lvZHuiQmiAC/Ujglvvam1o4hgIpwXR37Wb31wuWGDPItvpnvR+5d6rNFHibEHLr4YOp/TNS5r7k8sBc+A3QyNlL49D042UEhXoEMXgKgCh2GQlkC1wWHjyU2nu/XbUnkGKZ/rqcDJe7c5zCedt1CKMxuGHyr98fqf1whpEa2lWRzisCItBVAhK8XcWvykWgQWDXKHKotrEkUBpFz70mdOwFMR9W43+VzhKg2NsEEXjLDxO7aJdnuza6NoXsYhSXvVJ4WdDqHM4K3pW2i2J2CBfZBsQg/saDsX3sznoufs9AJAZua0f0h5W2ce7+iEKdd7gepp/YHOFvsOXW3bm1aVkERKCbBCR4u0lfdYvALIHz17fvT5EWRP6OF1PvTdV65ioSWXcuO1o+y9BUE5i09onvNNIOF+HLWmPa4VMxpbapGxSleQIKXjjLLBTKFLSbEYWhAPPux+6s2Zfvi2206NoYEkp0NEXwMtvMRBM1gC+72YELjjpf8NISjswl8DLPsLzd3r283bSXCIhAmwm071e2zQ3X6UVgkAgkp/TweHkEKEbcNNtdrWYvT5EuVaHIlsetHXtR9DJqww8eTezrd8f2nIsDi5CCuJcKrxffZ+g0iD98OJmfMfvEY7aPuTZdz+y9/1azf388hksDxC9+YSiEe7Nk8NfNJ9B9uZimj9VTKHyqYBUREIGBJCDBO5DDqk71G4GAyqAdhWIEcVX9mr0uduJRWnpXYLhrR4vW9DkpIJnNbCP8eT9+W2zn7fRsI4Th9BEIzDZdAisFzjZC65oPq3PEuY2LXDBcTTHLSWjb1jGrXGLv+mbNDmMy3m64MFAI90okhoUYIJeaYRgsTeKPHoBxN5Gfz0KYtE4EBoZAj3zFDgxPdUQETonAkaH2TVpDCP3R0pT3ehfxUA3hofS7fkpD1LKD+Hh/HaLQ3XfA7B++FdlvIO1wEPZO2uHcpQFC0EdUjxondC3Sc4Yco6/vljHPbn84sg9/p45JeBC7iMRAIUzBu4hWXuSMnV3NzGpRmt2/f6L6RaeXfEo6i0G1icCaISDBu2aGWh3tZQI797d+5hKfzuKJrU0U7RVpnJ6V+bBpaVJOT1wGFL3bYRX99kOJXQrXhmc/3bcUEQ0wZD1ReJkwAcVChYKYfuDrkUGuHDj2qe/X7ea7IySXgLtG2T3ur9vLYpd3fU7CBBPRTYfNnXLozqAiAiIw0AQkeAd6eNW5fiGw6XB7WupC8VY3Oq+bsQgT11y5KLYH84rPStFYgKCkaPzUd2N7xg74kiI278xMj8TmRfs4cY2uDWxr060Bi7nldiv8kGtwd6C/7r89EttWRJ/ghLxenJy20OBkUPQRcgdvHkpu3gihTvcGFREQgcEmIME72OOr3vUJgRm/9S4NnG8O793nVlLveZyopvk4vXUx0L91AwTvo4cz+8z3InvVNQXE5s0argBd1l8UuS4EOV8p2snm0Krr4TraCcv03onE3ndb3fYcTY3JJWgNjuky0wel2Re/lN1e94OveplPe28ftFxNFAERWA0BCd7V0NOxItAiApPw4Wxpwe+3BwFSCe0tqZOap0e2LcXbipNxxOnrytS7X703tQt3JXY+LL3TEMBOl7+Z2Ta6tVLI0mpLf90S/L83jzl2x8OxfeiOWi7Mm/66vTw5bf5YoSvmBK6VppNPZkeSrN40X8/fUZ9FQAQGikCXv1YHiqU6IwKnTGB6d4stTIjMEFSdM2qHvZ910z4xvZ0yvf49kJZURm1g+eTtkf2XbQUrwrWhVoXoXWy2WGP3tv6bW3hn2zaNjHBjaNN6xNj94o8iu+Hf6zYE313G3KVVl+K4rwoa7DpOFHvOzSliBmf021ARAREYeAISvAM/xOpgPxAoBcda1ky6MvCHfGJ63RvcyEY52z6TFatlfFt9IlpHT0NosvuRdvhzd8b201cg7XCN7ijdLawfyYBt07BrASIavO9bNfsqsqftQLzdoT7y151PMcadBNJr3zJarNyVIDGGigiIwNogIMG7NsZZvexxAj5mjLeqOHDWjRNn1Ju2X3bhziCx2yqy7TsP7k9sGyZ+cQLbro2OPXO7ZzPHum/lLZcgxPeldtNdkd13MLFdCDlWnHVzaB+N9p2Z7gw+LLo76+nNo1mSh1FrX206swiIQC8RkODtpdFQW9Ysgekj61vXd4gnP3NfVYiiM+sQvJiu1rpz60ztIYAhok23Emd2lMb+nViBGxdaWbs2eqjcRwSDH8Py/C347V6yzc3j7tbgxtC1Nq2SPh520Gx9+DE3/fSjaRH94AoVERCBtUBAgnctjLL62PsE0qh1bXQsTCL39TEi/yuNcOuwtutMzFQ2UzXbN5XZr11VsKt2+DZzNDEPllRGSOhWoRSMEDXixRf6VoGLxc0/rNtZG7w8AxsjNvRbYZMDhCObDrPP7CnEj8K827fCvd/Yq70i0AsEJHh7YRTUhjVPwI+YAq01BXbBZyKD1NWMziDrbmuYtussnC/FKAiPT6f28mcGds1Zvu05lFmpaDaKbGzdFLzsc4xYuwaz6CsvLdgMrM9fvj/KRS/bzUxq/VTojzxRCOySx499audMxaq8o+hAeU8H6lAVIiACJycgwXtyRtpDBNpO4PGsNZPWmKtrKAs2FgzOl5zmz+n2Kj1JgJZdWkr3Hkvtp88L7WcgePdNpHmosghCM4MFstvCkm2so5GT1dTecHkhdwH4+oOJ7UDsXbo19M/VlYG1j1Br0cO7pqZuOf1wajMh1byKCIjAWiEgwbtWRlr97GkCSQpl0YJCwRu7zlgZ7/0UG7UFXe+rU1As0kK650hq15we2M9fENgRWHlp7WWYsih2rI5UYCEN/11UlWxjAe05iovp8LRrr31WwabqNfv3xxuil24BXWzeisacHtFjqX3we2ePHL2Dcan5P975Hyd2Mp1yW24QH3x8Re3UziIgAu0hIMHbHq46qwisiMDWYN2K9l9q5yxNd0QRgqcyc4BKzxFgRAaKxAcOpfbs3Z69/nKIXfjKTsKPl4kemqUGt+5c8DZXdOGdDwjY1qGC2aHJDJnXHPuVKwr23ltr9oN9iNoASy/36XX3BnizwycaFt2Z8qOTznqE7UOj8TEqpbgxrFkAQe8njiUwaVP3trZI8LaWp84mAqdGQIL31LjpKBFoKYHIgdppUYEm2eFB7MLlEpPWWnRSnaYlBDgc9DR5CGL3wi2uvRnicQpZpScxKWyu2OW41WHlTaEkudxNzxSK2QCWZlqeJ2ayPOHEm68I7U++UrOH4YJxBkKV9XpuE3JHNwx/Z39USMNHwiT8Qgrm9SJcSLKahUh5F9SwF8zZTjdht+Qq00lEQAQWIiDBuxAVrROBDhMYPlhrSY0e1MlE2d8cDwcW1lM+cVbpIQL0yX0Ebgy717v2tucUrQZRe3gmtRAimIKsWZqT2eqwQhaQ5KGbGoy+xPTlpSDn8sHphuj9reuK9r++VLGH4A97BvpDd4y5fWj2pVfeHbgNZUG6vm7H/r5QGX+lOd4tDEtGm24ezYTQdYfYK8OldohAywlI8LYcqU4oAisnUB7BM+OTFIdq4yQlSDNnsuhvrGCiUUiVpB/wkxDr3OYAonE/3AK2jDj29msKmJzm2AH47YYUkos0oxo5Vgy7a+Vl2+iGQQtvHW4WFL770I/tyLj2jmtL9kdfrtpjSJLBfvW637iTwRrtJOtq/sTNYTr+UuQV/sIi6LVaBERgwAhI8A7YgKo7/UngQLLEjPFZ4Zp6S/+5UpiETlaqO3ZasJiC6k88fd9qH2L3CVhGi6Fjv3ZlwUbw/hiiM1DsLlZwCNwaGpEcuNzNIc2vLbg10POGlyPbve9oatvhw/tbzynYn3+tZk8gjvCmIYjebjZ0MZhz1juZZ0mYFGPn2McyZ+gVlrpfghfynD20KAIiMIgE+D2qIgIi0GUCcaVmS76qdavDOlXDY9lK4lp1kdd05o0EUTbqw7UhlXW3y6PaqD6AODwAMcgn5r9xVWinDbv2OCyiFMFLFc45pG9sDT6+3Z5/mLs1YKIX29x0r3DRr0chejcMufZWJMwoBo4dgqhnf3u9uKlnqR+NZzZ1s+Okz0dSOxUREIEBJ3CSr9wB7726JwI9QoA+hIu+crXDWeQzsAy6th4hdseRmGAcaV/nvtbj82jJNqNLmIbeIx1b482gG8NhRGCoYgbhWyAKT1/v5XF3OXFtOQUaGYK3kQCXy90qFLk+GuBD9DaTYbA9FMD7YalmXN43YQIeJ0oewsQ2it6e15AQvX6clLPAPlkLnOchT4uKCIjAABNY5tfuABNQ10SgDwhQXCDcWB4Wyi/Dp7Loml9wzXvKy1sPh8tRxuNV6S4BCsQjVUwihAB8G3x2zz3Ny+Pu5nOjltk03uswCQUznnXTyptfTegPozXwWmwWLvNBApNnnL3RhQUbUScQ/YBh1go9bunN4+6iN5jcOZ54dkscuD/buLVo9k7vIiACg0RgaafAQeqp+iICfU6AFuAakhHUab6FqEjjBI/JKTkQUh8mOAfPZZPMPS3zPM/HLKPmo+c+73ZfNp+WzwomeE1A+P3q5aFduD2wRw5xvFY2j5DDy4lgnLw24nf3JobXEyeuNRP45ZceRofv3PYoQpQ9fYdnb726aH/59Yp5iH8wWnQs6mHLKZNv5xPyHO9gveRVwkqMeWz8m1IRAREYNAKy8A7aiKo/A02A4sLDP0wA4JQK5paxPOJZMF4wf6xoxZFgY+ieeOw80DB6tHPUS1XM3OIktZ+/KLSrzmqkDKaMOhUtxTGvIWodRSWXu1UafryNKA3zpXfeL7RtL+ILX7TLs1+5rJC7cjC+8Kn0uVN9zAVv6j7gO+4L4CL/L52qV/WIgAh0noAsvJ1nrhpFYPUEIC5o8Y0hbvGPefBHhMylsXcrxUg3hdHqO9efZyB3ujHQovn4UbMXPz2wF50T2AFM7EJegzyW7an0jIKRMW7zmLxwKYBhvyuFhlp6KTRSH2MB7ZpbaCllkorHDqb2nLN8XI2OffSOei54y4glTAa9UnLXBURrKJbSb9Um45cGnn+g6VedpxrOVTpHVEUERGBQCEjwDspIqh9rkgCFbYbkBX5at3JYsZmoUK7ih9zVDJyOXw+54EOtjyARw/Vn+/ayZwZI0pBiwlpjctepNojaC6ewKqy83U41zD7MzQg3v09kwLBk+xGF4tozfZuBhffGH0S2FZ1gKLM8+9/8gzr9mcIcUU7gdvKVsFR/VTztHqB4zyeNIjZyjL8dp4a7Ct01dnpkVJ8ItJWABG9b8erkItABAnRhwPNYSIpRTMS5BPmk8v9oqVLpDAGKUhowH8Aj/eee4dsv45E+J6tVmaihBY5jzHRWw7kYIYGT15qREjrTuxO10ILrw5fYQ4cXcrGgTZQsaJHeP5naf3i6n7t33ATRe/o63JhBEXc7OYUDUeuH3ucSt/ZK9GeKwtaBb3zNjS0Zg4vQdGzuZOXU/E9OoNKSCIhAjxGQ4O2xAVFzRGDZBGiVMmcYb8/CRJsXTyb+T8VZ9swMzpa0Vql0hgBJU+Qxxe4l2zx7EyIVTMxgwhoiNCyVWGK5rWuKyAR3M3UIs+LJk/It99Qr3o8il+LbQ3iyOibS0YWD7ZtfyIMuGAcnzV4KP2YK/8/fU7czEZataQWef0wnPtPNAgFOPlLIol8+7AdWmw6tAEeNGO2LvcjiscDKGLvcustOqIiACAwMAQnegRlKdaSvCVBJLFkakRjyXfg77Nh1WZa80K95L06z9JLUSxC6CpY3bpLYXZJkqzdSFzFr2rmbEJYLEQqm8Rj/KKIztELsPqmtuESQfwTZ2p60tuMfeHnRj5cJMZa6aimMKxDoE1Nmr74c4crqqX3jodh2r6PLDY5d6uA29Yp/OmmWnZGY/2on9T4RpVmMqZ+W0Y2Blt4e8jNuEwKdVgTWLAEJ3jU79Op4LxFwlkgbTF3gWLrR89wroDCusyh7PuTCs5wkdfMJTBAWGYSFjx/sLmiIXsLY0bZQPFHUPXYUMwVHXXsLUgbHcGBtJl5odWMoNCP4ayeog1nOuuXWwH7l4cnQnoXcGub2m3wo/nFTZm+8oojrs2bffiSxneNwHcDxdJHoZOFfCP5Urk6y5Gqvav9vEDh/ij+uv88yBzZeFREQgUEmIME7yKOrvvUNgbCI6feLlDztqW9nR0X/Q9l0tj6G0mFiiTwGLwQFC61THdYOjYrX6L8UuwG+PR9jat0yxO6zC1bC8/39SCHcCp/dhbBSIPIGpwZXgjJcCrpVcrcGCG5vVnSTxVKFWdcm4d7BrHOvv7QA94aa3bU/tu1j8DtHNzrdE9448GbBSZOLwtQ+4LjZWxzP/V/o1z8t1Q9tEwER6G8C+CpSEQER6DaBF54e4sc/XviVYjKNRXuy0P9U0VI/8p1LQwTijRnnCT/empzW+dGju8LDSLQwFDj2n55XsnHEQ94/2T6xe7yHswIRIZi7Vih4KepjWJtr8NOlFfdkpeHe0Nj32YjTe//BxO57AjcL8EDvtOBlW3ORzn/wJwT78y7fT1/jeN4LYPE9mFXTvdFMXE+gjBkBbrWvr+6dZpUqIiACXSYgwdvlAVD1IkAC1585hH/5C/zUFwVtAvNeoegfwvSaz9Qm4q8j9u6ucCg4w8VEpjhN5LdLiB0qtOw+Dp/dELOvfu/5Rds05NpeuDVQ1OVCqp3tQAUM+0WXAorObohFdq8ZKYIZ4JYjePNj0HZmnyvjJuFZO3370f7E9oDj+hIcdrrVkXzAILpRv5+lux3H/cUgS4vrq/E/lzG+GNpVvz7/mARvO/8kdG4RWC4BuTQsl5T2E4EuE+B8Gg/Om8lU5Ut1J/pScWjotVns/nfXDc5GUuH2i60u978Xqqe4ewJuCyHcF373uUXbBt9dxt2FhutIaT6Op1tDGECl0fzYhUKByJjA5EH3AArg5RSK9APIQLdt1LHfeV7R/uiLFXsElnK6N3QzXBmHL0YnDmfpd8+Pk49eVkD8ZPqQqIiACAwMgWV+TQ1Mf9UREeh/AvghdvHjfGii9iGz6auGxqI/SzKvlmK2OUKMds/s1/9kl+wBxdphxNalxf2tVxVtB0TaHohdru/k3QZFL0N+0dLL5W4Uilz68NI/F81YUaEvLy3iBVhQf/faoq2DD/TjcAfh+m4Utp+JKOAl9I2RNHsu5td9Bzk+OLmtJa9u9El1ioAIPJVAl75intoQrREBEVgZAURtQCD/7FDoVv9juVq/3nedLxaQH5WSjBmHVVpHgGKMcXUR0sp+5fIQ8WQhdjFhjeloO605aXiMIHgjuAcs17LaOhKNM/HyYr/p3kFr70oLs7XtgzvDOvg+vxVxi+kLfaCNE/4WbB86kGLWnBf75vjJl71q7RWYRjcNLyEVERCBASQgwTuAg6ouDR4BaooEpqcUprUIaawSTteH0kjx65yljCNq3xhOohem1egNWdH7cQ1imML3lNTI4OFbVY84Qe0gLLtHIXgZjeGCLZ7thVijdbVbX6C8HujWQG3WLSsvoTZTHa9U87LddIfYA0vvJkxco+h1cZeWu4uAd2cK/kLqiAlcTj6fbqy8GH9O+1faj860U7WIgAi0gkC3vq9b0XadQwQGhgAF7GKvmOIWDo4lZIYqhAUbX1+y0mgJasvPH6c7LsQXZv3kIZ6S+AP1QnJlGKXvRFzeCl0fVvzMeWCorr4jfGRPyy7TBFPsPn2bn4ciozCiaOtWYd1M/JDg0ujWlzgnmgUIj0ZrLe7FTqlQ2x6AO8Pp6x3EMS5iAiZYI24vube3oPGRDzcK91PJhpmXIWfLTBK5CPsGt6Bk9kYCDchvKFb53t5+6OwiIALLJdD2r5XlNkT7icBaJvDyy7ZasVxc8FUoF2y4VLLRchlZtkJbv7FszlDZpqtQGRDDjhNaHY6kNfhEJtOM6BBUt1Rrt9RLyWcj82CPdM7LHzt3U6H14eDSAjmJrGlMJPHWqwt22ZmB7TnECMiwTnaZJd0aOMmLYrOAyWPdiHLAa4p+vDHcK+oIUXYq7hW0ThPlJJxmz9zo2W6kHv7KA3HOmNEc2tUvSlokm7h3bH3t+qEwrpbwiKQcwq94JLZxN7YNcK/Ag5OWCN4PPMJcxSoiIALdJqAoDd0eAdUvAiAwPMqwZEsUiIuE5jyoDOaESiAwPORBrdQ8+FEWLCojUi/cHYpBycqpb/XhuiW19LtRYC8tB+4lUS35M+iS67qs05boYO9sagraaVhQaW18HZIlPOt03/YidixFHiepcZ9uFo4jX1VcC6UilvEhv6npQqMCCG6Hs7xOsbDtFLaPHUntGds8ZGQr2PturcHlwbERpFFmuOmWFtTHGMLFMKuUhhL4u+NnEHVl45mVYKpOQsfuKWMdAauIgAgMDAEJ3oEZSnWknwnkPrkr7ABFF/0e3VmXBj7axkxzeDrAfoX1SdXZ6QWFbUkSbcqc7CFMyLkWx+hn/CScOUGtimfcR2CY+4WLQrv2TIjdw+AJ4UWrb7fFLpvfGHsc7P4AAEAASURBVHtOXkMcZrSVltZuCF4KVbof5J4z4MNJfKdScos1zvU4RO+zcXNB1n97G+44UIZh6WVEipYVnIvtTVJn18FDwbmZZXcePze2wdhrKfqkIgIiMFgEJHgHazzVmz4lEOSxrZbX+BA/1i4mLKVQG0lDCSB0v7PTTZ3THS89z9Logknfv9gKti1I61vwgJiSWEr3JHipqSh2mRxh77HMXnNJaNc/LbB9U5gsiI0Uu71UaBml0b+G9g516ZucIptim64VjByxmrspuolQ6O6F6L0aoreCuGB//726uZjUVoYVeTaxYIuGADLXbMzznC34yzgheFt0dp1GBESg9wh06Wuy90CoRSLQTQKTVFnLLLCGOfXIeVMh9C9x/XQ4ztKzvZp7tp9lG7KgnguDtAJ7LgQEE1JQhqxGiCyzWX2/G+85KKoePpLYy59ZsJ84N7ADiMZAH9VT8U/tCBAMLCevwf27K24NFLxkQ7cGxgZebcktvRiDxxHy7fqzA5upZ/aPd0W2exwh+CiIUV8risMZnqnrVD13s/mokGZdFREQgYEmIME70MOrzvULgS99b++ymzpTT7OLdpYntp02etH0lH91hIlrqYvJa1Af2ewMc5c/6HnRD/lywNJ6G8E14CG4LrziwtBeenFoByB8q7hfWIHxfTlVtXQfisA6xjyCNZQhwlolCFfaSMSDbtxW8bJb5SXHsWA/Dkym9pJnhvBNz+zTd8e2i6IXlmRagVdbqG8duIM4tdr2jFFQJHhXi1THi0DPE5Dg7fkhUgPXAoEJzpBaZpmsxAjOEP5DEMX/UJ2KL/Y2B79ZqLiviFIbz1L8eOdid5WqY5ltGYTdaFWk5nkM1twXndcQuwePQezCYkkXh+atQ0/2lcOMBnLyWjMmbqfbyZBkFKLIet1IM9yCBnBMyP8Q3EleDj/qaUyK+9f7YzsDCT+4jS4mqylw/7E6rOJDFXfL2GSdxt7VnE7HioAI9AEBCd4+GCQ1cfAJhCswIxYwS4jxdRFWyTzfvpe62ZumK8mfeSXn14vmvR6GqxGHs82pCvQ7vuTFQ53Dx/JMJPG8swL7xUsCOziBoKwQkBySVeqqJetu1UboTIOLC0QgrKyz/WnVuZdznqZ/M628NVibW3XNkT/vA70ps9deXoDV17GvPhDlll5agVcreukzHGfOlinUkRGiigiIwEATkOAd6OFV59YCgVnvhbtSq7+9knh/Wq87v1EseW+EeXKDA8tlCvHLvGstUyIDAJU0mka9RycwSeqMwF59UZDH3KXY7XnL7pwxYGQERKTLfWiLXXJrgHY0ZqRbRXSyOT06schxOIZYyBTRr78ssAp8em/fk+SJKlYj7mHgNR9mfbfg7Yg2jiK3sLXAA/lEu5+8dPDJH/VJBESgKwQkeLuCXZWKQOsJcGpanCUPJrH7jqNp/K4NfvirTub/CqTdthQzr2JY4FyqBJVc7NLCd9/B1C7b4SHWbmB4sp1bFPvFsjt3GCngmWoYsWXnru7och6Pt9KwmLfqMmNvOB5M68zr+41XIMlKUrO79ie2e52bT8mkhX6lJf8rgDU68WHh3VYdQUjrIys9h/YXARHoLwL4KlERAREYFAKNeAz4OXecB926/Tffjj07CaP/Epfc+ykc+uIZfZsHg2KM1t37kTXtQiQ6+I1rijYNsXgMSSZyRm2uvx2nZ58iCHa6cDNqwilowFU1K3drgIXXhwllta4GCzWElt6jGJ8IIvXXrirYmRtco2WeNy34/xQLkk3UsjNrycyZ9bRi7XqdYuN0mAiIQIsJyMLbYqA6nQh0gwCfxzIJRQJzl4tn3Jx0TndKz4/3TJSq/xP52N61+bD/c1Oe+zZkaLv8VKxi3ehXy+ukQMLrkcOpnbfJs996bnE2yUSWJ1BoeX0dOiH7xIl3tPKWirSGdrbweqJfLf146U/cjsKJcYdnUts84thbrynZn36lkvtebx9183ByKxL58APi30zBcR7ZOeU/QX94FREQgcEmIME72OOr3vUJgdoKYi1VECwWSW4bE5TYPwiNDZzANu1bDabL+vqCjaY1iN7UsqhkBQjhQ1PhRMF1byn78Svq8FGlQFprhV3m6zFYBs89zbO3XV2wKnxCn5hGSK8+n7TUHM48Jm+h0c8VCcAWXQwhflEqbAwrbzaqRefmaSh6909ltn3U7Hdws/InX6nm0TW2jUH0QvAvq6BdGZx4A6Rv8U+bfq156SMKS7YsctpJBPqagARvXw+fGj8oBDaXwmV3ZRh50xCNwYqYIbQu9szBnJgQP+AelqtlzyaKvg1j5lWFM9Yqgfml7MxN5ryjaOkvIQ3tsLMW1S7o0o1hHzKoMZ7rm68o8JbBDk6nfS92mxcOLaw1mC0jDHur4tU2z72cd4Yny9MMgzPdGpqTApdz7Er2oXsDM+FR5L79OQX731+p5Z+3w/KL0HwnLdTidYRl8KL0HV4p+lqKG4TcGfikR2oHERCBfiYgwdvPo6e2DwyB67dtWEFfMNkGiqICS1dI8QrfzQQiIKNLA2Rchm2w7dLCtjUuur8dzNiv44ixhgEM+6+xwh5TAD6KlLVbRtzcB5SfDyLGKwXaoBReChSddGsIfMq6zhZqzUaaYYQnQ2w8om1XKyjuaanfDtH7W9eE9hdfq9kBWOo3Iw0xBf/iBX7aaJnrJB+JsuzPkwjuPwEOWPKYxc+mLSIgAv1DQIK3f8ZKLR1gAivwaACFhow4HnEBP/74P39x0hq8G5CAwnlrXPN/I/azHUxblcvctad18yuG4nYPUtWuL7v223gMXi449jji7tJSOGiFVtUKboC6kmqYlyWYMgEGE2G0S+xyzHgp82blMYzrTljs3w73lP/91RpcdzLbCNFbX0jAwm83pStDlt25eVP116DJ4XeMVtbR6HY2lg1WEQER6DoBCd6uD4EaIAIwMLVgFhnPgTlDbwni5P+bqKfbOHmNeVjXqgsDrytGXeDj7wJy8P72tUUbLzn2MCyDgyh22V9aeRO6NUBwFuAls2y/Vh7cgkIhSj9eFl7S7fae4c3MY3RT2eDZW55dsHd9q2YTCI02iixqcHU/URisGpbvNAyrUVJ/XRDG00Xsk3KC3dz9ThyhJREQgQEjIME7YAOq7vQngYed1YcBhTMDrGveo8VwvJTBR9H18qlt/QmkBa3mY29OcBqGRfd34Ou5oezYQ3BrGFSxS2S5WwPeq/XuxORlAgxaXgP8siSwsjJsWDsLT49htj24iXnmdi93V3nXt6r4S3BsDDc3TcFPn2JM2jR3OH1LfMz+PYV5N8ONQQvuM9vZPZ1bBESghQQkeFsIU6cSgVMlMOPhOfQqSworFibjfC48Fr/ICwpfhE/viAML76xDwyrP3l+H07J7cAahxvD+61cWbMuoY49Q7EKMtVmDdR0URW8dYo5uMnRxoNjrVKGxlOzJGblOOlJykY8+Pg73hgt3evaGqGDvvbWOcc5sFKK3inYUEJMhq9X/0k0rHwqKDvx90bSZjjRPlYiACPQIAQneHhkINWNtE/Ay2qlWWeDPEE67tumJ6DbbmF1/YKT4GSdLNqWI1uAOvMw7wY4hxg4g+gL9md8CscuJTXmSAiAedLFLCrRs83F+DW4NRQb/6KDgbdZFt4Zqq/MMnxjipyxR2LPPj+Gm5tln+LkP7/tvryI2tWsjmEnnFbMvz0zXfy+IcPuHCX0JfHmJZS1cD0+BpRUisEYJSPCu0YFXtweUAC16MLGNVGu3TZ9WeUVpcuzzYeaVEw9qoJPCp0t4KXYPw7JLsfdbzy3YuZtcewSPuykC15K4YV8Zk5eCl8udHHq6NVDw5tZlLDPzWycK3SdY916I3uc+DaI3De2Gbyfmj9n+0vrq6wtHnDhAo3K/YlwnKiIgAmuLgATv2hpv9XaNEEhh062Vpr8Gn8WfDfZu+CeEKis7SEQxyLKPE5gOIf3sEQheJiU4b4uXi5+1JnZ5ieduDUi1F8OfgUKwk76qvMo8PG3wMVEw6pBbA/vM0rT0HpjI7PqnFWy6Gk19+L6pNw8fTB4poGEOro1c8DZ2178iIAJriIAE7xoabHV1bRFwEs/SkeoX/cLMzzvV0k01P2PEqI5a+zpFnH6jx6qZTeH1tmsKdsEO3/YcwqwpiD2KoLVW2Gf68DIm71AB9t1OmnhZF+oPgkY83g4ZeI8PMa+FGoT+ocnUrnua953P7ktv3g8BXIA/r0Uy7R4HpQURWGMEJHjX2ICru2uLQJa6Fjj1zwWe86rEKX7C0thzMLltkCay0YJ5rGp2FK9fRQa1S3f7tvcwIlRgfbujBPTy1YTuW50xeZefxK+l3eHEtU6L3WYHKPjrUPx1N9z/u8/eioQctDt3p9zwpSe6U7FqFQEReBIBCd4n4dAHERg8AikmxBWc+KbMr/1iNS58OLA48GEBywbg2S6teVP1zCZg2f2li0O7fBfELnw4GZlgLYtdXsUcXmYdi5lsAS4GtPh2qpA/BS/dTBgarFN+vE/uH7KoWf3YeFhbU/7bT2agTyIgAk0CErxNEnoXgQEmQItuxYs/vsmcoJoGH65kCUI1dfZJdyvx8qk5Q47V4gwpgjN7zSWhXfu0wPZighp13Vp0Y5jPl4KXsXA5eS0sz9/a5s8YIIpc+vLG8CXudGEMBs/xbSatH6rUEa2hFVFQOt0J1ScCItBSAhK8LcWpk4lA7xJIoAK3VOsf8aay8PvrgvdlUQJNBDHS1CNUkc3SXNf83Hyfv8/cz819WvB+stPSsluF2H0UvpmvvDC0F5wb2IGjSB2LuiV2TwwAWVDwDpUaXGh57UTJq0HdTEBRRf2dLuynj0maTqnweOQFhkhkKiIgAmucgATvGr8A1P21RSCCxB2rxH83vi4s7Em9d4UVxOjFt8B8PQA92RDCsxv4RoshX8fL7LYnrZvdmO97fMfG+SmuF9t3zq75zvnxqGtuu5pVM+pCDbP/H4PAfdkFof30BYHthxtDHdZMblM5QYAc6VLQTDWcYrlThZEhGJ6MbaAA7eSNiItK6zAxh/sO791YnTYHsXhVREAE1jYBCd61Pf7qfY8QOHx09UokwePjMqxp64/AP7eU2eHpBIIjteIkElIg4D40oU1NZ1Y6hkxTob17dLtT2Dxs7zw64xRyMdJUlGASQaFwnk9zFUULBczcKFOY+5arGT42b5Z8f/yTYBv35+d8N7ynWEHhk+/TPIDrn7Im3zmfdNbcrXmevA2obxpxdl/y9MB+DmL38DFGA2j4izb313uDQD5uWGSq4ULIkehc4VjxBoR+vHl4svkD39amwKUBTtyHQ39fNfXhXiHB21bcOrkI9AEBCd4+GCQ1cfAJvO0161fdyQwK1MMEpXIdj3Ahfi8f9uGxi+QDl3rmYv0M/trHIBYxh8fOQMioM8bslo3Vgk1WHFjfTihR6hLMA8uValOjUDhx0tN8cct4D8kcFZzvj39obaXoZeE6vnh8tICIph/u7K75fhTfVQh0rD5uFeTxPJaTsOp4L0HMXLzFt4PHUqtI7ILO4oW+tLwhIH8udypgAQUvdSYFbx03KB0ruFiyyLUoiyvrzi0ec/2SZc2LsWONmFvRobkftCwCItAlAhK8XQKvakVgLoErL2rVrCKojDyrGn71I6hdCN38MxUjVSXFAETPmSEU0P3l30xnrDBWxvL8ST3cf35ZaB1jfy20frnr5tfR/Mzj2d65pXlOGuuwbf++zGZg0S7iW2z+rnMPW+vLvIHgjUIVonOo2DnBm3PHwDBCRO4r3smBwHXppOkRt14/lOGGTkUEREAEJHh1DYhADxCYfrRzM3tg6DPfdbZ4B7OX03XBgcV3vmSkwXdBEblM7bDQbgueDzU/ZV/u+JSVbOOJ1bQaliHeqkiswP4ssnt+zFr/h2w4njW4NQwVFxuF9lCilbeAXxnXhRUfN1+0MLe9BaiAdXkj6YRfiCbiCp50EICKCIjAmiYgwbumh1+d7xUCoTEHWvsLxU+C2evVCecVxdTZ7BQSWMIWkItYtcDaVTVw2edbYsembImhcgtIqMAXkytQAKssTIDM6FpQhyE/xot+tZ2Kycu6OV+M0RoYLQJVd6RkDMuQOVOFujsVUmKzISoiIAJrmoAE75oefnW+VwjEKaPidqBQyCaZU3LSlyfuImK3A81YbRW0HLIMA9thCCl+XEIn5/uu5X/o1sBoDQwRxhBlnSr5OEHl0srLujulO11cDU6SPpFEM0guqJ+5To236hGBXiagb4JeHh21bc0QqD8w2Zm+0rS3buiKYsF7PmaydabONtXCyVeMPFAIHKvBP1VW3qVBU/TSylrCTQJvDjolPil6EQo3L1zmBMh2FwcuFJ7v7UlnRhEtpAMVLtmhg0tu1UYREIHOEJDg7Qxn1SICSxNIc0fapfdZ7Vb+7iPMQhgXXp0VEZehQ+Jjtc1e7PjceoiNQwWEJYMvLwVct6XNYm3thfUUmsx6FiNiAePjdsytAQPDRCG8IWGd7U75nF/XuJmLzTmYJmUIXl4ZKiIgAmudgATvWr8C1P+eIFAstypKw+LdcfBIOx731qVl/5Uu4oZ1wtK2eGtas4UCKqQvLyyI9FFV4onFuXK8GQe5jslrYQdTj7FOit0QYzRTXbx9rdrSuK7R2Wq6H1c8nRtadWqdRwREoI8JSPD28eCp6YNDoFDtwJ8iAtu6TvDiuOhsQ/RcwOt/IZAb72A9LCH6QG2q//vT7iuaYpDuH2WIUC53yvhJGysFbwUPMrjczpGiq4sHN5cgSPdmGT6oiIAIiAAIdOBXVpxFQARORuBw2P756y58N0vD2avp1tCFyKgnQ3DK25kutwgxlVt54aOqLLKLo8wnr0EDMvMZeXUqHwOFdQArr4PLnMsNK+zi7VzNFoY+g79OVpsy5OBr/9/VatqqY0VABDpHQIK3c6xVkwgsSqBmUGptLBQZnuNeUPKD59G4204LWxu7seCpmxZDxphlrNl2C6oFG9FPKwGMPs9FZNvrlJWXhlbG4g3gwJtnXWvjBcjxzzKvUto6uT+fmMkLREUERGDNE5DgXfOXgAD0AoFNo+2O0pAhpezYLySRO5TBmXfQ/BppqaTFko/NKahoTZTOWfjKppWVbg2MZZwngugAKFZBWysny7U3zTCu88wz30+mPC87wicZA3V3t/CQaq0IiMAyCEjwLgOSdhGBthMYbu+kNYicUZsOXp1FKR73Dp4IyK16GKShUgZB1bDySugsfNU2Y/Jykh9DlHWyBJgsx5utdlnhU1zb5WJqRye8Aw8/cNp07t7QyQ4uWNe+BddqpQiIQGcJSPB2lrdqE4EFCVSLbcoGAG1L65pf917oxNnZTgaVQ8UzgIWTlRq+vI0wZYrLu/gg8wqowv2jhDjGXO6AkTePEMExyTO9ocJ2XIVJ4tlo8ajdl+zad9MDzzxaDCK48iCt8eIoOrDlzg7UoSpEQARORkCC92SEtF0EOkDAr7Rpcg2tuYXY0pnklwwCx2jR6+6vf9to0mrIwkxiVTyyV1mcAC2fEd0aEJfX9xCzAzcL7S4cH4pdH77DcQ3XYjsUL84ZwKWhUK4evPGhh5IYHUsdjzbldndP5xcBEehxAhK8PT5Aat7aIOAdao/gzR8dB8HZrp9cH/uz7gwDjJTCrYhvtRJi8zKVray8Cw82J6vRh5e+vEGHfwXyNMMMTwYN2vJoDU6K0GeB7SpPHXnDdWP2p1/ZaKXqFMKUtefva2G6WisCItCLBDr8VdeLCNQmEeg+gcp97YnIn0WYGb+18DJvtzNmVVq52mFW6z6/ZgsoomjULsOSTcHbFlHVrKzP3ykBqxCeQ8WGlwsTRLS7sArehLRS6DbPxXN7iAJBP+FbD5YP3htB7AbILAhnZd8fkY233YOr84tAjxOQ4O3xAVLz1giBs9ogRKEA3MwtBWH2ujhGZIYBnKy20NVBy2WIx+YFJB9gRADF5V2IEq4NKF4k3MsZMcJFJwRvnhQC9dKqnI/N/Msen5ur8vc5H05EFsGFjfX5zQydFbBAscuVLpZ9N7Zv7h/b89mHiraxPOw9ttdP0uyreQzghUlorQiIwFogIMG7FkZZfex5An6l+cveoqZC3FIIuGXn2nTYnpHNQC6ssae6tFwyEsGgF145ueDDwlOvohNrHEzeml94D0RGDOfWqUKLLMPGIWBIfjPSEK7N2me9bZsiFk2mSM57iOWE8edmt3E9j80g2nPRi2Um1NhQjW2LX91ccifNHR73zK1kk5NP5Gdp1qJ3ERCBtUdAgnftjbl63IME4pFWNwpWL/gzhk7wxhTeEmtN7FIMhYhAQMslk1G0xcoL4XZCTi5v/JqP35+y9/ETHV948i4Qc5B1x9c1l7g3l/N7GSxwOaOwzRdOtI8f01kTLkVisyDpnk1DJDI8GS2+DXHZ3NqmdzSaE+XiKQhYRlCgcJ2Vo3xnO/P/0sZNG1uRi1su5AqXHcBJCBOfnVmofGNCjSh17bLTpq8cesBFYJKJ9PynJ96xiUvTbv0N3PXDO9hyFREQgS4TkODt8gCoehEggeoVcKZsYUmD1AqT4Xbvx85PxLXYHPg2rqXS1HRNX172PRc8zQ3USzmQxr/N1fl+udxqbs93anygObRZuDhXOTbX46z5ufhPvg92a6xp7N4Udrlw4zlmD8S+DS2HFbPrZndtfMa6FBvyFmBD87AsF4ez5+Ch+YZmjVjfrG9OVU1xyZOlsJg6ALNu1MNNQfOss+dr41t+IzKdIFIEXBB8CttmZWg7l9E29jWnmat5PKHACjcPqcctzXJimdt9KOOq59uu4fjCcT/eft9U7bGt6zaEO7dthzmZ5z6xf/MM7X6X4G03YZ1fBJZHQIJ3eZy0lwi0lUDpcGt/iFOIiOCw+3KbtnWGR/vHFVJbe9FbJ09hvcyzr+FbbgZW7gJjzs5aAykU84I3LvGR+PEyKyjnruJOyOHVEGOzu3J7vsh3vDiCJ/xJZ4UbtzWHdu5+zcqwrlnmGGaxas6G5g55Dcc/LLkwp8p8v+ZnfphFMLsefq+4VuhegMAWHSm0KoeorFSGj/XRhmX5RG/ntpTNcSwGwM2FyKqw3B6NPTy1mCPo57SYYwBPCauabzuK0c6nDdefcdsTpT31DZXg2HSxduQoQ7Dx/Cdqm3O4FkVABAacgATvgA+wutcfBIKvjbauofg9d1z4754WvSYuwbqLR8NrsVDW8DU2klm1Ynb0EMKywc2DAtSjpZBYIPRoBHWa6hYH5HZUqs+8zLLjx+a62U3cb654nD1g9q15fKOa49twwIktx9c2FmDJZG2NGmfrnbdL8yO3MkE0XVoDtIufFzrv0mdBXdiB4jPPugYQ/NxE0ayrXe9DELwTR3kb0ezzk2tif5g0ooSefXNi3C4aOWYjXmzH4sBCl0c9ubDdtAAn9M3Afs8Yq5zr2tgXKknkHT0cuIcesTQs0eH3ZFSefF59EgERGAwCEryDMY7qRZ8TSOCC0LLCH37HuQ7/XJ47d+I3flZFtayKfjkR4/L6+JbbcprZAcTDqmFyYAxzZlzHDQGsfXRzyOVPU7niQ0MOYdvcTs4+Vp+7aunlJx299K4r3EohWMtcwyN72xTU7dFqMbeCUhyupOTCFocEIUQiElBEMXyeIX5pgW13Yd1lJAhhIgr65/J9fmFvaIg/vVyz3/nR+XZmedr+/KK77K7DY7m4n0+Y5+TEPA8Wa9wNQPDOXDFSNGeqCombJr6l9XrCwMPdcuad30F9FgER6CgBCd6O4lZlIrAwAWdsZuENK11LlYDfe2coeE2WOr7F/LDSkwzW/jEmZVH0bt6Y2ZFJ6B4IO4reWgXCFz6k1Lq58O1xTrwlSmGdLHmJnVOq2IF6YF86vDGD5dOpwoof4bWirNG4Vij6+Zg/hVrk5L7c7QP18DJqZ6GoptAuFh2rzMCPF5PmcgE+r1LedlDEDruJ/cWPzra37HrMzh+etLsnh+wpuSTQaM93cytvXHftnNHpS0YCWzdR8WfOWlfxh5LJaO/e72Zurq57fLDncdBHERCB1ROQ4F09Q51BBFZNwHPoaLv6kj+SjrPTkE/1ZSmC7huSL6x1wUuqueiFFXEMj7SPTDkWFl0rQGzVqnOEL7bnk6Kohdqt+NioFRSKWR9uKruLVWSSS+3Lh9fZH9x3hv3r/k32L1ffZs/fcAgicBj+rct/UkCB6SGKBTLv5hZRujXQIk7RvJD4XEFzT7orrbohfn3KJcemp9GQhXhjXeClNhXjJgV9R5Bd+70fnmM3Xfo9G8O1PYn1863aPmIvc/hmYte2leo7dpSqu75fLX2/6kXl8U2xu+/xI/ijoDlZgvekg6QdRGDACEjwDtiAqjv9ScA7qwV/itAEsOlaNmUviQ/WNmd4bN+cpNWfVFrbaiakYMKD8WFYeo81zl0acnPxGyELXa3WiBpAn2eKwKaXQ2tbsbyzUY5RusZoSwFC7/RyxYYQZeBrR9bZux7Zbp95YiOmZsFyHdSdP7j/DHvOuglbH0SY1PVUEbhYjZxg58HamVtRoTiRmwRuDbC6YnIfXQLaWSio2b9SucE5F9pPcWvAxEv46s4kru2tFmzd8JT9K4T+Xzy8295x5oP2A1jrqYPzmzyci1PZcgEPeBUcc1oYj148PnXx9yfK36vUaq5vJXfLphckuKtZUF+3q797993UrlPrvCIgAisg0IJf2RXUpl1FQAQWJlCfXHj9Stbi0W8Gy5YdKf1CBp9Mh8IF/6ucIBBByNGyuH40s0PHaOFtuDsUSrPCt46wVnB1iGqUY7AF4nE/50C12+J5ooUQcPhQQ0QCTm/bUa7aeBjZ94+O2Z88uMv+6cBGqyaewXJpQxCD8M6wbxwZt/fs2WFv3/WQHZsayo9f1rBDKSKCFyo8sTddXEvw42UbTqyd27rWLdNvuIgHG8gEmPsQA/U8zvApRtsOwnXjSORBrqY27Nftj8HhpzYetLPg03v/TCnfh+ND6zxTC/MkddwoUFJftL5y0YcfzZwk8Zy0nLmjm6adg/sPZT59XFREQATWFAH91a+p4VZne5WAM80f6FUWCBgI3mdF9eTaDKl1Gw93V3nOATuclGnJZGaxDRC9BxGqitm5mAiBlsKwQOGLcFk112rwLa1BAPPxO0Uvt7e7NK26m8K6bYFV97Fqyf7gh2fZ+/dss2MQfTshdEeKtdw6GsGflxEaTgtr9hcP7bCXbD6Qh+/aXwvN583PEo2lQGR/KHibcXn5uQ4XmBQilMttFfk4P7Om8eajBPeSY5NPbS3XMATZkSiwScw541y0/7+9NwGz7KzPO7+z3rXW3tVqdQtJCGFjMiwBjM0gFoPMZgfbgGMnjvNkm4k9iZ8nMxk7k3g8YxsyTPKYwQQwBMsBvIGxic2OMasM2GLRgoQkWlIvanV37Xe/Z5n3/c491dXV1bX1vVW3qt5PuvtZvu93bvV9z/+83/+/D1Hs77Qr5t88eIv5xHPuRlQ7slFtF4Ow/l0IXvab+Xbpd7650rx5xI1HYy9JO60KFDHs7ZWLqc8dq4mACOwpAvqr31OHW4MdVgLdcwirXVODvOWPftl9Qxo6kGxQcfjBV1uZAEUuNc++MdobQAsiGEkcrAij2LPCF4ekiMpdLQhfnETY7AWMIPLzfjeKM6YYm0A092ixY6YR1Xzzwzeb337smDndLJjjEL/Hi01bRYx5afNG0XuQEWBEdv+fkyfMb992vznXCmHh5unOlSIyX492BmTysJaGfCkGR2n7aGHM5SLShQ3Q1sARWEGNE4ky0pPNz0Og5x3pdZKc6eGdhU2jhvy7YxC3tHg8tdwwn4Sl4z+ePJ7+rzd/z5meHbPf9RCKmGOKkdrBhVBuYp0TldYzjhY6R0+2CydLXtfz/Unn4sWuWUBiZs+al3MiehQBEdjtBCR4d/sR1vh2BIHUv7ZKaxQQUexNJrH7Rpe5Zu0l3R0x9G3rJO0NLExh7Q2I9NJHygn8FF4xvAJWcCGTQIB0AFHXhdUhRgSUQpCCClHQDaVEWHmY1HgxRGsZmReOInLbSjzzvjNHzVsfucFOQptEwYVnji6gL8glbG0OV26HAvhooW3ed+qI+alD58zzxufMd+tl6/29cuneO1jHw9gYuea4beOXCI22hjKjvHi+TIPaz/t1R75kzUwNLk428kh6vn3un27bCxD/HYydUWt2lVHtw4WW+dWHbzKvODCdPrVccx5E1oYqjmXeX26bPt7ryt0brq92jt9fr94fVmbG8VfWOne25NQ7SABssIKaCIjAniEgwbtnDrUGOswEvCoqI2y6MZqHkGUy+mpIsWNJ0pWdYZ0sGenlRDbaG6YXMtGLzFZWOGXClxvKcrtWx5DlDWnMMo8vI77ZpECKxo00CjmKXEZ0R5BLl2K1CaH7kXOHMCHrBnPX7KiZ9LvmGaM1m4WAUVxG67neSo0icALRzyfaBfMriAp/4Xl/Y2iJmIYVgCJxpWYnrHGgbEsWoeCn4OXJAD9eFMPZkn2/Z3oyWw0P2rMNNbqUJZNHUHZf6BYhdCHQe2PpgMV1hY65sBCaf3bvbelfv+BrzlFYPRpuBWPJBkNWzGwR+LHztLHWLR87m37ccSKn3aUrGMZtzMpzbV027mOwLT+fGOxetHUREIG1CEjwrkVIn4vAVhBo4sd6s42/8S4qqhXcN9K5eRWNs9mt7/r1aGcIILgmKHppb4BCob2hp53s+BNWQMD7tDRURjyTlFnEIrZpzSJEg3kpnVHK1RpFGA9VE9HKIqLwN1cauGRvzJ+fP2DeDuvCFzH5jGnFnl6t2+gsBRvF3dWE7tJ9seraLdjely9OmPeePmr+ybHHMNmLs88yAbh0WT5nBJQFGvBtwatLy9ioK8bZhegN+pMpb/muL3vNqC7Zl5CerN2+1A8uRFsCLQyM8FLs5hz4SC5PH6mbr8+Nml/77o3pL9980ol92iIujQebtkN77kTtWS6zPTQL3XG37Loe8/XtA4Qt+vm7fFjslZoIiMA2ENiiv/htGJl2KQI7iMCln/PNdBo/9HHpVhN5/2PqKbq7GYIUvdbegDLEnMjG7AfeCgLWCl/sgBkBShC+RQrfVgTxC3GGaDFdDlcTvhRp3OQt8KCWw8jchRRjb0Eu3Y9d3G8tDccQ6S3A2kDRlmUZYHxzfY16vABRdxC2iP/zoRvNq/ZfMDcgZ+9jqMLG95c2Cnmmq7MZDZaIXS6T76+FyWslFINYpoeXbqZvz6kHSxDXs3jM+pZtmnmHY1QEeQKeZJxiWHb5SPiZlbYIlf+Hu5/Wff7+uvcjN857p2oFiONsfW6L1p7vG69//1iQhvNe0tpfvIiq0s/AAketTSRbcsD36Z8MeAfavAiIwHoISPCuh5KWEYFBE6hu8Lr40v7YX37nDWknxvQftc0SYOGFIoKi+8eRsmyJp3el7eURX16CL1V8UyghFRZEL+0OjPjaErdQv6zgxiglBel1EKOTmJD2wHzV/KcHTpgPnD1iMBfO3FJtmCJEKUUurQ6bbfT40gf8DVgi/v1DN5n3/J17TBHRUW5zqd04szPQv4sILzu2pPEVbQ0d5OON4Lmg6F+2yJKl+/OUWSKKiPD6NkJLMZ7FnH2I8TaYTMGawT6RaQGfkdPDCwXTaITmmQdr5l/e/rD/jEMdM9XwrxCxLfh4Dxe7T/mBscbxb9SLD3U6oZcmONBMNLw0hN+foWgrIiACQ0xAgneID466tncIuAlLom2yOU4h8fw3JLgcvr4L4Jvczy5fjVLTil5cYreeXtgblk+kWo6An1MRUvgWUcSigBRbbeTw5QS3GLYAemArfmxuRD7dU/DY/ucHn2rejcll5/H8eKmNNFsdK0gp7DYvdbNecX2K2xOwNtx55jrzD44+YX5wfNZOYMskZLYcdR7tDOyz7X/29uK9FZxYpo1sDVWI0DyqurhAn59YWwP6U4CaZdW13MdL/3EDOYfpRWYOXo7vsXrBzLRc8wMTTfPPX/C484++75wJq20nvlA0pxYCeHYvCXiOo45UbvurrYnbxptP/+LFykNRUIA/+TEsdBGHDQdaTQREYM8QkODdM4daAx1mAg6iU5tq+OlOXOfHEj95uq2YuqmNaKWlBCh6maeX2Rtmlk1kW7rc0ue58KXIKpYz4duB8PVghp1reeaX7oHQffQG00DFsAIiujeVmtZq0E6zqVP55DLKumsJPHIiHHPVzkIk/urDTzEfffa3zCgmxi1AOELfWt1Lac0Ka3xxtX1xHG1wKGN7uQBeOt5+PmcEmRPkmK2hVmN0PAu+0sNbR2qx6a5vTs1D6CLc/KzDdfOPbz1v3vi08yYs4yQRE9faT1RtYbiQ4rzXX/YPm7ERYvqYbxtpPXNibObPvDSNPBfq2rqAsfAWtK3ZyxYMRLsQgR1OYJO/sjt81Oq+CAwZgS4uvW6m8UfdDbyfMCycoF/WzSBccZ28OMUEPL2cyLaYsmzFpS+9SQGZpzRjAYtK0TO1csGMdBzzs+Xz5mLdM4/gcvyZemjmusiXi1VLyDU7Esam7CemiOMYsF4uWp6bl694nNfbWKXtGAT1XZgE94EzR8w/vv6Uma5XMFGuF63Fxlho7Gpil/vht5GeZJvFAraGgX61ehsvMT0Zdsx+8a0SWDwwVTbfvVA1f/e6efMv/85p86anTBu/BKHb9E3zQtkyYtEQ+nZp0bBuhSWwbAAeeXyfv3/h2YdPjjkO0jYcPPiI89iZJ+FRpkl58K1+LQlYBt897UEE9gwBCd49c6g10GEm4BzYaO/oD2VJ1gRhw+BHHVQJuAb750Z3vieWzyey2YpsEL30mtrA6DpGT9HGwg0zqBB2uNo1v/ack5mKQ+nnM5iE9fhswXxnumK+MV0yD85UzPfmiuZcDdFKiFUXx5UTzcpBYu0QFH6MduZtrSgwl6RgrSKy+1aU4X3NgfPmCKqxPdEu2iwQFJUsmbyaimWUlVHrDmwZBfxKDNLHy33Z9GTQn/TxJrB3cOLfPKrdUQG/4xUPm3/2tLM4sYMCx6S0FphZ8w6YkAv7xuEwswazS1zeEDWGreH6cvOZJ0qV/WdanQvGfdjxvJnU1a/f5aj0SgR2OQH9ye/yA6zh7QwChQ2ngOJPvmvieviTnTgum15UcGeMduf00tobMJGNFdmmZhHpRdfzPL1rjQIazAqyhYZjQq9ohawHIXsUOXaPXtc2Lzg+Y0Vntx2YC/Wi+S48qPdMVcy3zlfN/TMlRIEL5glEghu4rO9jvVFEgasQwSxSUbAiOBOiSyuv5X2il/cIcvHegwlybz55o3nb999nvbAUkz6u6HMy3Voilv3vwseboOpabjPItz+IR0adOXmttgABC/F6seOb54zOmuNPvwjlHZrahYpxIYg5eY0J1ZY3pnhrstMrNAR//Ulvwbv7dA3p1o6lx08cwXausvAK61/LWwsL913L6lpXBESgTwQkePsEUpsRgWsh0E3wK7+RRoHbQTxsfuKNKYQQRYBCvBsBuL5lqYkY6WX2hkmI3tzekE+sWmsrzI7AvL5dqEu4GzApzkPUFE+Qc5ZRWKbXCpAW9rqRhrluIjEvpgiGKO3At3oSUd8HIHzvmy6b7+DS/j14PI3MBBdb2T/brDhWDlKI4BjVx3AChH1ZCcc7G/VMzY2Vpnnn40fNz1x3zjx7bMZ8e65qihS8WIYR69Ua+84CFLyxDDP9wYNq2cQ1VnhzzMx0ai0XBTCvtRzz6AOhueEG3wSFZMVJduwTu8bIOP3JfG458AM0Fz7p1G/MvOjAk413/tnLMTkOVdsQEl7N0pGt2a97Cd5+kdR2ROBaCEjwXgs9rSsCfSLgcB7NRlvJ3J6Uo2c5LBwVbGL9je5vjy5PYWQv7UOA0dM7h4lsFGjrEr29w9KBh7cUMgPBpYliFGasotZBJDOFsOOiFJkePL0BIrq3jtfNrQcXzOt4MgOhPI+JjadriATPlq0V4oGZsnkcfuAn6oE53ymw1p79GnDdEvzA9ATvD7vmyXZo/i3SlH32uXebCdgcYnedCXbRF4piZmsIIawH3XhiMTbqmqnpxBahYG5eH+WPZ2vIdDEbmwP7XBSPgJjtMV3aHx4jRt5pOaHfmhFsNtC2RStqafnCI7W0PrnvEeRAHgF17GyLWqO+RTvSbkRABFYlIMG7Kh59KAJbQ6D19Q1MoOlpj/BY+IY0wE87xYgMvAM/UJzExWIMjCHO1DLRS4G1lhSkiKU1wgoxishlK1C/0Y/NxqBrEjuYLIZ/mhHldZi1AJ8xA8EoilU8/cCCeTpE8I9xJUSK52F5uA+i98G5kjk5WzL3IiL8ECLDTzYhgjGxi0UsAlggPnf6oHn7/mPmF2581Dxmwiv6wH2v2Nh3zBFLIT5tVHhZ31dcZ5Nvki/nkd1wzDEnH0VOY+yXvFn6+fz51IzgZCPAiR37s/xkg92iDcIDK+Y9zhvPFRwnxonF2Nz95924NHafOTyGUsVrhbfzDfTh8dSZPmxEmxABEbhmAhK814xQGxCBayfg7l+/4HXww540k8NJ4L3O4Mecl8DVtoYAsxbwUvtkFZ5eiF7qprU8vbb4BA4TBR3Tna3W7JHkHZUaG57zQn0bhSBSZHWwb+E9pjHjfkcLXfOCkZZ5wVHUKcOle574nIPl4fRsERaIivk2RPCjEMBfe9I1v/jNW82zR+fM3z3esnmA7cbWuLO2BoyRtgZOXmMFukE1CupOGyIXtoYTJ1zzvZOJaeJ1EX8ajYYx586l5sRxnGjwK7+8H3xNLugj06nljSckESYCtuK4/oqbXPOp75bM2TkXi+KPSE0ERGBPEZDg3VOHW4MdVgL+U5f/gq/SU/yIe3P+T6Xz6f4Ewie7GL7K8vqorwSspxcibBJSdIopy7D15RHHpTuEDrONQoxiebONgjBvnKhGEUqrQ9pGJBhPXUxkCxHNPYxsBoePzJvn2Elx6B8+v4iJcR9/YtzMJxVTQ0dSrMs+r/Wts/uE4GW0FdnVrI93eYQ671NfHjGQJiw6ZUxeO3a9ax59DJXrkHmhWELp4Vl4qJEbeWLcMS3aeFZojPLaQfUEMBdhNbtq0J368Vs5edAxf/EIrBOFtUa+wsY3+dY7Ht7kilpNBESgrwQkePuKUxsTgc0RcG6AUXE9DaIGl7K9dGrkDWkXE5WuQUCtZ3daZmUCFFH0mE7i4+n5bJmriV6KUQpHemETqEW+7ofc4na4MTthEU8Z9WxxQhz2wz1Az9pJcT48wYdQ1e3nbj2LThTgQcY/+6hoRsHMVF5rNYrIFjzGddgqShCejFQPXPTCqzs26pjrr0Mat7PwJKMPjI6fP49UbRXP2hfYj6UnARwHMzUwok6+lgKehKFrzkbJk2emGubEIcf8c6QAtOzWGnifPn/HR/u0IW1GBETgmghI8F4TPq0sAn0iYDPmr2NbEC+m5rwgnTPPZ2VUm1qpH+ppHbvWIksIgDknspUQKZwcRb5dTGSjAXclTy8PD60BzDVLS4TNeIBl+92siLN32ReC93ZSHKPAmBhHFYhTJRTDSEwB3x1OBqMIpzWC/cvWurJX3CTdEhwjRXW5BJ8sxjGolo+jjSjuvn0OsmS45sknUZQDJxi0PFyE6D0CIUyeSxtFOE866OON4YOmGPZdpHIbb5k//sQLLvze1643h0dbWyp2s/49vLSbei4CIrBNBCR4twm8disCSwkkX0fobD3NqpLCT6QBjIlWiaxnJS0zKAKMknJiVQq1xYlsFL0rRXopvuj3pUhey8fb777ya7J0UhxFNyO7FOoLDZTvRfJaOCRW7HfeFwpi2l7nehkHKhCftHZcTSTn613LI8U1J6gdOgj7BrJcXJxBajdc0ZiBtWEEKeIqZXib8Tm7xsa+kLP17fYEucs3oM7T7uj8mPdUUzEbTP9nt6w7ERCB3UBAgnc3HEWNYccTQBrV9bb9xvFenyJylc9rWu+KWm4ABKCyGO2k6KXymqGewnsrFTKjEO5w8hnEMQXkFROvBtC95ZvEbm2jWGUfxsoQ4Ij6ztUZSV3d4sDlaRfgsoymVhnpxfeWzwfRqFWZ/o3V066HnzfGGQN9vBTr5y8k5sYbWJAjE972hILc8Zqf0+Jr+4UZnvXmiHnBDd9YuGkS+Sm8nhIeRIevss3PPnSVD/S2CIjAlhKQ4N1S3NqZCKxMwHtsHWZcRLPSE+bHompyfYpLu/yRV9t+AtR7FIsV2Bt4SKZpb8D/yyO9/IwR4UVhOSChuF4iFNzMeECxzpK+s4hQMwLNTAfs60qN3zmKeRvpxeMILkxwTNzW1dZZaTsbeS/36t4A0RvBt16H/5i5bS8iX++hA3gPft/Fhn5Q8OZ/G0wFN9cIo2cevjhbLZxFajgoYjUREIE9SUCCd08edg166AiMrPWnCDnBerGu89MpptgPSlwMHZcd1CE7kQ3icRKh9+m57AgtFb1WhEGAsQhFUN5mtbuEKwUrI6P7kAGBQraBCWrsN99bqfEz1kmhQGY0u1rBBDgGTgc0JHKjtSHEOeHxG5i5ITY1+I/PX0Ru4pEsd2+7dwJI4c2Ja4xGszuJVeJpI6iW5lvpOm1DKw36mt47d01ra2UREIH+EFjrV7Y/e9FWREAEViXgPQWqY7UGERU53jOjmfR208JPOX7U1YaMAA4LhR8jphMQYrM9u+hlohddpsDk5XZoskFpxA2DoTWBkVv2m1XV5iBmFyPRy7ZGIUlBSWE5C4HM4hYjEL1cflD2BjKk6GVhimPXe+YkRC+jvE88AWsDcvYykwSjuexbVoAiOxYefuESP2nXWqZB3moiIAJ7l4AE79499hr5EBGYweShqzUrMHCHbEx/j0UnUkatFOO9Gq5tf5+e03IxO54UjkvLEDNauWhrgIgblEDcKASKQX6tmJ+XE9IC+HoZwV1N9HIstA/MoygEWxV+YCs6s6Fnb/bxPhe9zNZw7GgmelmGeAx5eScnHNOktQF9yvvFkw8Gnr2uUxuFPu5jV7QpERCBHUhAgncHHjR1efcRuDh/levHGCr1A1IyjBRD5ye8IDYJw2tqQ02AojbL3gAPaS/Fsi2KgF5TFEaYvBaw+MGAxOFm4VCAUyiynO9+ZELgBLUGZoDR3rA0Up1v305kg+hdQPw0xrrjiPRyfLxRePa7cZssOlGGuD6BSWsPPRKb08jTW62gwjbKDvNkg33ljWh9/OV00mR6qtuctxkb+t0hbU8ERGDHEJDg3TGHSh3dzQRuWNvTeUfqObfFHUyMkuAd/q8C1BajoxVEepkr2WZvQK+tLxaftRkFxuV5akIKs2Fr7Dv7Oo4Syj4Mu/MQ7RTDjOgu7y9FKMV8DRFWPh+vYhmsz8g2x9fvxn3QszsC+8VTYGd44LuJOftECgGMiDTEOvtJwc7l2A/4pef9UafhMPeamgiIwJ4lIMG7Zw+9Bj5MBMLC1f4U8euNX+40Sn6200pMCmGhn+1hOnKr94XeWKbv4kGbQRliNqb2YhSVhRNsVbDlCnL1TW7Zp3mUdhT9D/G9Y57hTi/6u7wTFJcUmYz0UhFTKGNRK3qXL9uP1xS1tDCMw8rwlBtdc/LR2IyPubhBDMPry6wTHk4MY/g0/LbTGI1QaWNIOfeDh7YhAiKwNoGr/cquvaaWEAER6BuBtIuQ1UoNk9WSbunmuOC9xHgd6KZMNK20qN4bPgIUZozmVhDNTRGRpL0Bepf1KYzN6oB/gZkabFgb+0+RW0CGhP3jsDhgIl4LWSaWpv7K+85vZiZ6MVasN47xsjHS2+9mo7fYRxPO3IMoTNFquubx06iq1is7zJMJTljrNH2cJLamguKT6BPJq4mACOxVAhK8e/XIa9xDRSAeQQhteaOCYIGJWvuNSKxUVnR3OaCd85oRXUZ6aW+Ym88mU7GsbymEatsBjf138RW11dkQWa1BaNJZs9zXm4veGlKbpThZG6tky9l5ln0eZy56WYKYOXqbrdicgui98UaUUobI5l9Uiv/CgrkQBBVMymPvtqOputt2UNc+RWA5AQne5UT0WgS2gUD34Ap/ilAUTsstefPJT+ICuKK723Bc+rVLylqKxhImqjHSO4viFC1cek8oCBF4HEQUtF99z7fDSDQ14wj85iG+rsxAwTFZvywWyqU7hSg/b6JkMUPZYyOoLIcPrYWjz5qT+6L1glHoG08gc8OjkbmI/LwHEPX1mjjBCBNcITHNTht1lLetPblte9aORUAELhFY4Vf20od6JgIisDUEvJNIKrq8QSWkYfjitFH4gbQAO0PSZ7WwfH96PVACvMwfQ5gx7RefX5zrZRxAPYQBXPUfyFjYb04MK8ASO4lCFdbXC8tGLnqX7pQV25oQ9QY2Dub3ZRuEsOdfBftk05UhR++ZMwkmtLmmVHIQiU5N2/XmKYzVREAE9jYBCd69ffw1+iEhENyLX+wrWmKipxV/NikhtIbL37LvXgFox73BS/uMRo5wIhsOaCd2TBWX/mkPGMRl/0EByrM4HEDqMubhrSGayzHYLBRLdkqvLyu3cWys5EbdyYhsvxsFLdOVFQuOOXTYNTMzqZmYgBDH/h3PnV5uvej3/pdvj0eXbX9JvuGMhO5FYPsJSPBu/zFQD0TApDde/qfoQASl3cINpuv/KOe7K0K1s78kjIzyGDJ9FzMz0A87hpy1U4jyMs9tCVFfHHLrPd0pwpcWBQrJMaQhY6EK5uy1k8UwtqXNRnoxxim8OYlI76AsHOTLDA1lRHbpr+gihZ8Py0i37szblBFLOzWg5xS6PpgcQJYKti89zhC3mgiIwDAQuPxXdhh6pD6IwB4k4B6ZvWzUjhebqLXvjfGsM2avd+M3XG1nEaAA42FjdTyW7WVgk5aGFi6zT2Hi18Jcgs8cUxnzTaubWltAAWV98yipFb4UwcM6bI6J/cOYyqzOhr7PIvUaI9hLsziQQQgLRKuNfMRYfpye3t66gxhaBxaLAiK9pN9pox5Guz3LyWvZ0ej/HnkyU8bYSxgjxzWDY/vrX8UxjV3z7r/FGY2aCIjAUBCQ4B2Kw6BO7HUCtZkDiwj4Ux3HqV/0vJ/2/Gggl4AXd6YnfSGQR3BtFJcRXNzYmIeXWQR4ub2BPMqtFuL1EIQUvilW2ncAtcCwbAtZ6eh39aGY6IcNIaD4yGghVTO3T//r4GSb7e6m7tg3Tl6jyJ2kxQF29CZsDIxiU+izz2wcTwtidAYT9pinl9FuRoT73fj3Q1YuWHpdU3OP1R91g8imJeNnzJTBiG/iYCE8dTkTj1dUNtgRjpsC98CkY87PuuY0Tlq+cm9g3vlZ33xnDjvwAlPhvtREQASGgoAE71AcBnVirxNwRsYXEaCimnE78fPNTP2ZqY8ooH40F9kM0xMKHjYKN4pWPubir15LTQNZAhqI9rHcbRxlC9POQBHIZLwlpKILMWEthlCy6+Jtrk/xy1y3fI9WgSJy4Frx29s+lxlG2wN9veTASmssVEFvL63nVrQTFBpFMUXvLETxJJZjNHsQnl7uiycUYcUJnXrpAFKkPeRB2ELi4lhAjMLqUEwKxsEZSQdFKqB+UYYYqdS44job+85cyn96T2w+8C3XfPqkMaNITzFfj8yRqmMzVcxefuFmnVvWYiIgAoMgIME7CKrapghslMBIL1cnBAL1UKHm/QMmZUgZQtrIr/BG96vl102AQpPnHrxR2FG88dCkUJ/0jtYh8JoQuU1EcSly2Xj4uGyAy915S2Jc0ofqLZVdk0B7cbtsWNTeUeiyMUrZxKS2JgQwRWOIlGYsyEd7AKr92mW5jLUVZC+52ra2PApdxqQ8jnm2l7qMPl47PvSOE8lob7gAsbgfEWG+7g4g0kuunpeUfFO4Mw7dVxTj5HsU4G2o1GQf8iK3Ro1T75r5Cg4WKrGV0UNCiphiAAA4n0lEQVQK4vU2Hod5nND8wp+3zVwjMocRtWZUO7Rlwjcmnte7Ty0nAiKweQISvJtnpzVFoH8E2r2fWggbuA6PpB3z6m3Lk9+/Ue2KLVE4WYGLfy35SMFLQTvPqmPNJEt9BcFr89RixBSnjMjm4piquKdpLQ8K1HLVtRHcqCeMVwJlxTL2xXUZBW0gEwJT21IQU/gWUbSCQtIK71z4Lt3RShvdgvfYBUZ7KXj3QdCyulwTApf9JBM28qHXdwpFOPahHDDHNAh7AwU4zhxudhz3Q0mUvizxzTT7R99xgh16qFCR4gSEZxe4lrIhwZtijCxwcT2yT3BFbjcfH56qiYAIDBkB/LOjJgIisN0Egsd6PcAPp1Pw/54JnSMG/l2b6X+7O7cH95+LVV62pg2BYqyNWf8tRPQamHTGKG4HIjeLIvYEMawHVvBA+VD8sOXR2+wVdRUjn4juIl0VfbzradSI+UQ2bo/CGlfNTR3q14eopOWhCOsDS+lyOWo8Lrd83+vZVz+XoXOA/WF1NubDnW+gkAoFO5liRxTtrDbHfMRMWcb3+25vIAecGDhR9D/g9OBTxot/BLue7uc4tS0REIGdQUCCd2ccJ/VytxOAjzNrnLnvvilm0QlczqYwUBscAYpCyxh3Vowh0sgoLiODjOJS3HLCWdNOOMvet+tgGUYwc2FMhcsjuJbIZESwUPWsiKadYaMt3x92b/dF0VzDrYFwMK0BIfyo7BcjqBwH+5PfNrqvfizPSXusslYtZ5HoOXh3Gf1ltJeNFdk4hmlEelmcgqKX6/Tze+/Qu4sobrcQPxs+3g/gQL0Ku8Ze1ERABPYSAQnevXS0NdahJZB0kdcJpl2nED8vKcYvSCGA+/mjP7QD36aOUQQu2hQIGjcbxeWEMfhw6xS6bWRUgDhjRJXL5stTdC5ta4ncfFlux0d0NyxSgHEjlMibb7lA5xbYB1oEOhG+QxgDJ7uxGhrFL20P1Jdcpu8R1DW6b0eJ/TKLA1Ou0b7AfL0sq0xxywl8tDN00e8ZiF5Wb6MlpN/9ZPq3FEo6TbxXOsXi76Vu82eulf8aQ9fHIiACQ0ZAgnfIDoi6szcJJIc8/BjD1xmZH3c6bUqBvQliEKOG4ML/VtRSZFkvKR4Zbe0i8lejTaEOmwIEbhtikWKLQiwXlIyWrlfUXrX76ACjxuWyZ4VznrXhqstv8APbV6pLNPaVArKNCDVFOvvPyC+tDzZjApazE93QH8slW23g913sj/ufRB7eBdgbyJ0+db7HY8KJaxfnHOv7ZZ8pkvvZeL2EqcgCx/v7fq04hWwo/0s/t69tiYAIDDcBCd7hPj7q3R4h4O7DFP+ON+7OOT+ZaLZaX446hR+FoIt/5ayApcjFe20IW6YMY1YFpg1jWjAKv1zg0he7tF2z2KXAhLAOQscUisjMwElSA2wchx039sG+02vcRpqzOnzHjPoyuwBveTYICn8K4EE3dMueTHAy3hgyGVDUziInL1N7MY2ZFb0Quaw+t783kY0Rdq7Xt4aNpZyxVvN+0ZS8c8br/Gbftq0NiYAIDDUBCd6hPjzq3F4h4Kdd5L5PXht3gqeYgmuYE19t4wQWxR7ELZ9TyTJySHsCo7h1CFwKXvpGmULK2hQg/vjIds3iNtvMZffcJgXlCPLusmT0VojLvANksChscSLFFGe88QSAdgdGfRn9ZeSbynIrxC/Hz2NSKjD6nNpCFKyORsFLQU5bxgVOZOulLKPo7WsDlNRFJcNu/TdQnKKO3HFvM/3eR187rI2JgAj0g4AEbz8oahsicI0E0vnCbVBgfz8N48GKXYrAAbQBbXbdPc2FHftBSwIrmtkCDsyLC5HbYRQXQouNArAAy7QVxHjN9/PP7AJ9vqN3NyyiyAROZPptZdhIVzleiko22ivoo2X+YA/qN4v6ZlFXin9ypDAdFBceirw6GzM00NfbgBBnY+SXGR6mYW+YwGecjNdv0ctiLqhmyDH+lhO7czhEd6I4BXYEaxFm2TmcaWchZH1afs8TAwfli8cwGY8R60FxWr5fvRYBEdg8AQnezbPTmiLQNwJON/lH+Nl8KX88bcsf+7aH3oaoNAbRsN2rOjHyfXJMfJ6PbbX3ly6bL3eVflPIUbzQpkBx26Q7BALX5nXFujaKi3/pcoGbb2YrRAr3waGUK/CPQiRtxT7z8a32SCa9oLbtVxb5RXU3vEnxW0DklxPfKJDZZ94GEZmmkGVfWGqY0V2WJY4woY8nJTxxmZl34PmFUMeEN4rgfjamm4ugXP26eW+xWJjFF+TPzEgNVQ49E7URjY9wpQVRaMjiK3YbVFzzzZOR+cA3EtNAdDq0lUAASU0ERGBoCUjwDu2hUcf2EoHphn+bGyeeFWUUF5sYfK4RN7HqNa8ySCG3loygSONks5mpCJrFtQKKIsqmDcPIrBBfayPXTGDlDTC6W0RFNebejXrlhVdecvveJau8UdQy0tpA5DfA2RftDlb84peCk8uIsd/CndtjVcEyLQ4QujMo6MGMExTAPGlhcYpJeHqZwqyfE9n495LYP7jYc5vxh9JC+KPOSPvT7lxoug10BOnoKHhXaj4iu199PDJv/Whsbr3Jt32zJ1grLaz3REAEhoKABO9QHAZ1Yq8T8NvRR9ue+/w4cvarKOnGvg2MBPqYEFau+qbdwCx8CKVcgFudu01il33gpXEKXtsf9oMqa4gbrzDkl+gp4Brw01IA+xS+jPziRlHK6CjHZMVvP8aDbdHXyxRq+ydSM4vILvdLewP3MQV7w37aG7D/foteDqYTtXyn2fmgnwQvSR3nHnuclpwIXDFE9GkElobCpGN58TuoJgIiMNwEJHiH+/iod3uEwH4n+AiKBzx3xsT/hFZCtY0RoI4cGfNsBoSok6Dq2PYrS1ZVKyINmY++2Oju9ndp3VAZ+FxqAYkgfFmIA1ZbK3hDWB6YV5filwKZgo9f2/xEY907WrYgRS8j9nbCGqwpTF9mBTiWy1OW0XLRT9HLjjuIwCNP735zOvy4qSQvTV3z4A46XMso6qUIiMBKBFY7h11peb0nAiIwAAJdE1xMIv/9yM4AzSDFu1HEtA6kIDcyDksDJmHR07udjWIXGQBsdJcRyp3e8ly5FJ9MI1aDGKW/draGdGdM7YYx8jOKVT5utnFVRpYpfEdgG+CENjuBrLfBKaQx42S7fPLdZvdzxXr8ukC8x534qFN3/xD9QI4INREQgd1EQIJ3Nx1NjWXHEmhC5HaT+CuYGfQV+lCzeNmOHc7WdxwKhaKXIpORXhp3t1NopjClFkuezYBA8bvTWz4CRn1z8cvnTCc2hygs8+ny1miDOxamL5jilzcstqHG7TJSzCguo7nMyVuApYLv8ZhSZOdpzDa04TUWtoUpsJ+oGz0T36BPIJPDvjVW0cciIAI7iAB/WdVEQAS2mUCjgjRaIyZyx8I/pmJId4FI2g6kzK8bhK6pjMI3CwFMkbTVjcLbg1msUIb42+ZI8yDHTmFKYWszOWBHbbBnlgVGfufwyMwPNvLbWyaP/G7kkNjCE9jPxKgxo5VMPDMCPI19MKUaPb79bBS9MfqbRt3n+0F8Z1bwEHYHDhZXDlLOgGTEfsIxB6rI8rALovf95KdticAwE5DgHeajo77tGQLVgmeqBd+MF/wPhYlX287o5E6Hzly3pYpnCkgFth3WBh47encZbd4Owb0dx8/qwZ6wpQZsobIbc+vSgjAL8UsbAhs9vwGWW5oZIvvk6vcUuGRaRXW2CaYowzYoNKd79gaKXu6/X405epGvDOed3Vc57eSDDopUeDAwO7UI/YeqLznm9z8emw/enZrJUr/2qu2IgAgMmoAE76AJa/sisA4CYTFGMQT8sJaiM37V/aiDWTNqmyNgL31DJFVGfJsOzEZZ+yiIVusVxXaACV3FEiPMG4llrrbVnfUZI7kUtbbCGxC0YHOYgQ1hquf5bXexAN6nNcJaHtZxbHjBgxaHYpjaCW2lIvIsQ/RyIluTnt5+/7nwZAU7TRrxmxCmf5sVvPOZ4HVwbP/DRyLzu19NzD6cVKmJgAjsDAL9/mdiZ4xavRSBISNQM5GxtzQycTX+Qx+hMFZz2rABcsjGtS3dgQahbxaSxVTGeM17a6wFFNq8MbrMIOFedqUAg/3qUvwyIstSxhSoTDU2U8uis8zAwHy7bIt+Xyy3WssLVbAYxShsQNwPU5bRPsHocV8bDmIaJCZuer+QRv6vW3tDz9JwFJaGCVka+opbGxOBQROQ4B00YW1fBNZBoANlwFsLP7LdovtJUzD3IGODjYStY3UtsgIB+nl9pJuqMF0ZWA7aXkDvbojoX1Ac3iITK2Dakrd4AkBRu1T81lDYIZ/sttDMJqJR764lfil6eTLIsr7MzUt7xAWI3jxvbz9PEtkfx4khrJ1fNkXvX9sv0pYQ005EQAT6TaDPlv9+d0/bE4G9QaB66tI4nTRtR575k1rBeQbNitZTeOljPVsvAagVWgxoL4gBtLEQWwG83tU3upyDBMolZGbIYpuMPaqtSADHhZEWF6h4EkIBS7tCEyd8tEKwjHAJ2RlYhIIJSxgp53J8tAIU69r3IHpLsI/445zEBnvDrGP2jaemCl8tszj0rWFnHfTDSdz/VIi9Wfw9vq9v29aGREAEtoyABO+WodaORODqBIJ7kdi01zyINGfU+0Pn6YVfwaxw30AQ9DNqle9nTzxCJHHiWmXENSxI0WmnAxG9FNZhEdHdAsT1HvXubub7xMgvb2w4VDb/bpvV3RD95WS0IsQvSwr7EMA8lciFLpelCM4KVaTmAFKXMVp8YYbeW+TwrUKkQvRymd7mscbVG7dnO8AnXAGPuR2DVwkMqqoZFxueCH6nkKSziCp/hH1REwER2DkEJHh3zrFST3cxgZkf4s/5pZZ65jtOK/0kwl6vMh5+aNU2TYBWA2qYkXHfzE5FWb7ey3FvettcMRNVDry7LCEMFSQhtCmePEaM6OJ/K2zp7+1gghv9v0zzVuxVd6MtgsvyvIJWlUVfL0pFMG8vJ7IxiwMzOjByzENytZZ/N7hfCmwrbjExzlDkYltMQZZCfM8spOa7s4l55G9b3v2nnA+drfv/arTo/BcsgT2oiYAI7AQCErw74Sipj7ueQP3Z/Am/1NJCagr3Ox8Ipp1XJUp9dAnMJp4xgkhhRNFUxSS2+ZkoE6mXI9/ElrNVmAWCRSZ8pApQdHfTGC9bkdFV3tgYSWW0ljcPb1LUshAFH20mCC7TE74jyNXre6kVvZy0OMaJZRS9dkuX7ih0KaC9ce6IG+AtNQvd1JybSs3pC6m593xq7sfjI7xdTM2ZudTm/sWXxz12IHlbKXB+PHXc/wNrfvnSlvVMBERgWAn06Z/8YR2e+iUCO4PAE287dllHUxe2hoY76iyUvhm76Y1X/mRftrherJMAI3jNemJq80gBx0jhNf4LmAV0HTM6zqpqmfBaZ1e02CYIUPxS3PKwcXIbRW8I2wOjs3kaNJunF4KWkd4An3FyGwUv12NLIIDLEMIwC5kvPILI7TQELkTuAxC436WwhR94iuWSO1gL/zv4ztAXXMHySJWdZYPAgWfWCd/3mbfh7bj9Rpwk5/DadJGzlzPp+Hxudtacu3Ah27HuRUAEtpUA/nzVREAEtptAiByflzX+QofRfHcy/IiZ9X6Jl8qvVZxdtv09+iLiJDZUQIu6rmk1e5PYyHqTzUYKkYuVHlNmhVAbLAEb+e3ZUSh+mY6MeX4pdjnZjYKUnl8K4UMTKawIjq3+NoIUZlyXx6jAim0HHPOL/zUyb/8cTnyKiAJDtrqYdMhJc6GPyW9YpjSWTaLLI80cWS64Kbn59xjHMe7NL3iu+xpMZnszXrxrsAS0dREQgc0SkODdLDmtJwJ9JFCLEIZa3jDBKm65fxx0nF/0S6mfYDKPDW0tX06v108AIomTmlh6OIbRM0IUz6NfcxONEUOKIQro1Xyim9i0VlkHAStEe+KXft6olaX1Y5qyMISnGgJ4fBTvoTBFE1aFAkQwI77+Yce89U8i8/99OjKHD7s2IwS/ASwrnJ9U2nMg3FmBa1+s3qEoSU5A9L4zSZKfxpL/Dhv64upr6FMREIGtJiDBu9XEtT8RWIGAy1/jFVqQpn/th/EXO03n9s3JshU2usffolD1EMWjn3f2Igp9IOpHf+9GG7275ZHMu0vhrJORjRLc7PL4S7DK9NIjpgvi7AOFKFLkzEUt4mYtNi14F1gKuOJHxku7Jmo3TOnmsvnwl4+Yf/Oh2Bw54pgxRHfbvcg8de1mT1z4t4loLxOqvMjzvM8g2vvb2Nhv4sqM/AybPcxaTwT6TGAT/8z3uQfanAiIgBmLcW12heZgAk676X/QpO7tKZ7jqqtaHwhEiPjRzzsygUls05jEhlCes/Ta9Rr7oNhlZJiZGTRRbQ1YV/14ySnckqeXZpj1vuxWheI5bT0QtFC0CL3yBq8sRC3yVmMP2edWCFMMO6hUCK9C1ymbGadq0uKIue7WY+b+mab5+f/6NaSQ8yB2A4hdbPOq/dvYB3m+bER5Q3wp/rUTBG/0g+AfYiuf3tiWtLQIiMAgCEjwDoKqtikCGyTQOLfyzy4vvztF82HvsPt/JY348AY3q8WvQoCaiLlzC6iKVkaO3gYigkiysO7GS93VMksI98oWr3z41r293bUgYFgeK0Hhez1xykcrWPEl74lX6zfhlx6C1q4NMctZYbQbGDcwiV+AWbcIAVtG2V/ekHsMYjYJR0xaQDLe4phJivvw+The471wFMsUEXn1jfPU28wX/+BjZn7+E+aGI+OmEwfZPgYAHyPDJLmkHAQBCimriYAIDAMBCd5hOArqw54nEF139T/F1DUzQTv9mJ84P99BiHcDumzPc10LAEVvuYqiFAgWdtvJuqwNuHKN6LBrCqjgllD57rlmpShUKB/zW48DxSqErGMjsHjO1zYii0gsvCNp0ulFabPljBvi4gXsPF5gUitm4WWHeI0pVosTEK0QrFa8UsCOmgQ3E1QgZDGrzMeyELOJhxQKMO46SKabxWvRF0Z9bTSYj5FxcYCTxkUz4c6YEqK73QQT0mxP+3/wOMHUZmvodH693e3e1f89aIsiIAKbIXD1X9nNbE3riIAIbIrAhZGeYFhhbUoDLzZ/dF3N+XmvleAH3sa7VlhSb22UgNVFAFwd9cwc0lPRnmDTW11lQ1yejVYG6j3qul3RlorXnp5lANZ6aPjYA2UtBbmdAELSiWkrwM2CwYJclmdkqJzC2sFWzEKcMvpKsZpAxBo8jylcEY1NC+N4H2K2iNcQuQnErOOX8IhIrg3tZpytkMU+lloaHESHkTvMuF3kEOOO+TmeZX3hEzZ2CF3kZ9GYXb+3lH1/EHcuZ805zqlGu/2OmEmA1URABIaCgATvUBwGdWKvE0hWufDJn2wEyj7daZivu4H73EURsteh9Wn82SS21IyMQfTOYNKT9fOuvHEuGyADQAgrBH28O6tBDubC1j6i93YIuEM01LG2Aih4CFlrNaCY5XOIykzZZ+uniMqanrUgKe2DzQCC1opXWgoQla3sNzGjslbcQtAyEotcYAmsCDYHGKK5NgkuhSGB5hFgTCzjflLcnE4d/el9xr7lgnoROKWtlbe9h95zfp6PzS7be99GnpcsYz/r/52N7uKMqRtFb8Xe6oz0qomACAwHAf01DsdxUC/2OIFja/kU3DSJJtw/iOvmuS4z3m9ggtUeR7uu4TNTQwg9Vh1B3ta5xCCJA3TTlQKJbxXLFGrQadumd5f0yz7lXa8zuYC1EU++nUAWorO5eGRUFMLWRketCMz0Io0yKb9TsBcwKmv9sNZCQBEL0VqcNEkJYpY3+mIRpXXyqG2AKg4UsR6isthEiv1lYrUHifuz0WBEhDuo6sD92v7gkbMw2Wc7BN4tafYl73Bb4VgsWXIonlLs2uhumj4Qdzq/W6TY3QH9Hgp46oQIbAEBCd4tgKxdiMBaBJgIf9XGUqoN8+HuvPNrkA24oK7WbwIskEWrQhcZHFoNiF6aPPOGw2NFcQHezxDe3YFFd1cTdz1xaNU2RWMvKmsjpIyCJhDhEJt5NJSPiKJmHll4Zel9RbQ1gcXAgU+WFoPcI0urwSXPLKwGWNZODqOIpc+WghbNZrLg/gDDiuYIntyoAQM0+8LoMEUuH6li2V/cKPqs8FvymG0sWwZv25Y/9l7utAd2HynJTLvdfks3SeZdjtly2GkjUX9FYHcSkODdncdVo9phBOpfh0hYoyG/6GP+weATXsl9fdqBsFDrLwFoM05Iq8DawMcIjJmvl406jvqtiMwM9gnfXFdbouLs0/x1/tgThVYcZmKRwtVaCCggkV+APlnml80EJbMWIOMAhJWNxHoQoyEirMhYYGgtoIhFRNZaCmw0lj5ZvAeBu3SyVxJwohesCZnf1AozK5h7/cj2hX1G8MfCb+NamwP6kwtZO3b03YZml4LAuKzAXc8pGdffPc3FMUF54fs73e4fcFT6C909x1Yj2R0EJHh3x3HUKHY4gVaDE29Wb8woMFHrvD8oll/fhtBAfa/VV9CnGybAK+2UatbPO8VJbIzaUQijJHHJQ3TXBjd72+2JO/tq6fOlIpbPe0LW2gmwwQRHj+FivrbRUGwAGQYWhaLrZ75XO9krS7dFG0FifbEQsHjOiV8JJnrRWmBTc4UlRG9xw7oOLQk2otrrJr8m6EPm0c0is25nodcv9g0LUH/jkQ+XtcXt9D6xr69Y6rJV9uoLWmCibvc/wtrQstaGvQpC4xaBISUgwTukB0bd2lsE9p1Yz3gdiLHkU1HkPAj1cqsNIUl7rAfchpah6GVktzLqm4VZpLOKwR2qt1SFkKQcdrEAGxeEaLWX9nPxal/DG2EFLSd9Zcs6iMou5pBlZgJYC7JoLCOwuJXgkS3QVoDH8mQvaktbAYUsU3dBaSOaay0K6IUtQMKoLwXzEvHsdJn2i7YG7Nfum49Zdy/d5+K1904uavPHSwvq2ToJkCjy7v4tJqu9n7YGNREQgeEjIME7fMdEPdqDBOYbuCS9jgZ50wjKzh+WjPPvIwfC5sqY3Dq2okXWImCLUuCqf5wEZv5Cw4yVayZspyZqxZgvmCvILCpLf6v1yVKclmAv4GQvCFhaCxa9sfTIUuiiSEIWocUjlrdZCxjdxdmL9d/ayVyMAveEtM2SgElfsBYsZi1Y2vmritT8TIh9XLqCnvebgJ2sBpFbCMP/G4UmkGYi/370e0/angiIwLUQkOC9FnpaVwT6ReC2LBK41uZcH8Konn44ORX87yaEGtNv61rI1v85hGF2dR8+WazVbQSmCP0ST5SmwonD+zqFKvLHIjsBJ3zRYkBbAXyyjMzadFxIvcXqX8bj5DBM8oK9wOaiRZlbhlmtjYFR2QhlpJGCy2YsiKezKG0ekbVRWe69p1KtoM1FK96z2+KQdOBJYRhaz75wV7PV+lNGd3VkhuGoqA8icCUBCd4rmegdEdhyAqWzyHW6joaqa8Zrtr/tpZXPtF3/jpSz5XNxtI71tcjKBFjjIO26yMoFYQpRiaQY08FE5/PR9BOfqlz/vM9eeMGbfwDK9PX4B/NlTlg84MPM66AWseUPo2+CCWbMH2s9uTE8um3mke29tmJ2DRlEYWt9vIz2rtbW2M5qq+qzvhOw0V2kH4s6nTezuAUmrfV9H9qgCIhAfwhI8PaHo7YiAtdEwL8Xfs91tjSCkLo+/n1vLLiDGaGuelV7ndvbc4u5iOCitGw27Q9T/+DX9TAh0Cuk30ui9C437fxF4Id/Xb2+dnKh1UXJ4dhEQfWhwG19ODp3+vh8kvxQ2Ytf64XBD8NVcoQxvbBcQO5eVAVjPltoV5YcpjTN7ilmcVPbdQQ8pn1Lks9HSfJRpiGjAFYTAREYTgISvMN5XNSrPUagOQY/5zqbCzHVSbw/r7bS055rrtdv7DrBIdKaQJC6zQBOA0w/K6EkQxrd49bTTyNu/uXyjbN/VTs3Mm3ayJ4QBCgwBikLYcwAus1wYBBNd93HIqSH63S6H1h4cupoWKne4RXClxW68YsLoX+IUT4fdoZCGBgPhRwcltfFe/mNQlht5xOw5y84lLAzJJ0oegtPaBTb3fnHVSPY3QQkeHf38dXodgiBbgV5UtfbIMDSKJ3pNpMPYbL/v4I8w9X29a68R5YDj8XoKgLibgBohdD47WQhrnT/2neTL3bnO5/xRsJvBo1Os1tGRgQsYtsa0VhG8ujbxOJnkIrqPUGh9J7awsINs/PzP1wMvDscv/ByRPwOYgKTqUD4BoEHOy9SmuHStw8bhG3oH2b1Z1FgnbFkTIbsnmnGbPEIfh9wjHgyk8C+EqHSIXLtIlVdYkql8GOO5398pap8QzYcdUcE9jwBCd49/xUQgGEg4Fy3wfgQfoO7cfrH4ZzzC7iWjllRUrxEsEgBNgUEV5Hylo/+mbSbfKNYb/z3wmHz5el9nfuTJwLUao4M5tYjw0JP6S6uvM5vRE8YMx8y8t4+3om7HxirlD/gF0ePm7j54m6z9dr5Vvt5yEh21IPYRWwZ4te3wjfk68A1Xm6DwC4ZBaYIVts6AkuFKp/bQ4rvAb24iOKbdqdjxW0EGxFSjkHwMjMKKvKVimZyYsxURipvoed7tXbq1KnVPtZnIiACW0RAgneLQGs3IrAaAfdEa7WPr/wMPlQTu1+JHw4/7853X5KELBrQE25XLr3r36FWTRHFDWFBSHBL4+Qhp+F/IRjr/JU/lnyuedI9kyy0jXs9sidYky0itD3B2g84JG89nNyY4z4GS8Od+5LOnY/Ozx9teSMvm3SDl7ea9TvazXSSlSx4rEJEf114UkJEgENMgvOg0D28zvpFG0TWs9wOkb3S/WYJWJw4UDxOPLHoQMxSxMYQs7CpoKR010Zv+WfEaHypWDTVctmMjlTMvn2T5vpDB83R6w6bw4f2m+9/6k3m7MWpD/762977pWa9YS0sm+2X1hMBEdgaAhK8W8NZexGBVQkg/rjq5yt9SEHUSp3fL/jOSxx6GnoCaaVld8t7mQiEuKe3FlHcxEZnETlNow5MlPfNm+Rz4079E247vLs+XZoqjAEK1Sgblk1tOobs5eDus8vfKM4G8QqhbYI7u83OnRMHj97QTtIXNeenXocuvbDTjY6EJjT1dtPMJw1rkwhD3zD663mIBEMIM82VtU9wDNheNhku8wQPrv+7b8s8aQjD0EZtG8264a1cqtiTjtHRqjk4OWkO7J8whw4cMNcd3G8OHNiH57jt32fGx0dNtVoyhaBgT0Z4QuIWwqnCxQv/7t/+b/+TFdCrnTz9zM/+i90HVCMSgR1IQIJ3Bx40dXn3ESh4yM26wUbx54YpPITeLIqZju9mIy/9k2ycFe9ACKYtXFruOE0vib6Wlt1P4oMvhRcbd7UmC1GadiASA6QN6yndbNUN0u3f4rQ8MONYUCg/jglO7/cC7/3VcnDs4rnZV3TS6I6wMPISTH0aZ3W0djMyDdPKhC6FFSK+jDYWcPPhCfYhgD34gBmc5oS6BOsoArz2saKfutVqm0qlZF78wueb77v1FvPUm06YwxC3+/dNmNFK1ZTLRSuAecLBkySckKBUcGSjwI1GyyxEdTxHCjrsrpLEbxnx3JM/fNNxvLKmlrU7oSVEQAS2lYAE77bi185FICNQPtzcHAo3PdueLv9pEvk/56JIwm5pdsKZ1auZaC0hMpugkAOqy51J28lXnOviv3LPJX/lPxndn3qO6WDSGXVtNiUMqaKGEMRirl70Df2DsTN9z3Rt4T3jUeuW8ZGxH2ynhTt8P729GpYOtuoQV1gooXcUXtIGRJWDCDUtDwGjv1YA0wqBbBB4jyPPSCkKvPTQMzrug08X3ttv3fugOXr4kPn9d/2/9gC0wTWCjaET4YbnNVgTojlYHGB3IEtGbfMbt8kTC6KOovRTpVbrP6NWnolr9aW703MREIEhJiDBO8QHR13bOwSCGkrSbrL5nvNH9dD8HH7TbeRvk5vZ9tUoUnnzYM9wUGHDjTyTODEio+6DyH17VzWtfbxVN1+Out6ZsRuhPAqIbjIPaq70tn0EG++A56GARdJ5CGWDH2qkzp1+fP7EzHxwe3F034+VTee59cgccSl0UZkNidTgN03gNUVhC4MrAhg3I94+M0D0JsMFSInGTBCcDMdmo79Yc6+lQ6NQZTScEfC5hbqpQZgys0IRvtwzTzyJkwhEb22xkOxbB+sJrgpkApfrrdjwvcR/9zmx8ybWy4tworV7TjFXHLHeFIFdRUCCd1cdTg1mpxJg1qzNt/TTrcT5m8gxz7mmzWy+A9e8ZhJD1EF0JKh0luLRj7pfbofRlwoN9y8h7O6aC8yCn7CqHMQIhAmUcHazEvmad7+NG4DgsuKUYgtDS+NHFxrR+/xD4++baM4cc5vTL0sq1ZfETvCjSIk16WKiGyu4xYv5fJGTGdHJVhulivEf9K+NaDIXMC/jBxC/jAbnYo4DzSwQ9smOp7f8wGVCF98j8Kk1mmahJ3QpYotFZORAlLbd7tjILU8WepcElm/mstcUw92kawqR87AThK9ox41pE3dxrPAVvGxJvRABERhmAhK8w3x01Lc9Q2D67MY9vItw4jSCqvkjfzx4ToxZ5xQ+w9gYS6Pb0XYPEVxOtIutuGU0LpmLwvjukXr6mYXz85/uHPW/3Sl224VGFvlmvHJYx9Vf1hStOH6ITGLS26lq0n4fDu77znbHjjlp42WjgfdaiKwfDD1zkKKujSIZPqK7HpanYqago8+0gxtMq3ZCFSe+UfAxEhxiWT5mk+Fw8mB3hZMMrGdvGEx2nPo7qkFuDV23JwscFwfUwLgZ0W0hisvvDG0fbFyOjaJ4Iy3CpEJvtNoqheNv6LTqZ2iRSKOCQSVqRXg3AlLLisA2E5Dg3eYDoN2LAAk00g2mJVuCLYXY8YuFj5S84FdNx5TXE7VasvqWPGVA0lpNU4gShKINNIjnOBecuPN5SLFPj012vvK4P3tvYWYMldCQ1D9Fyi4uu8cbTwhYHQ6FLE55afq+1unz7+tOTBwvVfyXpWnrNUFYvj1KO6P08aZMC4GWXcqHLaQngOlJjXAixK+Y9QFjmxS8zALB6C/tEHzNGwUwJS9WWRTBfGeYWwChS69uC5HbhVrNNDE5jQqYAnhj0vbyUVIX0yaUdFBZOnbf6J647u6g3TYh3qeUnrt8cb0SAREYcgISvEN+gNS9vUGgdHT9pYWvIEKdUzQPJzXzl07ivtpea71ioa19I4sWQhnAeuB5CTIL4J8a103ddvSd1DdfStq1z3aT0ldLQfxY5DLTAGJxuKGAQ08Zb21/h31vxMLMcxRy+P+x+Xb3vUEcv/eWW7ybn3y8+9KOKb3SNe0Xxo5zIMWCPnL6xrA+2PUgzhwb/cyinIwMx5io1ep27BvWB9wTvBS/zA+ciUgIRvpasVuuk1WGQycyXb1tyPLdZ/5l307qm5mdN/UmTxoxdozFiv1r7CGLTRRLJTMyVvifZ2rpnyUxahriTCDfP7moiYAI7BwCErw751ipp7uYwNQjG8/Dm+OgqOFvcbmQ3DlxIH11h7/I+a9yvtAWPWa7hehgSrDEYyL/ThwX7imHzb+cuph8tlDs3lWqFObjBgsix5nAtZJqmzq8RVz6vRtEx7FJnkx0H8akxYcbcwvvGpms3OQ6xZc2WrVXB4Xgee25zsEEVcBC+KLpkUZg1zZrmeC6eJXbGFiAoY1JXQ4q03HLtiCG9QHTAgERzGwQdlJXngEDFgiK4NwnkG16S+5ZOMJGsSE+Uc7Z1BaQXQHPrVUDn137159bQOYPsDhw0PvN8RH33VMLPDnYkuFpJyIgAgMiIME7ILDarAhshMC+Z2wyLVlvJ7RwhpXkY9HZ0gPIUfs0qhkKl4E1bnxRWUD82MvKeBO5tFzPqUVp/LnEbX+huj/+XG0q+GaC/FrIRIBVsAzTKlj1lW9kYL3c9Ru2VeV6RxpsHwkd75H5VvTu+drs8WPHj7yyW2+/uNFovhJljMcZncTXxEZrKRrZGAm1zxjhte/0RDDEbBOX7xvNLBsEfausBEcPcIDiGBScjNrnleEofu1/+E5QRPe7cYuLQhdfdqYQm4dPl9XRKMgL6BN325c980oDYIyNhb8Lf/Qv26wh+L66qIZnv7/9Hpy2JwIisCUEJHi3BLN2IgKrEygeuMafaqiWJHUbccH5E7dhfjnx+eufiZrV97yBT9lFm5oJj5yxw2vsvSIIfhyfirvu1x0n/uRYvfW5x/3KQ27YMaOLPkr0xYqsaxznBrq7Fxel6KQNARaEx0YmSu/qOvG75lvBiSjqvNTpJq8thO4LERHelyK9WQLRihLMEJI4Jnn4l4cYx4ni0gaEIfxsFBhq0uarhRXCNPk5nCdYnxYICk5aIHzkB6YAxgkPRLTtw+K6mz0W9iuHlQNrAHdhW0DmBYhdphXj14nV0/jYL40dY0MB8j0bJ/5znLD9fBNjRWY8RMgj05mZAi9emVATARHYiQQkeHfiUVOfdx2B6Lubz8O7CIMCwJgPwUnwS0jcUMTLvjYKi8SBqKGoQkQvLnoPuV7nk05Y/Lz7vfkvdprRk+6No8aFKHCRZw3Sh8kG1LaBAEVr1EX6Mkxkw3+Pwtrw3m7svbfU7twajo28qO5Gr3G7nRc5nj/mQEwmFLIQvg6PF9Zdelpio8B4r+eIyD6DMIzjGJPhmIm21RPJzATBNGgQwvABUwgzEmxTovG7wP+wXn5bD5YA63P/LUSbGdFtI/0aW5aRIdtCv8Qut2Yn/znp3djRTy/U22lttmGj4j4U/uwD3852qHsREIEdSUCCd0ceNnV6txEI3P6ksIdl8xvt0HzetJxXGEZ5e5e7N8SLqyHJqBU/EEPQNcaPcQk7hPM2jr+BelNfKj6r/qnm2eq3nJnOlIMoHwtAZGkYGFjut9TeUO+18AoEeER6h+XBNHEfjN3wd0bj9gm3mr5yvhbfgZQZL0o76XiKCYYwL0D7Qpjaw3jlsczeRuRzyXGmiE3S2LQ7sc2WAC+EzZwQwAbhByyOEZgCfMAuxDAnmzFgy4mKzCCxVADn31i7DMRuu9OxQpfWCspwimjutp8iN8cF2w0sG+EjJii+rtNqLLiIejNangt9F2NQEwER2LkEJHh37rFTz3cRge74NeThXcqBQrXr/Td3ynsF9MfSK9VLl7rqc4oP/sjHXYgTZE/wUmcmCJK7o0L740nL+0IhafxNGyrJVBEK5KVwKweuFEVX3YE+GAICOG74H7L2URy5d6at2XdWguBpplh9cTMs3GHqtRcmgbfPfn9gebC6dom4XWkAeRQ4/ywXsaxuhlTBaG1rk2AEleI3pAWCGSFoiYCwpYDlt4lPXIhkVkGbR+aFhQYirLiawEgvI8Vcpu9ilxtEP4wTzEetxk96YeE0LRlqIiACu4uABO/uOp4azQ4lMDOz+SwNlw2ZwsF1Pj7ip6f9pHv92mUoeKEZP+6I4DqwISCAZpx6fKZQbn2qU/a/1D3nfKFcjR/ulhFha5axq54Q6OLRKpTL9q4XO4jA4uGDmIVAfcAv+w8Uk/CdtaDwFKTXeHkp7r40Ganc0W12qinKGcOnYCO/65GCiwI4D4+CCzM6xBDQ3W4LeaezEytOhqPg9f0QEWCmRPNNHXl05+cXYJdIermCs+/aYn/7zBiS3vgQ5iOt+E3zlfAbzGutJgIisPsISPDuvmOqEe1AAv6X+hThxdjTdjqdPCv87+kh7184C4zELgFCQYzXzHlL24Ib4Z8AipJifG95un3X6dT8RTJWvOsWv3F+tliBSOE/EViWpXzVdjUBm2kBYi/13O+59c67wjB518KFmZtdN7zdGS2/3kuS57U7zfEIVfIK8OhSvLLs7nrPfGxmCIhrul/YGAWmx7gbodQvyiPX8RnTrXG7/MpR/PJbxwDsQBo2zJM9WnLi06f+qdtOP9a98Sh2iEId8KF3WT4YUWU1ERCB3UFAgnd3HEeNYocTcMf7GFWCiIga8R95Te+f4tcbBbrwow6RwccUM+ht+inH6bpJene7EH3C7/ifL5dnvuJf6LTj5oiJ9/E3nxPO6NPc4WDV/Y0ToMKkfQAHP2p1Hi6OlB+uju//nc4TZ55W2n/kRa36wuva7cYLU8cbgzq1vlwWpWBjxTMK2fU0RoE9+33MFLC1QXAbiPrm/uD1benqe+M2ua3skcv1vtAU9vij4HnceKH4K4VjJ37HiVJzoFw0nMSXTgQ42eOY9Adwdbr6RAR2FgEJ3p11vNTb3Urg+j5PiOmkn09j96tIqvCDDnLjxgXMnm8nU5Cwd/lR90sRsiukcfXBdhmJl6y4hY+yN0nHWnN3K2eNa0ME6OdmS+CpjWB7GB2dfABV2t59dmr2Kcf2TbymbaKXx63uD+FEaozR3hjV2xxOLLNCkeuuX7LmItfucMW7XkSWcVl+V/GI9M44ictKIzNlWAyRaqPOFN0Quqw4h4mWmHCJPuE9jsOe+OEPw0napjNfe4dbHPmNkQOHTReflbg9iuSwbIXyBrq/Yo/1pgiIwPAQkOAdnmOhnuxhAhPwyPazOaU0hUD5vU6pcFshaH2ufdr5KIrOfqWcuA+1qEHsjCRE0xjFXb8m6WcXta0dRoDyNcFlfmZWiBPneyg88VuOH/xW0oy+r+rD9mDSVy7E7gtRmHg8dbqwBEBoMqftMtUIHWononH4jAjbSCqvQmTamm/bRuHJdSlgcW9tOCwCEaMqRITsDR3YbcqTIyas10ytVjOl6ogpeIHpwgOMHbdg22m4XtBE/LjtpMl81PamUYCjhVzRjSDwul4nvLc+1/iN+DDGA6GeoL+L11loq1ATARHYVQQkeHfV4dRgdiqBUqPe1667ASYHPeHdGV838hn3gHnEX0BO1iNIH5alMcW+lqmLvu5dG9vtBChOrSC1J0vOfX6U3gevzNsPHTlx8xNnHn85AquvDL3w9jjujNAakTLqi+gpU551IFZHRiumUyqZ2ulTplQoIQILTzDKG1trOXLrmQh2h4ITuZ6PmhndDvy/sxDHM1C9DacbzZVGi1OHQtOcOn2h0ZqcmBobK0034k6zXBmpY7LbbBgGU0m9NTvdvNiYmNzXbc0sNONucaGIiXcwrmMzEfaJKC5fq4mACOwJAhK8e+Iwa5DDTiDJZ/L0qaPI1MC5Ny2U+n2EVgV6d5cF2vq0J21GBPDV6glgVFt7uGs6D/tp+b8cKhVvvdg2P9JOzU/5cfT9ju8h21g6XygVGu1msxGefbJ+6PiJi524O9WuN2a9YnG+6ISznW5z3plwF7rz8VxU79aKo8FCFLVrqRM0IwdxWa/ZLFUqyUShYy5Oz5n2voPm0FjV1KeetP2gYZ2GB2aF4EQ8Ngd/X5k9I7+cgb8PenRtFFlHUAREYC8QkODdC0dZY9ybBOi/5C3/jd+bFDTqLSTAyWv07/I/2A8edLzgCd/xznizF38orVa7kdudmpyYmH/onkfmD99z38Lx21859dj5x+cbswsNr1JqhiZoRN1W0wSmw3lwcZclhBmFzb7EvIdUxQfM7oAXyLBAwwOjw7b1bBB0+7Kt7Qu2i+lOBERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABLaMwP8PiHLGLtI5pqYAAAAASUVORK5CYII="/> +</defs> +</svg> diff --git a/packages/website/ts/blockchain.ts b/packages/website/ts/blockchain.ts index c955e1033..46a4d6629 100644 --- a/packages/website/ts/blockchain.ts +++ b/packages/website/ts/blockchain.ts @@ -229,7 +229,7 @@ export class Blockchain { shouldPollUserAddress, ); this._contractWrappers.setProvider(provider, this.networkId); - this._blockchainWatcher.startEmittingNetworkConnectionAndUserBalanceState(); + await this._blockchainWatcher.startEmittingNetworkConnectionAndUserBalanceStateAsync(); this._dispatcher.updateProviderType(ProviderType.Ledger); } public async updateProviderToInjectedAsync(): Promise<void> { @@ -259,7 +259,7 @@ export class Blockchain { this._contractWrappers.setProvider(provider, this.networkId); await this.fetchTokenInformationAsync(); - this._blockchainWatcher.startEmittingNetworkConnectionAndUserBalanceState(); + await this._blockchainWatcher.startEmittingNetworkConnectionAndUserBalanceStateAsync(); this._dispatcher.updateProviderType(ProviderType.Injected); delete this._ledgerSubprovider; delete this._cachedProvider; @@ -625,6 +625,7 @@ export class Blockchain { ); const provider = this._contractWrappers.getProvider(); const web3Wrapper = new Web3Wrapper(provider); + web3Wrapper.abiDecoder.addABI(this._contractWrappers.exchange.abi); const receipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash); return receipt; } @@ -815,7 +816,7 @@ export class Blockchain { this._userAddressIfExists = userAddresses[0]; this._dispatcher.updateUserAddress(this._userAddressIfExists); await this.fetchTokenInformationAsync(); - this._blockchainWatcher.startEmittingNetworkConnectionAndUserBalanceState(); + await this._blockchainWatcher.startEmittingNetworkConnectionAndUserBalanceStateAsync(); await this._rehydrateStoreWithContractEventsAsync(); } private _updateProviderName(injectedWeb3: Web3): void { diff --git a/packages/website/ts/blockchain_watcher.ts b/packages/website/ts/blockchain_watcher.ts index 3890a9e57..c576db6ac 100644 --- a/packages/website/ts/blockchain_watcher.ts +++ b/packages/website/ts/blockchain_watcher.ts @@ -34,56 +34,15 @@ export class BlockchainWatcher { public updatePrevUserAddress(userAddress: string): void { this._prevUserAddressIfExists = userAddress; } - public startEmittingNetworkConnectionAndUserBalanceState(): void { + public async startEmittingNetworkConnectionAndUserBalanceStateAsync(): Promise<void> { if (!_.isUndefined(this._watchNetworkAndBalanceIntervalId)) { return; // we are already emitting the state } - - let prevNodeVersion: string; this._prevUserEtherBalanceInWei = undefined; this._dispatcher.updateNetworkId(this._prevNetworkId); + await this._updateNetworkAndBalanceAsync(); this._watchNetworkAndBalanceIntervalId = intervalUtils.setAsyncExcludingInterval( - async () => { - // Check for network state changes - let currentNetworkId; - try { - currentNetworkId = await this._web3Wrapper.getNetworkIdAsync(); - } catch (err) { - // Noop - } - if (currentNetworkId !== this._prevNetworkId) { - this._prevNetworkId = currentNetworkId; - this._dispatcher.updateNetworkId(currentNetworkId); - } - - // Check for node version changes - const currentNodeVersion = await this._web3Wrapper.getNodeVersionAsync(); - if (currentNodeVersion !== prevNodeVersion) { - prevNodeVersion = currentNodeVersion; - this._dispatcher.updateNodeVersion(currentNodeVersion); - } - - if (this._shouldPollUserAddress) { - const addresses = await this._web3Wrapper.getAvailableAddressesAsync(); - const userAddressIfExists = addresses[0]; - // Update makerAddress on network change - if (this._prevUserAddressIfExists !== userAddressIfExists) { - this._prevUserAddressIfExists = userAddressIfExists; - this._dispatcher.updateUserAddress(userAddressIfExists); - } - - // Check for user ether balance changes - if (!_.isUndefined(userAddressIfExists)) { - await this._updateUserWeiBalanceAsync(userAddressIfExists); - } - } else { - // This logic is primarily for the Ledger, since we don't regularly poll for the address - // we simply update the balance for the last fetched address. - if (!_.isUndefined(this._prevUserAddressIfExists)) { - await this._updateUserWeiBalanceAsync(this._prevUserAddressIfExists); - } - } - }, + this._updateNetworkAndBalanceAsync.bind(this), 5000, (err: Error) => { logUtils.log(`Watching network and balances failed: ${err.stack}`); @@ -91,6 +50,48 @@ export class BlockchainWatcher { }, ); } + private async _updateNetworkAndBalanceAsync(): Promise<void> { + // Check for network state changes + let prevNodeVersion: string; + let currentNetworkId; + try { + currentNetworkId = await this._web3Wrapper.getNetworkIdAsync(); + } catch (err) { + // Noop + } + if (currentNetworkId !== this._prevNetworkId) { + this._prevNetworkId = currentNetworkId; + this._dispatcher.updateNetworkId(currentNetworkId); + } + + // Check for node version changes + const currentNodeVersion = await this._web3Wrapper.getNodeVersionAsync(); + if (currentNodeVersion !== prevNodeVersion) { + prevNodeVersion = currentNodeVersion; + this._dispatcher.updateNodeVersion(currentNodeVersion); + } + + if (this._shouldPollUserAddress) { + const addresses = await this._web3Wrapper.getAvailableAddressesAsync(); + const userAddressIfExists = addresses[0]; + // Update makerAddress on network change + if (this._prevUserAddressIfExists !== userAddressIfExists) { + this._prevUserAddressIfExists = userAddressIfExists; + this._dispatcher.updateUserAddress(userAddressIfExists); + } + + // Check for user ether balance changes + if (!_.isUndefined(userAddressIfExists)) { + await this._updateUserWeiBalanceAsync(userAddressIfExists); + } + } else { + // This logic is primarily for the Ledger, since we don't regularly poll for the address + // we simply update the balance for the last fetched address. + if (!_.isUndefined(this._prevUserAddressIfExists)) { + await this._updateUserWeiBalanceAsync(this._prevUserAddressIfExists); + } + } + } private async _updateUserWeiBalanceAsync(userAddress: string): Promise<void> { const balanceInWei = await this._web3Wrapper.getBalanceInWeiAsync(userAddress); if (_.isUndefined(this._prevUserEtherBalanceInWei) || !balanceInWei.eq(this._prevUserEtherBalanceInWei)) { diff --git a/packages/website/ts/components/onboarding/add_eth_onboarding_step.tsx b/packages/website/ts/components/onboarding/add_eth_onboarding_step.tsx new file mode 100644 index 000000000..31ce99d31 --- /dev/null +++ b/packages/website/ts/components/onboarding/add_eth_onboarding_step.tsx @@ -0,0 +1,18 @@ +import * as React from 'react'; +import { Container } from 'ts/components/ui/container'; +import { Text } from 'ts/components/ui/text'; + +export interface AddEthOnboardingStepProps {} + +export const AddEthOnboardingStep: React.StatelessComponent<AddEthOnboardingStepProps> = () => ( + <div className="flex items-center flex-column"> + <Text> Before you begin you will need to send some ETH to your metamask wallet.</Text> + <Container marginTop="15px" marginBottom="15px"> + <img src="/images/ether_alt.svg" height="50px" width="50px" /> + </Container> + <Text> + Click on the <img src="/images/metamask_icon.png" height="20px" width="20px" /> metamask extension in your + browser and click either <b>BUY</b> or <b>DEPOSIT</b>. + </Text> + </div> +); diff --git a/packages/website/ts/components/onboarding/congrats_onboarding_step.tsx b/packages/website/ts/components/onboarding/congrats_onboarding_step.tsx new file mode 100644 index 000000000..3a8db8c36 --- /dev/null +++ b/packages/website/ts/components/onboarding/congrats_onboarding_step.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; +import { Container } from 'ts/components/ui/container'; +import { Text } from 'ts/components/ui/text'; + +export interface CongratsOnboardingStepProps {} + +export const CongratsOnboardingStep: React.StatelessComponent<CongratsOnboardingStepProps> = () => ( + <div className="flex items-center flex-column"> + <Text>Your wallet is now set up for trading. Use it on any relayer in the 0x ecosystem.</Text> + <Container marginTop="25px" marginBottom="15px" className="flex justify-center"> + <img src="/images/zrx_ecosystem.svg" height="150px" /> + </Container> + <Text>No need to log in. Each relayer automatically detects and connects to your metamask wallet.</Text> + </div> +); diff --git a/packages/website/ts/components/onboarding/install_wallet_onboarding_step.tsx b/packages/website/ts/components/onboarding/install_wallet_onboarding_step.tsx new file mode 100644 index 000000000..a54496186 --- /dev/null +++ b/packages/website/ts/components/onboarding/install_wallet_onboarding_step.tsx @@ -0,0 +1,18 @@ +import { colors } from '@0xproject/react-shared'; +import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; +import * as React from 'react'; +import { Container } from 'ts/components/ui/container'; +import { Text } from 'ts/components/ui/text'; + +export interface InstallWalletOnboardingStepProps {} + +export const InstallWalletOnboardingStep: React.StatelessComponent<InstallWalletOnboardingStepProps> = () => ( + <div className="flex items-center flex-column"> + <Container marginTop="15px" marginBottom="15px"> + <ActionAccountBalanceWallet style={{ width: '30px', height: '30px' }} color={colors.orange} /> + </Container> + <Text> + Before you begin, you need to connect to a wallet. This will be used across all 0x relayers and dApps. + </Text> + </div> +); diff --git a/packages/website/ts/components/onboarding/intro_onboarding_step.tsx b/packages/website/ts/components/onboarding/intro_onboarding_step.tsx new file mode 100644 index 000000000..548839218 --- /dev/null +++ b/packages/website/ts/components/onboarding/intro_onboarding_step.tsx @@ -0,0 +1,23 @@ +import * as React from 'react'; +import { Container } from 'ts/components/ui/container'; +import { Text } from 'ts/components/ui/text'; + +export interface IntroOnboardingStepProps {} + +export const IntroOnboardingStep: React.StatelessComponent<IntroOnboardingStepProps> = () => ( + <div className="flex items-center flex-column"> + <Text> + In order to start trading on any 0x relayer in the 0x ecosystem, you need to complete two simple steps. + </Text> + <Container width="100%" marginTop="25px" marginBottom="15px" className="flex justify-around"> + <div className="flex flex-column items-center"> + <img src="/images/eth_token.svg" height="50px" width="50x" /> + <Text> Wrap ETH </Text> + </div> + <div className="flex flex-column items-center"> + <img src="/images/fake_toggle.svg" height="50px" width="50px" /> + <Text> Unlock tokens </Text> + </div> + </Container> + </div> +); diff --git a/packages/website/ts/components/onboarding/onboarding_flow.tsx b/packages/website/ts/components/onboarding/onboarding_flow.tsx index 9879cd387..34aeace82 100644 --- a/packages/website/ts/components/onboarding/onboarding_flow.tsx +++ b/packages/website/ts/components/onboarding/onboarding_flow.tsx @@ -10,9 +10,10 @@ export interface Step { title?: string; content: React.ReactNode; placement?: Placement; - hideBackButton?: boolean; - hideNextButton?: boolean; + shouldHideBackButton?: boolean; + shouldHideNextButton?: boolean; continueButtonDisplay?: ContinueButtonDisplay; + continueButtonText?: string; } export interface OnboardingFlowProps { @@ -54,17 +55,18 @@ export class OnboardingFlow extends React.Component<OnboardingFlowProps> { const step = steps[stepIndex]; const isLastStep = steps.length - 1 === stepIndex; return ( - <Container marginLeft="15px"> + <Container marginLeft="30px"> <OnboardingTooltip title={step.title} content={step.content} isLastStep={isLastStep} - hideBackButton={step.hideBackButton} - hideNextButton={step.hideNextButton} + shouldHideBackButton={step.shouldHideBackButton} + shouldHideNextButton={step.shouldHideNextButton} onClose={this.props.onClose} onClickNext={this._goToNextStep.bind(this)} onClickBack={this._goToPrevStep.bind(this)} continueButtonDisplay={step.continueButtonDisplay} + continueButtonText={step.continueButtonText} /> </Container> ); diff --git a/packages/website/ts/components/onboarding/onboarding_tooltip.tsx b/packages/website/ts/components/onboarding/onboarding_tooltip.tsx index 155c70c5f..45851b4de 100644 --- a/packages/website/ts/components/onboarding/onboarding_tooltip.tsx +++ b/packages/website/ts/components/onboarding/onboarding_tooltip.tsx @@ -1,7 +1,12 @@ +import { colors } from '@0xproject/react-shared'; import * as React from 'react'; +import { Button } from 'ts/components/ui/button'; import { Container } from 'ts/components/ui/container'; +import { IconButton } from 'ts/components/ui/icon_button'; import { Island } from 'ts/components/ui/island'; +import { Pointer, PointerDirection } from 'ts/components/ui/pointer'; +import { Text, Title } from 'ts/components/ui/text'; export type ContinueButtonDisplay = 'enabled' | 'disabled'; @@ -13,43 +18,73 @@ export interface OnboardingTooltipProps { onClickNext: () => void; onClickBack: () => void; continueButtonDisplay?: ContinueButtonDisplay; - hideBackButton?: boolean; - hideNextButton?: boolean; + shouldHideBackButton?: boolean; + shouldHideNextButton?: boolean; + pointerDirection?: PointerDirection; + continueButtonText?: string; + className?: string; } -// TODO: Make this more general button. -export interface ContinueButtonProps { - display: ContinueButtonDisplay; - children?: string; - onClick: () => void; -} +export const OnboardingTooltip: React.StatelessComponent<OnboardingTooltipProps> = ({ + title, + content, + continueButtonDisplay, + continueButtonText, + onClickNext, + onClickBack, + onClose, + shouldHideBackButton, + shouldHideNextButton, + pointerDirection, + className, +}) => ( + <Pointer className={className} direction={pointerDirection}> + <Island> + <Container paddingRight="30px" paddingLeft="30px" maxWidth={350} paddingTop="15px" paddingBottom="15px"> + <div className="flex flex-column"> + <div className="flex justify-between"> + <Title>{title}</Title> + <Container position="relative" bottom="20px" left="15px"> + <IconButton color={colors.grey} iconName="zmdi-close" onClick={onClose}> + Close + </IconButton> + </Container> + </div> + <Container marginBottom="15px"> + <Text>{content}</Text> + </Container> + {continueButtonDisplay && ( + <Button + isDisabled={continueButtonDisplay === 'disabled'} + onClick={onClickNext} + fontColor={colors.white} + fontSize="15px" + backgroundColor={colors.mediumBlue} + > + {continueButtonText} + </Button> + )} + <Container className="flex justify-between" marginTop="15px"> + {!shouldHideBackButton && ( + <Text fontColor={colors.grey} onClick={onClickBack}> + Back + </Text> + )} + {!shouldHideNextButton && ( + <Text fontColor={colors.grey} onClick={onClickNext}> + Skip + </Text> + )} + </Container> + </div> + </Container> + </Island> + </Pointer> +); -export const ContinueButton: React.StatelessComponent<ContinueButtonProps> = (props: ContinueButtonProps) => { - const isDisabled = props.display === 'disabled'; - return ( - <button disabled={isDisabled} onClick={isDisabled ? undefined : props.onClick}> - {props.children} - </button> - ); +OnboardingTooltip.defaultProps = { + pointerDirection: 'left', + continueButtonText: 'Continue', }; -export const OnboardingTooltip: React.StatelessComponent<OnboardingTooltipProps> = (props: OnboardingTooltipProps) => ( - <Island> - <Container paddingRight="30px" paddingLeft="30px" maxWidth={350} paddingTop="15px" paddingBottom="15px"> - <div className="flex flex-column"> - {props.title} - {props.content} - {props.continueButtonDisplay && ( - <ContinueButton onClick={props.onClickNext} display={props.continueButtonDisplay}> - Continue - </ContinueButton> - )} - {!props.hideBackButton && <button onClick={props.onClickBack}>Back</button>} - {!props.hideNextButton && <button onClick={props.onClickNext}>Skip</button>} - <button onClick={props.onClose}>Close</button> - </div> - </Container> - </Island> -); - OnboardingTooltip.displayName = 'OnboardingTooltip'; diff --git a/packages/website/ts/components/onboarding/portal_onboarding_flow.tsx b/packages/website/ts/components/onboarding/portal_onboarding_flow.tsx index ec2365c11..3880e018a 100644 --- a/packages/website/ts/components/onboarding/portal_onboarding_flow.tsx +++ b/packages/website/ts/components/onboarding/portal_onboarding_flow.tsx @@ -4,7 +4,14 @@ import * as React from 'react'; import { BigNumber } from '@0xproject/utils'; import { Blockchain } from 'ts/blockchain'; +import { AddEthOnboardingStep } from 'ts/components/onboarding/add_eth_onboarding_step'; +import { CongratsOnboardingStep } from 'ts/components/onboarding/congrats_onboarding_step'; +import { InstallWalletOnboardingStep } from 'ts/components/onboarding/install_wallet_onboarding_step'; +import { IntroOnboardingStep } from 'ts/components/onboarding/intro_onboarding_step'; import { OnboardingFlow, Step } from 'ts/components/onboarding/onboarding_flow'; +import { SetAllowancesOnboardingStep } from 'ts/components/onboarding/set_allowances_onboarding_step'; +import { UnlockWalletOnboardingStep } from 'ts/components/onboarding/unlock_wallet_onboarding_step'; +import { WrapEthOnboardingStep } from 'ts/components/onboarding/wrap_eth_onboarding_step'; import { AllowanceToggle } from 'ts/containers/inputs/allowance_toggle'; import { ProviderType, Token, TokenByAddress, TokenStateByAddress } from 'ts/types'; import { analytics } from 'ts/utils/analytics'; @@ -50,56 +57,68 @@ export class PortalOnboardingFlow extends React.Component<PortalOnboardingFlowPr const steps: Step[] = [ { target: '.wallet', - content: - 'Before you begin, you need to connect to a wallet. This will be used across all 0x relayers and dApps', + title: '0x Ecosystem Setup', + content: <InstallWalletOnboardingStep />, placement: 'right', - hideBackButton: true, - hideNextButton: true, + shouldHideBackButton: true, + shouldHideNextButton: true, }, { target: '.wallet', - content: 'Unlock your metamask extension to begin', + title: '0x Ecosystem Setup', + content: <UnlockWalletOnboardingStep />, placement: 'right', - hideBackButton: true, - hideNextButton: true, + shouldHideBackButton: true, + shouldHideNextButton: true, }, { target: '.wallet', - content: - 'In order to start trading on any 0x relayer in the 0x ecosystem, you need to complete two simple steps', + title: '0x Ecosystem Account Setup', + content: <IntroOnboardingStep />, placement: 'right', - hideBackButton: true, + shouldHideBackButton: true, continueButtonDisplay: 'enabled', }, { target: '.eth-row', - content: 'Before you begin you will need to send some ETH to your metamask wallet', + title: 'Add ETH', + content: <AddEthOnboardingStep />, placement: 'right', continueButtonDisplay: this._userHasVisibleEth() ? 'enabled' : 'disabled', }, { target: '.weth-row', - content: 'You need to convert some of your ETH into tradeable Wrapped ETH (WETH)', + title: 'Step 1/2', + content: ( + <WrapEthOnboardingStep + formattedEthBalanceIfExists={ + this._userHasVisibleWeth() ? this._getFormattedWethBalance() : undefined + } + /> + ), placement: 'right', - continueButtonDisplay: this._userHasVisibleWeth() ? 'enabled' : 'disabled', + continueButtonDisplay: this._userHasVisibleWeth() ? 'enabled' : undefined, }, { target: '.weth-row', + title: 'Step 2/2', content: ( - <div> - Unlock your tokens for trading. You only need to do this once for each token. - <div> ETH: {this._renderEthAllowanceToggle()}</div> - <div> ZRX: {this._renderZrxAllowanceToggle()}</div> - </div> + <SetAllowancesOnboardingStep + zrxAllowanceToggle={this._renderZrxAllowanceToggle()} + ethAllowanceToggle={this._renderEthAllowanceToggle()} + /> ), placement: 'right', continueButtonDisplay: this._userHasAllowancesForWethAndZrx() ? 'enabled' : 'disabled', }, { target: '.wallet', - content: 'Congrats! Your wallet is now set up for trading. Use it on any relayer in the 0x ecosystem.', + title: '🎉 Congrats! The ecosystem awaits.', + content: <CongratsOnboardingStep />, placement: 'right', continueButtonDisplay: 'enabled', + shouldHideNextButton: true, + continueButtonText: 'Enter the 0x Ecosystem', }, ]; return steps; @@ -110,13 +129,21 @@ export class PortalOnboardingFlow extends React.Component<PortalOnboardingFlowPr private _userHasVisibleEth(): boolean { return this.props.userEtherBalanceInWei > new BigNumber(0); } - private _userHasVisibleWeth(): boolean { + private _getWethBalance(): BigNumber { const ethToken = utils.getEthToken(this.props.tokenByAddress); if (!ethToken) { - return false; + return new BigNumber(0); } - const wethTokenState = this.props.trackedTokenStateByAddress[ethToken.address]; - return wethTokenState.balance > new BigNumber(0); + const ethTokenState = this.props.trackedTokenStateByAddress[ethToken.address]; + return ethTokenState.balance; + } + private _getFormattedWethBalance(): string { + const ethToken = utils.getEthToken(this.props.tokenByAddress); + const ethTokenState = this.props.trackedTokenStateByAddress[ethToken.address]; + return utils.getFormattedAmountFromToken(ethToken, ethTokenState); + } + private _userHasVisibleWeth(): boolean { + return this._getWethBalance() > new BigNumber(0); } private _userHasAllowancesForWethAndZrx(): boolean { const ethToken = utils.getEthToken(this.props.tokenByAddress); diff --git a/packages/website/ts/components/onboarding/set_allowances_onboarding_step.tsx b/packages/website/ts/components/onboarding/set_allowances_onboarding_step.tsx new file mode 100644 index 000000000..1ff248c40 --- /dev/null +++ b/packages/website/ts/components/onboarding/set_allowances_onboarding_step.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import { Container } from 'ts/components/ui/container'; +import { Text } from 'ts/components/ui/text'; + +export interface SetAllowancesOnboardingStepProps { + zrxAllowanceToggle: React.ReactNode; + ethAllowanceToggle: React.ReactNode; +} + +export const SetAllowancesOnboardingStep: React.StatelessComponent<SetAllowancesOnboardingStepProps> = ({ + ethAllowanceToggle, + zrxAllowanceToggle, +}) => ( + <div className="flex items-center flex-column"> + <Text>Unlock your tokens for trading. You only need to do this once for each token.</Text> + <Container width="100%" marginTop="25px" marginBottom="15px" className="flex justify-around"> + <div className="flex flex-column items-center"> + <Text fontWeight={700}> Enable WETH </Text> + <Container marginTop="10px">{ethAllowanceToggle}</Container> + </div> + <div className="flex flex-column items-center"> + <Text fontWeight={700}> Enable ZRX </Text> + <Container marginTop="10px">{zrxAllowanceToggle}</Container> + </div> + </Container> + </div> +); diff --git a/packages/website/ts/components/onboarding/unlock_wallet_onboarding_step.tsx b/packages/website/ts/components/onboarding/unlock_wallet_onboarding_step.tsx new file mode 100644 index 000000000..6e6a74a06 --- /dev/null +++ b/packages/website/ts/components/onboarding/unlock_wallet_onboarding_step.tsx @@ -0,0 +1,16 @@ +import * as React from 'react'; +import { Container } from 'ts/components/ui/container'; +import { Text } from 'ts/components/ui/text'; + +export interface UnlockWalletOnboardingStepProps {} + +export const UnlockWalletOnboardingStep: React.StatelessComponent<UnlockWalletOnboardingStepProps> = () => ( + <div className="flex items-center flex-column"> + <div className="flex items-center flex-column"> + <Container marginTop="15px" marginBottom="15px"> + <img src="/images/metamask_icon.png" height="50px" width="50px" /> + </Container> + <Text>Unlock your metamask extension to begin.</Text> + </div> + </div> +); diff --git a/packages/website/ts/components/onboarding/wrap_eth_onboarding_step.tsx b/packages/website/ts/components/onboarding/wrap_eth_onboarding_step.tsx new file mode 100644 index 000000000..b21b39341 --- /dev/null +++ b/packages/website/ts/components/onboarding/wrap_eth_onboarding_step.tsx @@ -0,0 +1,73 @@ +import { colors } from '@0xproject/react-shared'; +import * as React from 'react'; +import { Container } from 'ts/components/ui/container'; +import { IconButton } from 'ts/components/ui/icon_button'; +import { Text } from 'ts/components/ui/text'; + +export interface WrapEthOnboardingStepProps { + formattedEthBalanceIfExists?: string; +} + +export const WrapEthOnboardingStep: React.StatelessComponent<WrapEthOnboardingStepProps> = ({ + formattedEthBalanceIfExists, +}) => { + if (formattedEthBalanceIfExists) { + return ( + <div className="flex items-center flex-column"> + <Text>Congrats you now have {formattedEthBalanceIfExists} in your wallet.</Text> + <Container width="100%" marginTop="25px" marginBottom="15px" className="flex justify-center"> + <div className="flex flex-column items-center"> + <Text fontWeight={700}> 1 ETH </Text> + <img src="/images/eth_dollar.svg" height="75px" width="75x" /> + </div> + <Container marginRight="25px" marginLeft="25px" position="relative" top="20px"> + <Text fontSize="25px"> + <i className="zmdi zmdi-long-arrow-right" /> + </Text> + </Container> + <div className="flex flex-column items-center"> + <Text fontWeight={700}> 1 WETH </Text> + <img src="/images/eth_token_erc20.svg" height="75px" width="75px" /> + </div> + </Container> + </div> + ); + } else { + return ( + <div className="flex items-center flex-column"> + <Text> + You need to convert some of your ETH into tradeable <b>Wrapped ETH (WETH)</b>. + </Text> + <Container width="100%" marginTop="25px" marginBottom="15px" className="flex justify-center"> + <div className="flex flex-column items-center"> + <Text fontWeight={700}> 1 ETH </Text> + <img src="/images/eth_dollar.svg" height="75px" width="75x" /> + </div> + <Container marginRight="25px" marginLeft="25px" position="relative" top="20px"> + <Text fontSize="36px">=</Text> + </Container> + <div className="flex flex-column items-center"> + <Text fontWeight={700}> 1 WETH </Text> + <img src="/images/eth_token_erc20.svg" height="75px" width="75px" /> + </div> + </Container> + <Text> + Think of it like the coin version of a paper note. It has the same value, but some machines only + take coins. + </Text> + <Text> + Click + <Container display="inline-block" marginLeft="10px" marginRight="10px"> + <IconButton + iconName="zmdi-long-arrow-down" + color={colors.mediumBlue} + labelText="wrap" + display="inline-flex" + /> + </Container> + to wrap your ETH. + </Text> + </div> + ); + } +}; diff --git a/packages/website/ts/components/portal/portal.tsx b/packages/website/ts/components/portal/portal.tsx index 5170bf1e1..debebb47c 100644 --- a/packages/website/ts/components/portal/portal.tsx +++ b/packages/website/ts/components/portal/portal.tsx @@ -1,6 +1,7 @@ import { colors, constants as sharedConstants, Styles } from '@0xproject/react-shared'; import { BigNumber } from '@0xproject/utils'; import * as _ from 'lodash'; +import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet'; import * as React from 'react'; import * as DocumentTitle from 'react-document-title'; import { Route, RouteComponentProps, Switch } from 'react-router-dom'; @@ -24,6 +25,7 @@ import { TradeHistory } from 'ts/components/trade_history/trade_history'; import { Container } from 'ts/components/ui/container'; import { FlashMessage } from 'ts/components/ui/flash_message'; import { Island } from 'ts/components/ui/island'; +import { Text } from 'ts/components/ui/text'; import { Wallet } from 'ts/components/wallet/wallet'; import { GenerateOrderForm } from 'ts/containers/generate_order_form'; import { PortalOnboardingFlow } from 'ts/containers/portal_onboarding_flow'; @@ -102,6 +104,7 @@ const THROTTLE_TIMEOUT = 100; const TOP_BAR_HEIGHT = TopBar.heightForDisplayType(TopBarDisplayType.Expanded); const LEFT_COLUMN_WIDTH = 346; const MENU_PADDING_LEFT = 185; +const LARGE_LAYOUT_MAX_WIDTH = 1200; const styles: Styles = { root: { @@ -256,6 +259,7 @@ export class Portal extends React.Component<PortalProps, PortalState> { translate={this.props.translate} displayType={TopBarDisplayType.Expanded} style={{ backgroundColor: colors.lightestGrey }} + maxWidth={LARGE_LAYOUT_MAX_WIDTH} /> <div id="portal" style={styles.body}> <Switch> @@ -355,8 +359,26 @@ export class Portal extends React.Component<PortalProps, PortalState> { /> <Container marginTop="15px"> <Island> - {/** TODO: Implement real styles. */} - <p onClick={this._startOnboarding.bind(this)}>Start onboarding flow.</p> + <Container + marginTop="30px" + marginBottom="30px" + marginLeft="30px" + marginRight="30px" + className="flex justify-around items-center" + > + <ActionAccountBalanceWallet + style={{ width: '30px', height: '30px' }} + color={colors.orange} + /> + <Text + fontColor={colors.grey} + fontSize="16px" + center={true} + onClick={this._startOnboarding.bind(this)} + > + Learn how to set up your account + </Text> + </Container> </Island> </Container> </div> @@ -664,11 +686,11 @@ interface LargeLayoutProps { } const LargeLayout = (props: LargeLayoutProps) => { return ( - <div className="sm-flex flex-center"> - <div className="flex-last px3"> + <div className="mx-auto flex flex-center" style={{ maxWidth: LARGE_LAYOUT_MAX_WIDTH }}> + <div className="flex-last px2"> <div style={styles.leftColumn}>{props.left}</div> </div> - <div className="flex-auto px3" style={styles.scrollContainer}> + <div className="flex-auto px2" style={styles.scrollContainer}> {props.right} </div> </div> @@ -680,7 +702,7 @@ interface SmallLayoutProps { } const SmallLayout = (props: SmallLayoutProps) => { return ( - <div className="sm-flex flex-center"> + <div className="flex flex-center"> <div className="flex-auto px3" style={styles.scrollContainer}> {props.content} </div> diff --git a/packages/website/ts/components/relayer_index/relayer_grid_tile.tsx b/packages/website/ts/components/relayer_index/relayer_grid_tile.tsx index 7ff8208b0..23860856b 100644 --- a/packages/website/ts/components/relayer_index/relayer_grid_tile.tsx +++ b/packages/website/ts/components/relayer_index/relayer_grid_tile.tsx @@ -6,6 +6,7 @@ import { analytics } from 'ts/utils/analytics'; import { TopTokens } from 'ts/components/relayer_index/relayer_top_tokens'; import { Container } from 'ts/components/ui/container'; +import { Image } from 'ts/components/ui/image'; import { Island } from 'ts/components/ui/island'; import { colors } from 'ts/style/colors'; import { WebsiteBackendRelayerInfo } from 'ts/types'; @@ -27,7 +28,6 @@ const styles: Styles = { header: { height: '50%', width: '100%', - objectFit: 'cover', borderBottomRightRadius: 4, borderBottomLeftRadius: 4, borderTopRightRadius: 4, @@ -59,25 +59,37 @@ const styles: Styles = { }; const FALLBACK_IMG_SRC = '/images/landing/hero_chip_image.png'; +const FALLBACK_PRIMARY_COLOR = colors.grey200; const NO_CONTENT_MESSAGE = '--'; +const RELAYER_ICON_HEIGHT = '110px'; export const RelayerGridTile: React.StatelessComponent<RelayerGridTileProps> = (props: RelayerGridTileProps) => { const link = props.relayerInfo.appUrl || props.relayerInfo.url; const topTokens = props.relayerInfo.topTokens; const weeklyTxnVolume = props.relayerInfo.weeklyTxnVolume; - let trackRelayerClick = (): void => undefined; const networkName = sharedConstants.NETWORK_NAME_BY_ID[props.networkId]; const eventLabel = `${props.relayerInfo.name}-${networkName}`; - trackRelayerClick = () => analytics.logEvent('Portal', 'Relayer Click', eventLabel); + const trackRelayerClick = () => analytics.logEvent('Portal', 'Relayer Click', eventLabel); + const headerImageUrl = props.relayerInfo.logoImgUrl; + const headerBackgroundColor = + !_.isUndefined(headerImageUrl) && !_.isUndefined(props.relayerInfo.primaryColor) + ? props.relayerInfo.primaryColor + : FALLBACK_PRIMARY_COLOR; return ( <Island style={styles.root} Component={GridTile}> <div style={styles.innerDiv}> <a href={link} target="_blank" style={{ textDecoration: 'none' }} onClick={trackRelayerClick}> - <ImgWithFallback - src={props.relayerInfo.headerImgUrl} - fallbackSrc={FALLBACK_IMG_SRC} - style={styles.header} - /> + <div + className="flex items-center" + style={{ ...styles.header, backgroundColor: headerBackgroundColor }} + > + <Image + className="mx-auto" + src={props.relayerInfo.logoImgUrl} + fallbackSrc={FALLBACK_IMG_SRC} + height={RELAYER_ICON_HEIGHT} + /> + </div> </a> <div style={styles.body}> <div className="py1" style={styles.relayerNameLabel}> @@ -113,32 +125,3 @@ const Section = (props: SectionProps) => { }; const NoContent = () => <div style={styles.subLabel}>{NO_CONTENT_MESSAGE}</div>; - -interface ImgWithFallbackProps { - src?: string; - fallbackSrc: string; - style: React.CSSProperties; -} -interface ImgWithFallbackState { - imageLoadFailed: boolean; -} -class ImgWithFallback extends React.Component<ImgWithFallbackProps, ImgWithFallbackState> { - constructor(props: ImgWithFallbackProps) { - super(props); - this.state = { - imageLoadFailed: false, - }; - } - public render(): React.ReactNode { - if (this.state.imageLoadFailed || _.isUndefined(this.props.src)) { - return <img src={this.props.fallbackSrc} style={this.props.style} />; - } else { - return <img src={this.props.src} onError={this._onError.bind(this)} style={this.props.style} />; - } - } - private _onError(): void { - this.setState({ - imageLoadFailed: true, - }); - } -} diff --git a/packages/website/ts/components/relayer_index/relayer_index.tsx b/packages/website/ts/components/relayer_index/relayer_index.tsx index 3c5761bcd..d565eb608 100644 --- a/packages/website/ts/components/relayer_index/relayer_index.tsx +++ b/packages/website/ts/components/relayer_index/relayer_index.tsx @@ -37,9 +37,9 @@ const styles: Styles = { }; const CELL_HEIGHT = 290; -const NUMBER_OF_COLUMNS_LARGE = 4; -const NUMBER_OF_COLUMNS_MEDIUM = 3; -const NUMBER_OF_COLUMNS_SMALL = 1; +const NUMBER_OF_COLUMNS_LARGE = 3; +const NUMBER_OF_COLUMNS_MEDIUM = 2; +const NUMBER_OF_COLUMNS_SMALL = 2; const GRID_PADDING = 20; export class RelayerIndex extends React.Component<RelayerIndexProps, RelayerIndexState> { diff --git a/packages/website/ts/components/top_bar/top_bar.tsx b/packages/website/ts/components/top_bar/top_bar.tsx index 05cc6e3ad..1a69827a4 100644 --- a/packages/website/ts/components/top_bar/top_bar.tsx +++ b/packages/website/ts/components/top_bar/top_bar.tsx @@ -45,6 +45,7 @@ export interface TopBarProps { isNightVersion?: boolean; onVersionSelected?: (semver: string) => void; sidebarHeader?: React.ReactNode; + maxWidth?: number; } interface TopBarState { @@ -213,7 +214,7 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> { const shouldShowPortalV2Drawer = this._isViewingPortal() && utils.shouldShowPortalV2(); return ( <div style={{ ...styles.topBar, ...bottomBorderStyle, ...this.props.style, ...{ height } }} className="pb1"> - <div className={parentClassNames}> + <div className={parentClassNames} style={{ maxWidth: this.props.maxWidth }}> <div className="col col-2 sm-pl1 md-pl2 lg-pl0" style={{ paddingTop: 15 }}> <Link to={`${WebsitePaths.Home}`} className="text-decoration-none"> <img src={logoUrl} height="30" /> diff --git a/packages/website/ts/components/ui/button.tsx b/packages/website/ts/components/ui/button.tsx index 1f88297de..cb542a386 100644 --- a/packages/website/ts/components/ui/button.tsx +++ b/packages/website/ts/components/ui/button.tsx @@ -1,5 +1,5 @@ import { colors } from '@0xproject/react-shared'; -import { darken } from 'polished'; +import { darken, grayscale } from 'polished'; import * as React from 'react'; import { styled } from 'ts/style/theme'; @@ -12,32 +12,34 @@ export interface ButtonProps { borderColor?: string; width?: string; type?: string; + isDisabled?: boolean; onClick?: (event: React.MouseEvent<HTMLElement>) => void; } -const PlainButton: React.StatelessComponent<ButtonProps> = ({ children, onClick, type, className }) => ( - <button type={type} className={className} onClick={onClick}> +const PlainButton: React.StatelessComponent<ButtonProps> = ({ children, isDisabled, onClick, type, className }) => ( + <button type={type} className={className} onClick={isDisabled ? undefined : onClick}> {children} </button> ); export const Button = styled(PlainButton)` - cursor: pointer; + cursor: ${props => (props.isDisabled ? 'default' : 'pointer')}; font-size: ${props => props.fontSize}; color: ${props => props.fontColor}; + transition: background-color 0.5s ease; padding: 0.8em 2.2em; border-radius: 6px; box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.25); font-weight: 500; font-family: ${props => props.fontFamily}; width: ${props => props.width}; - background-color: ${props => props.backgroundColor}; + background-color: ${props => (props.isDisabled ? grayscale(props.backgroundColor) : props.backgroundColor)}; border: ${props => (props.borderColor ? `1px solid ${props.borderColor}` : 'none')}; &:hover { - background-color: ${props => darken(0.1, props.backgroundColor)}; + background-color: ${props => (!props.isDisabled ? darken(0.1, props.backgroundColor) : '')}; } &:active { - background-color: ${props => darken(0.2, props.backgroundColor)}; + background-color: ${props => (!props.isDisabled ? darken(0.2, props.backgroundColor) : '')}; } `; @@ -46,6 +48,7 @@ Button.defaultProps = { backgroundColor: colors.white, width: 'auto', fontFamily: 'Roboto', + isDisabled: false, }; Button.displayName = 'Button'; diff --git a/packages/website/ts/components/ui/container.tsx b/packages/website/ts/components/ui/container.tsx index c6a78e181..1776345da 100644 --- a/packages/website/ts/components/ui/container.tsx +++ b/packages/website/ts/components/ui/container.tsx @@ -14,8 +14,15 @@ export interface ContainerProps { backgroundColor?: string; borderRadius?: StringOrNum; maxWidth?: StringOrNum; + width?: StringOrNum; isHidden?: boolean; className?: string; + position?: 'absolute' | 'fixed' | 'relative' | 'unset'; + display?: 'inline-block' | 'block' | 'inline-flex' | 'inline'; + top?: string; + left?: string; + right?: string; + bottom?: string; } export const Container: React.StatelessComponent<ContainerProps> = ({ children, className, isHidden, ...style }) => { diff --git a/packages/website/ts/components/ui/icon_button.tsx b/packages/website/ts/components/ui/icon_button.tsx index 2f5172f05..13cd239da 100644 --- a/packages/website/ts/components/ui/icon_button.tsx +++ b/packages/website/ts/components/ui/icon_button.tsx @@ -5,15 +5,15 @@ import * as React from 'react'; export interface IconButtonProps { iconName: string; labelText?: string; - onClick: () => void; + onClick?: () => void; color?: string; + display?: string; } interface IconButtonState { isHovering: boolean; } export class IconButton extends React.Component<IconButtonProps, IconButtonState> { public static defaultProps: Partial<IconButtonProps> = { - onClick: _.noop, labelText: '', color: colors.mediumBlue, }; @@ -26,8 +26,9 @@ export class IconButton extends React.Component<IconButtonProps, IconButtonState public render(): React.ReactNode { const styles: Styles = { root: { - cursor: 'pointer', - opacity: this.state.isHovering ? 0.5 : 1, + cursor: this.props.onClick ? 'pointer' : 'undefined', + opacity: this.state.isHovering && this.props.onClick ? 0.5 : 1, + display: this.props.display, }, icon: { color: this.props.color, diff --git a/packages/website/ts/components/ui/image.tsx b/packages/website/ts/components/ui/image.tsx new file mode 100644 index 000000000..0958d2e5e --- /dev/null +++ b/packages/website/ts/components/ui/image.tsx @@ -0,0 +1,37 @@ +import * as _ from 'lodash'; +import * as React from 'react'; + +export interface ImageProps { + className?: string; + src?: string; + fallbackSrc?: string; + height?: string; +} +interface ImageState { + imageLoadFailed: boolean; +} +export class Image extends React.Component<ImageProps, ImageState> { + constructor(props: ImageProps) { + super(props); + this.state = { + imageLoadFailed: false, + }; + } + public render(): React.ReactNode { + const src = + this.state.imageLoadFailed || _.isUndefined(this.props.src) ? this.props.fallbackSrc : this.props.src; + return ( + <img + className={this.props.className} + onError={this._onError.bind(this)} + src={src} + height={this.props.height} + /> + ); + } + private _onError(): void { + this.setState({ + imageLoadFailed: true, + }); + } +} diff --git a/packages/website/ts/components/ui/pointer.tsx b/packages/website/ts/components/ui/pointer.tsx new file mode 100644 index 000000000..448786bb4 --- /dev/null +++ b/packages/website/ts/components/ui/pointer.tsx @@ -0,0 +1,67 @@ +import { colors } from '@0xproject/react-shared'; +import * as React from 'react'; +import { styled } from 'ts/style/theme'; + +export type PointerDirection = 'top' | 'right' | 'bottom' | 'left'; + +export interface PointerProps { + className?: string; + color?: string; + size?: number; + direction: PointerDirection; +} + +const PlainPointer: React.StatelessComponent<PointerProps> = props => <div {...props} />; + +const positionToCss = (props: PointerProps) => { + const position = { + top: `bottom: 100%; left: 50%;`, + right: `left: 100%; top: 50%;`, + bottom: `top: 100%; left: 50%;`, + left: `right: 100%; top: 50%;`, + }[props.direction]; + + const borderColorSide = { + top: 'border-bottom-color', + right: 'border-left-color', + bottom: 'border-top-color', + left: 'border-right-color', + }[props.direction]; + const border = `${borderColorSide}: ${props.color};`; + const marginSide = { + top: 'margin-left', + right: 'margin-top', + bottom: 'margin-left', + left: 'margin-top', + }[props.direction]; + const margin = `${marginSide}: -${props.size}px`; + return { + position, + border, + margin, + }; +}; + +export const Pointer = styled(PlainPointer)` + position: relative; + &:after { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-color: rgba(136, 183, 213, 0); + border-width: ${props => `${props.size}px`}; + ${props => positionToCss(props).position} + ${props => positionToCss(props).border} + ${props => positionToCss(props).margin} + } +`; + +Pointer.defaultProps = { + color: colors.white, + size: 16, +}; + +Pointer.displayName = 'Pointer'; diff --git a/packages/website/ts/components/ui/text.tsx b/packages/website/ts/components/ui/text.tsx index 7e47f1d09..1e2a123b7 100644 --- a/packages/website/ts/components/ui/text.tsx +++ b/packages/website/ts/components/ui/text.tsx @@ -1,8 +1,9 @@ import { colors } from '@0xproject/react-shared'; +import { darken } from 'polished'; import * as React from 'react'; import { styled } from 'ts/style/theme'; -export type TextTag = 'p' | 'div' | 'span' | 'label'; +export type TextTag = 'p' | 'div' | 'span' | 'label' | 'h1' | 'h2' | 'h3' | 'h4'; export interface TextProps { className?: string; @@ -14,10 +15,13 @@ export interface TextProps { minHeight?: string; center?: boolean; fontWeight?: number | string; + onClick?: () => void; } -const PlainText: React.StatelessComponent<TextProps> = ({ children, className, Tag }) => ( - <Tag className={className}>{children}</Tag> +const PlainText: React.StatelessComponent<TextProps> = ({ children, className, onClick, Tag }) => ( + <Tag className={className} onClick={onClick}> + {children} + </Tag> ); export const Text = styled(PlainText)` @@ -28,14 +32,31 @@ export const Text = styled(PlainText)` ${props => (props.center ? 'text-align: center' : '')}; color: ${props => props.fontColor}; ${props => (props.minHeight ? `min-height: ${props.minHeight}` : '')}; + ${props => (props.onClick ? 'cursor: pointer' : '')}; + transition: color 0.5s ease; + &:hover { + ${props => (props.onClick ? `color: ${darken(0.1, props.fontColor)}` : '')}; + } `; Text.defaultProps = { fontFamily: 'Roboto', fontWeight: 400, - fontColor: colors.white, - fontSize: '14px', + fontColor: colors.black, + fontSize: '15px', + lineHeight: '1.5em', Tag: 'div', }; Text.displayName = 'Text'; + +export const Title: React.StatelessComponent<TextProps> = props => <Text {...props} />; + +Title.defaultProps = { + Tag: 'h2', + fontSize: '20px', + fontWeight: 600, + fontColor: colors.black, +}; + +Title.displayName = 'Title'; diff --git a/packages/website/ts/components/wallet/wallet.tsx b/packages/website/ts/components/wallet/wallet.tsx index fc5e45248..8c8d74e58 100644 --- a/packages/website/ts/components/wallet/wallet.tsx +++ b/packages/website/ts/components/wallet/wallet.tsx @@ -131,7 +131,6 @@ const styles: Styles = { const ETHER_ICON_PATH = '/images/ether.png'; const ICON_DIMENSION = 28; -const TOKEN_AMOUNT_DISPLAY_PRECISION = 5; const BODY_ITEM_KEY = 'BODY'; const HEADER_ITEM_KEY = 'HEADER'; const FOOTER_ITEM_KEY = 'FOOTER'; @@ -445,10 +444,7 @@ export class Wallet extends React.Component<WalletProps, WalletState> { </PlaceHolder> ); } else { - const unitAmount = Web3Wrapper.toUnitAmount(amount, decimals); - const precision = Math.min(TOKEN_AMOUNT_DISPLAY_PRECISION, unitAmount.decimalPlaces()); - const formattedAmount = unitAmount.toFixed(precision); - const result = `${formattedAmount} ${symbol}`; + const result = utils.getFormattedAmount(amount, decimals, symbol); return <div style={styles.amountLabel}>{result}</div>; } } diff --git a/packages/website/ts/containers/zero_ex_js_documentation.ts b/packages/website/ts/containers/zero_ex_js_documentation.ts index a8890a07a..bd0d1732a 100644 --- a/packages/website/ts/containers/zero_ex_js_documentation.ts +++ b/packages/website/ts/containers/zero_ex_js_documentation.ts @@ -173,6 +173,7 @@ const docsInfoConfig: DocsInfoConfig = { 'OrderStateInvalid', 'OrderState', 'OrderStateWatcherConfig', + 'OrderWatcherConfig', 'FilterObject', 'OrderRelevantState', 'JSONRPCRequestPayload', diff --git a/packages/website/ts/types.ts b/packages/website/ts/types.ts index 24e86a901..d00154652 100644 --- a/packages/website/ts/types.ts +++ b/packages/website/ts/types.ts @@ -519,6 +519,8 @@ export interface WebsiteBackendRelayerInfo { url: string; appUrl?: string; headerImgUrl?: string; + logoImgUrl?: string; + primaryColor?: string; topTokens: WebsiteBackendTokenInfo[]; } diff --git a/packages/website/ts/utils/constants.ts b/packages/website/ts/utils/constants.ts index d281c5738..25670ef27 100644 --- a/packages/website/ts/utils/constants.ts +++ b/packages/website/ts/utils/constants.ts @@ -6,6 +6,7 @@ export const constants = { ETHER_TOKEN_SYMBOL: 'WETH', ZRX_TOKEN_SYMBOL: 'ZRX', ETHER_SYMBOL: 'ETH', + TOKEN_AMOUNT_DISPLAY_PRECISION: 5, GENESIS_ORDER_BLOCK_BY_NETWORK_ID: { 1: 4145578, 42: 3117574, diff --git a/packages/website/ts/utils/utils.ts b/packages/website/ts/utils/utils.ts index fdee264b2..414361c1b 100644 --- a/packages/website/ts/utils/utils.ts +++ b/packages/website/ts/utils/utils.ts @@ -3,6 +3,7 @@ import { OrderError } from '@0xproject/order-utils'; import { constants as sharedConstants, Networks } from '@0xproject/react-shared'; import { ECSignature, Provider } from '@0xproject/types'; import { BigNumber } from '@0xproject/utils'; +import { Web3Wrapper } from '@0xproject/web3-wrapper'; import deepEqual = require('deep-equal'); import * as _ from 'lodash'; import * as moment from 'moment'; @@ -17,6 +18,7 @@ import { SideToAssetToken, Token, TokenByAddress, + TokenState, } from 'ts/types'; import { configs } from 'ts/utils/configs'; import { constants } from 'ts/utils/constants'; @@ -332,4 +334,13 @@ export const utils = { const token = _.find(tokens, { symbol }); return token; }, + getFormattedAmountFromToken(token: Token, tokenState: TokenState): string { + return utils.getFormattedAmount(tokenState.balance, token.decimals, token.symbol); + }, + getFormattedAmount(amount: BigNumber, decimals: number, symbol: string): string { + const unitAmount = Web3Wrapper.toUnitAmount(amount, decimals); + const precision = Math.min(constants.TOKEN_AMOUNT_DISPLAY_PRECISION, unitAmount.decimalPlaces()); + const formattedAmount = unitAmount.toFixed(precision); + return `${formattedAmount} ${symbol}`; + }, }; |