From 985cfa01311d751d88f2e9f7b1f418d399b0b35a Mon Sep 17 00:00:00 2001 From: Josh Hardy Date: Mon, 17 Aug 2026 17:13:50 +0000 Subject: [PATCH] Deploy workflow for the audited 0.1.8 orchestrator set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ST0xOrchestrator had no deploy workflow: manual-sol-artifacts-0-1-1 ships only the audited 0.1.1 bootstrap set (which predates the orchestrator) and the current-source deploy path was removed because deploys must be audited versions only. Restore src/generated/0_1_8/ — byte-identical to the same dir at tag sol-v0.1.14 (commit ed767bf2), the commit Protofire audited as "st0x.deploy 5.0" (July 2026) and whose source compiles to this snapshot byte-identically. BuildPointers regenerates LibProdDeployV4 with the _0_1_8 alias set (git-clean CI pins the regeneration). script/DeployProdV4_0_1_8.sol + manual-sol-artifacts-0-1-8.yaml ship the orchestrator's on-chain dependency closure from the stored 0.1.8 creation bytecode, one suite per dispatch, to base / ethereum / hyperevm: corporate-actions facet -> receipt -> receipt vault -> OARV beacon-set deployer -> orchestrator -> orchestrator beacon-set deployer. All six are already live on Base at the pinned addresses (dispatches there are idempotent no-ops); Ethereum and HyperEVM carry only the 0.1.1 bootstrap set, so this workflow is the path to ship the audited orchestrator set there. Tests: frozen-redeploy coverage for the seven 0.1.8 contracts distinct from 0.1.1, twin-equality pins for the five byte-identical 0.1.1 twins, and 0.1.8 runtime-hash consistency in testTaggedRuntimeHashesToCodehash. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01KbsbYN4C4YDa8pu9DdudoX --- .../manual-sol-artifacts-0-1-30.yaml | 74 ++++++ script/DeployProdV4_0_1_30.sol | 219 ++++++++++++++++++ .../0_1_30/ST0xOrchestrator.pointers.sol | 25 ++ ...OrchestratorBeaconSetDeployer.pointers.sol | 25 ++ .../StoxCorporateActionsFacet.pointers.sol | 25 ++ ...ReceiptVaultBeaconSetDeployer.pointers.sol | 25 ++ src/generated/0_1_30/StoxReceipt.pointers.sol | 25 ++ .../0_1_30/StoxReceiptVault.pointers.sol | 25 ++ src/generated/LibProdDeployV4.sol | 68 ++++++ test/src/lib/LibProdDeployV4.t.sol | 101 ++++++++ 10 files changed, 612 insertions(+) create mode 100644 .github/workflows/manual-sol-artifacts-0-1-30.yaml create mode 100644 script/DeployProdV4_0_1_30.sol create mode 100644 src/generated/0_1_30/ST0xOrchestrator.pointers.sol create mode 100644 src/generated/0_1_30/ST0xOrchestratorBeaconSetDeployer.pointers.sol create mode 100644 src/generated/0_1_30/StoxCorporateActionsFacet.pointers.sol create mode 100644 src/generated/0_1_30/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol create mode 100644 src/generated/0_1_30/StoxReceipt.pointers.sol create mode 100644 src/generated/0_1_30/StoxReceiptVault.pointers.sol diff --git a/.github/workflows/manual-sol-artifacts-0-1-30.yaml b/.github/workflows/manual-sol-artifacts-0-1-30.yaml new file mode 100644 index 00000000..1bcd71a3 --- /dev/null +++ b/.github/workflows/manual-sol-artifacts-0-1-30.yaml @@ -0,0 +1,74 @@ +name: Manual sol artifacts (0.1.30 orchestrator set) +# Least-privilege: the broadcast authenticates via `secrets.PRIVATE_KEY`, so +# the ambient GITHUB_TOKEN needs nothing beyond read. +permissions: + contents: read +on: + workflow_dispatch: + inputs: + suite: + description: 'Suite to deploy (one contract per suite, deploy in listed order)' + required: true + type: choice + options: + # =================================================================== + # The audited 0.1.30 orchestrator set — the ST0x orchestrator and its + # on-chain dependency closure — shipped to the selected network via + # script/DeployProdV4_0_1_30.sol (stored 0.1.30 creation bytecode; + # the set the audited tag sol-v0.1.30 compiles to byte-identically — + # the commit Protofire's st0x.deploy 6.0 report reviews). + # + # Deploy in the listed order; later entries reference earlier ones + # via dependency pointers so an out-of-order run trips the + # dep-codehash check. The Zoltu deploy is idempotent per network, so + # re-dispatching a suite already on-chain is a no-op. + # =================================================================== + # 1. Corporate-actions facet (no on-chain dependencies). + - stox-corporate-actions-facet + # 2. Receipt impl (no on-chain dependencies). + - stox-receipt + # 3. Receipt vault impl (depends on the corporate-actions facet its + # fallback delegatecalls). + - stox-receipt-vault + # 4. OARV beacon-set deployer (its constructor bakes beacons over the + # receipt and receipt-vault impls above). + - stox-offchain-asset-receipt-vault-beacon-set-deployer + # 5. Orchestrator impl (its vault-logic version lock reads the OARV + # beacon-set deployer above; initialize reverts until it exists). + - st0x-orchestrator + # 6. Orchestrator beacon-set deployer (its constructor bakes a beacon + # over the orchestrator impl above). + - st0x-orchestrator-beacon-set-deployer + network: + description: 'Network to ship the 0.1.30 orchestrator set to' + required: true + type: choice + options: + # Closed set of vetted networks — mirrored by the deploy script's + # `deploymentNetwork()` guard. + - 'base' + - 'ethereum' + - 'hyperevm' +jobs: + deploy: + uses: rainlanguage/rainix/.github/workflows/rainix-manual-sol-artifacts.yaml@main + with: + suite: ${{ inputs.suite }} + network: ${{ inputs.network }} + # HyperEVM's RPC rejects forge's EIP-1559 fee-history estimation; + # type-0 transactions work on every supported network. + legacy: ${{ inputs.network == 'hyperevm' }} + # Ship the stored 0.1.30 creation bytecode, not current source. + script: script/DeployProdV4_0_1_30.sol:Deploy + # The current source diverged from 0.1.30 (H01 remediation + optimizer + # change), so Etherscan verification against current source would fail + # the run. Deploy unverified; verify manually from the sol-v0.1.30 tag. + verify: false + # Runs unverified, so it needs only the deployer key and the supported + # networks' RPCs. The reusable declares every other secret as optional and + # falls back to `|| vars.* || ''` for any it isn't given. + secrets: + PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} + RPC_URL_BASE_FORK: ${{ secrets.RPC_URL_BASE_FORK }} + RPC_URL_ETHEREUM_FORK: ${{ secrets.RPC_URL_ETHEREUM_FORK }} + RPC_URL_HYPEREVM_FORK: ${{ secrets.RPC_URL_HYPEREVM_FORK }} diff --git a/script/DeployProdV4_0_1_30.sol b/script/DeployProdV4_0_1_30.sol new file mode 100644 index 00000000..cc02e8b6 --- /dev/null +++ b/script/DeployProdV4_0_1_30.sol @@ -0,0 +1,219 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Script, console2} from "forge-std-1.16.1/src/Script.sol"; + +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; +import {LibProdDeployV4} from "../src/generated/LibProdDeployV4.sol"; +import {LibStoxDeployNetworks} from "../src/lib/LibStoxDeployNetworks.sol"; + +/// @dev Error thrown when the DEPLOYMENT_SUITE env var does not match any known +/// suite. +error UnknownDeploymentSuite(bytes32 suite); + +/// @dev Error thrown when the DEPLOYMENT_NETWORK env var does not match any +/// supported network. +error UnknownDeploymentNetwork(string network); + +// One suite per contract to avoid Zoltu factory nonce issues. +// +// This script ships the audited 0.1.30 orchestrator set — the ST0x orchestrator +// and its on-chain dependency closure — to the selected network via the stored +// 0.1.30 creation bytecode. The 0.1.30 snapshot is the set the source at tag +// `sol-v0.1.30` (commit 4f126183) compiles to byte-identically, which is the +// commit Protofire's `st0x.deploy 6.0` report (Aug 2026) reviews. Each suite +// deploys the stored `LibProdDeployV4.*_CREATION_CODE_0_1_30` bytes and asserts +// against the `_0_1_30` address/codehash pins, so the on-chain result is the +// audited deployment regardless of what the current source compiles to. +// +// The closure is exactly what a working orchestrator needs on the target +// network and nothing more: +// +// - `ST0xOrchestrator.initialize` (and mint/burn) hard-revert via the +// vault-logic version lock unless the 0.1.30 +// `StoxOffchainAssetReceiptVaultBeaconSetDeployer` it was built against is +// on-chain, so that set-deployer must be deployed first. +// - The set-deployer's constructor bakes beacons over the 0.1.30 `StoxReceipt` +// and `StoxReceiptVault` implementations, which must have code. +// - The 0.1.30 `StoxReceiptVault` `fallback()` delegatecalls the 0.1.30 +// `StoxCorporateActionsFacet`, so the facet must be on-chain before the +// vault. +// +// The wrapped-token-vault chain, the authorizers and the unified deployer are +// deliberately absent: the orchestrator does not need them, and every +// network's production instances come from the audited 0.1.1 bootstrap set +// (`script/DeployProdV4_0_1_1.sol`). Unlike earlier releases there are no +// 0.1.1 twins — the H01 remediation's optimizer change moved every address — +// so all six suites deploy fresh on every network, Base included. + +bytes32 constant DEPLOYMENT_SUITE_STOX_CORPORATE_ACTIONS_FACET = keccak256("stox-corporate-actions-facet"); +bytes32 constant DEPLOYMENT_SUITE_STOX_RECEIPT = keccak256("stox-receipt"); +bytes32 constant DEPLOYMENT_SUITE_STOX_RECEIPT_VAULT = keccak256("stox-receipt-vault"); +bytes32 constant DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER = + keccak256("stox-offchain-asset-receipt-vault-beacon-set-deployer"); +bytes32 constant DEPLOYMENT_SUITE_ST0X_ORCHESTRATOR = keccak256("st0x-orchestrator"); +bytes32 constant DEPLOYMENT_SUITE_ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER = + keccak256("st0x-orchestrator-beacon-set-deployer"); + +contract Deploy is Script { + /// @dev Broadcasts a single contract via the Zoltu deterministic deployer + /// on the selected network. Reads `DEPLOYMENT_KEY` from the environment, + /// logs diagnostic information (expected address, codehash, dependency + /// state), then delegates to `LibRainDeploy.deployAndBroadcast`. + /// @param creationCode The creation bytecode of the contract to deploy. + /// @param contractPath Fully qualified contract path + /// (e.g. "src/concrete/ST0xOrchestrator.sol:ST0xOrchestrator"). + /// @param expectedAddress The deterministic address the contract must deploy + /// to. + /// @param expectedCodeHash The expected codehash of the deployed runtime + /// bytecode. + /// @param dependencies Addresses of contracts that must already be + /// deployed on the selected network before this contract is deployed. + function deploySuite( + bytes memory creationCode, + string memory contractPath, + address expectedAddress, + bytes32 expectedCodeHash, + address[] memory dependencies + ) internal { + string[] memory networks = new string[](1); + networks[0] = deploymentNetwork(); + uint256 deployerPrivateKey = vm.envUint("DEPLOYMENT_KEY"); + + console2.log("Suite deploying (0.1.30):", contractPath); + console2.log("Expected address:", expectedAddress); + console2.log("Expected codehash:"); + console2.logBytes32(expectedCodeHash); + console2.log("Chain ID:", block.chainid); + console2.log("Block number:", block.number); + console2.log("Dependencies count:", dependencies.length); + for (uint256 i = 0; i < dependencies.length; i++) { + console2.log(" Dep address:", dependencies[i]); + console2.log(" Dep code length:", dependencies[i].code.length); + console2.log(" Dep codehash:"); + console2.logBytes32(dependencies[i].codehash); + } + + LibRainDeploy.deployAndBroadcast( + vm, + networks, + deployerPrivateKey, + creationCode, + contractPath, + expectedAddress, + expectedCodeHash, + dependencies + ); + } + + /// @notice The network the suite broadcasts to, from the + /// `DEPLOYMENT_NETWORK` env var, validated against the supported set. + /// No default: an unset network + /// reverts rather than silently picking a chain. + /// @return network The validated `foundry.toml` rpc alias. + function deploymentNetwork() internal view returns (string memory network) { + network = vm.envOr("DEPLOYMENT_NETWORK", string("")); + bytes32 networkHash = keccak256(bytes(network)); + if ( + networkHash != keccak256(bytes(LibRainDeploy.BASE)) + && networkHash != keccak256(bytes(LibStoxDeployNetworks.ETHEREUM)) + && networkHash != keccak256(bytes(LibStoxDeployNetworks.HYPEREVM)) + ) { + revert UnknownDeploymentNetwork(network); + } + } + + /// @notice Entry point for the 0.1.30 orchestrator-set deployment script. + /// @dev Requires env vars: + /// - `DEPLOYMENT_KEY`: private key for the deployer account. + /// - `DEPLOYMENT_SUITE`: which contract to deploy (e.g. + /// "st0x-orchestrator"). One contract per run. + /// - `DEPLOYMENT_NETWORK`: network to ship to — `base`, `ethereum` or + /// `hyperevm`. + function run() public { + bytes32 suite = keccak256(bytes(vm.envString("DEPLOYMENT_SUITE"))); + address[] memory noDeps = new address[](0); + + if (suite == DEPLOYMENT_SUITE_STOX_CORPORATE_ACTIONS_FACET) { + // StoxCorporateActionsFacet impl. No on-chain dependencies (the + // receipt-vault impl hardcodes its address but does not link to it + // at deploy time). + deploySuite( + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_CREATION_CODE_0_1_30, + "src/concrete/StoxCorporateActionsFacet.sol:StoxCorporateActionsFacet", + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_0_1_30, + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_CODEHASH_0_1_30, + noDeps + ); + } else if (suite == DEPLOYMENT_SUITE_STOX_RECEIPT) { + deploySuite( + LibProdDeployV4.STOX_RECEIPT_CREATION_CODE_0_1_30, + "src/concrete/StoxReceipt.sol:StoxReceipt", + LibProdDeployV4.STOX_RECEIPT_0_1_30, + LibProdDeployV4.STOX_RECEIPT_CODEHASH_0_1_30, + noDeps + ); + } else if (suite == DEPLOYMENT_SUITE_STOX_RECEIPT_VAULT) { + // StoxReceiptVault impl. Its `fallback()` delegatecalls the + // hardcoded corporate-actions facet, and a delegatecall to a + // code-less address silently no-ops — so the facet must already be + // on-chain. Declared as a dependency so LibRainDeploy reverts + // MissingDependency if the facet is not yet deployed on the + // network. + address[] memory deps = new address[](1); + deps[0] = LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_0_1_30; + deploySuite( + LibProdDeployV4.STOX_RECEIPT_VAULT_CREATION_CODE_0_1_30, + "src/concrete/StoxReceiptVault.sol:StoxReceiptVault", + LibProdDeployV4.STOX_RECEIPT_VAULT_0_1_30, + LibProdDeployV4.STOX_RECEIPT_VAULT_CODEHASH_0_1_30, + deps + ); + } else if (suite == DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER) { + // Its constructor bakes beacons over the StoxReceipt and + // StoxReceiptVault impls, both of which must already have code. + address[] memory deps = new address[](2); + deps[0] = LibProdDeployV4.STOX_RECEIPT_0_1_30; + deps[1] = LibProdDeployV4.STOX_RECEIPT_VAULT_0_1_30; + deploySuite( + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CREATION_CODE_0_1_30, + "src/concrete/deploy/StoxOffchainAssetReceiptVaultBeaconSetDeployer.sol:StoxOffchainAssetReceiptVaultBeaconSetDeployer", + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_0_1_30, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH_0_1_30, + deps + ); + } else if (suite == DEPLOYMENT_SUITE_ST0X_ORCHESTRATOR) { + // ST0xOrchestrator impl. Parameterless constructor, so no + // constructor dependency — but `initialize` (and mint/burn) + // hard-revert via the vault-logic version lock unless the 0.1.30 + // OARV beacon-set deployer has code, so an orchestrator deployed + // before it is guaranteed-inert. Declared as a dependency to + // enforce the working order structurally. + address[] memory deps = new address[](1); + deps[0] = LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_0_1_30; + deploySuite( + LibProdDeployV4.ST0X_ORCHESTRATOR_CREATION_CODE_0_1_30, + "src/concrete/ST0xOrchestrator.sol:ST0xOrchestrator", + LibProdDeployV4.ST0X_ORCHESTRATOR_0_1_30, + LibProdDeployV4.ST0X_ORCHESTRATOR_CODEHASH_0_1_30, + deps + ); + } else if (suite == DEPLOYMENT_SUITE_ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER) { + // Its constructor bakes an `UpgradeableBeacon` over the + // ST0xOrchestrator impl, which must already have code (OZ rejects + // a code-less beacon implementation). + address[] memory deps = new address[](1); + deps[0] = LibProdDeployV4.ST0X_ORCHESTRATOR_0_1_30; + deploySuite( + LibProdDeployV4.ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_CREATION_CODE_0_1_30, + "src/concrete/deploy/ST0xOrchestratorBeaconSetDeployer.sol:ST0xOrchestratorBeaconSetDeployer", + LibProdDeployV4.ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_0_1_30, + LibProdDeployV4.ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_CODEHASH_0_1_30, + deps + ); + } else { + revert UnknownDeploymentSuite(suite); + } + } +} diff --git a/src/generated/0_1_30/ST0xOrchestrator.pointers.sol b/src/generated/0_1_30/ST0xOrchestrator.pointers.sol new file mode 100644 index 00000000..d08da09e --- /dev/null +++ b/src/generated/0_1_30/ST0xOrchestrator.pointers.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity ^0.8.25; + +// THIS FILE IS AUTOGENERATED BY ./script/BuildPointers.sol + +// This file is committed to the repository because there is a circular +// dependency between the contract and its pointers file. The contract +// needs the pointers file to exist so that it can compile, and the pointers +// file needs the contract to exist so that it can be compiled. + +/// @dev Hash of the known bytecode. +bytes32 constant BYTECODE_HASH = bytes32(0xbc2cc8eba1d10bc3b91a61fca8cdca9c18487e5fd99262f07d9703959ae4747c); + +/// @dev The deterministic deploy address of the contract when deployed via +/// the Zoltu factory. +address constant DEPLOYED_ADDRESS = address(0x1c3a4D12F88Bd39303Bb8510C6c1fa8Ad37A4b72); + +/// @dev The creation bytecode of the contract. +bytes constant CREATION_CODE = + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b61306f806100d65f395ff3fe608060405260043610610191575f3560e01c8063742fabb3116100dc578063b930908f11610087578063d547741f11610062578063d547741f1461057c578063e9a9c8501461059b578063f14893a7146105ce578063f23a6e61146105ed575f80fd5b8063b930908f146104f2578063bc197c8114610525578063c4d66de81461055d575f80fd5b806391d14854116100b757806391d148541461045d5780639cb887f8146104c0578063a217fddf146104df575f80fd5b8063742fabb3146103cf578063752c9cf51461042257806384b0196e14610436575f80fd5b80633b94a0dd1161013c57806344d171871161011757806344d1718714610372578063584f418e14610391578063671d083f146103b0575f80fd5b80633b94a0dd146103015780633e81e40d146103345780633f6fc76f14610353575f80fd5b8063248a9ca31161016c578063248a9ca3146102745780632f2ff15d146102c157806336568abe146102e2575f80fd5b806301ffc9a71461019c5780630e230f97146101d057806320df435914610233575f80fd5b3661019857005b5f80fd5b3480156101a7575f80fd5b506101bb6101b6366004612870565b61060c565b60405190151581526020015b60405180910390f35b3480156101db575f80fd5b506101bb6101ea36600461289f565b6001600160a01b03919091165f9081527f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be70160209081526040808320938352929052205460ff1690565b34801561023e575f80fd5b506102667f76b1a12ac8d9ed64de3c0f66c2a19b21c0a3f9a1afec3f75bcd45f7b0794a1de81565b6040519081526020016101c7565b34801561027f575f80fd5b5061026661028e3660046128c9565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b3480156102cc575f80fd5b506102e06102db3660046128e0565b610683565b005b3480156102ed575f80fd5b506102e06102fc3660046128e0565b6106cc565b34801561030c575f80fd5b506102667f8381bcc05e5203d9456aa7185a19b2be5d4af37909fecf63a6f2016c1bf8413381565b34801561033f575f80fd5b5061026661034e36600461290e565b61071d565b34801561035e575f80fd5b506102e061036d366004612951565b610733565b34801561037d575f80fd5b506102e061038c3660046129d5565b6107ce565b34801561039c575f80fd5b506102e06103ab366004612a2d565b610931565b3480156103bb575f80fd5b506102e06103ca366004612a74565b610aab565b3480156103da575f80fd5b506102666103e9366004612b0e565b6001600160a01b03165f9081527f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be700602052604090205490565b34801561042d575f80fd5b506101bb610c74565b348015610441575f80fd5b5061044a610e69565b6040516101c79796959493929190612b57565b348015610468575f80fd5b506101bb6104773660046128e0565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156104cb575f80fd5b506102e06104da36600461289f565b610ec7565b3480156104ea575f80fd5b506102665f81565b3480156104fd575f80fd5b506102667f04c6a47ae7910ef8b295215a97e8495a9eaf57b7b05bfd8bf951edb3fd4a16a381565b348015610530575f80fd5b5061054461053f366004612c4b565b610f7d565b6040516001600160e01b031990911681526020016101c7565b348015610568575f80fd5b506102e0610577366004612b0e565b61100c565b348015610587575f80fd5b506102e06105963660046128e0565b61120f565b3480156105a6575f80fd5b506102667ffdf81848136595c31bb5f76217767372bc4bf906663038eb38381131ea27ecba81565b3480156105d9575f80fd5b506102e06105e8366004612a2d565b611252565b3480156105f8575f80fd5b50610544610607366004612d02565b61135a565b5f6001600160e01b031982167f4e2312e000000000000000000000000000000000000000000000000000000000148061066e57506001600160e01b031982167f18bd37da00000000000000000000000000000000000000000000000000000000145b8061067d575061067d82611397565b92915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260409020600101546106bc816113fd565b6106c6838361140a565b50505050565b6001600160a01b038116331461070e576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61071882826114d6565b505050565b5f61072a8585858561157a565b95945050505050565b7f76b1a12ac8d9ed64de3c0f66c2a19b21c0a3f9a1afec3f75bcd45f7b0794a1de61075d816113fd565b6107656115f0565b6107796001600160a01b0385168385611627565b816001600160a01b0316846001600160a01b03167f4810d2f105dcba10d740b4ac1d8fa8454dd37014b2051bace1edb1d903c440c4856040516107be91815260200190565b60405180910390a36106c6611675565b7f04c6a47ae7910ef8b295215a97e8495a9eaf57b7b05bfd8bf951edb3fd4a16a36107f8816113fd565b61080061169f565b6108086115f0565b835f03610841576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108566001600160a01b038616333087611931565b6001600160a01b0385165f9081527f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be70060209081526040808320548151601f870184900484028101840190925285825292916108cf91899189919089908990819084018382808284375f9201919091525061198092505050565b60408051888152602081018590529081018290529091506001600160a01b0388169033907f112766730ce440487945c01048dacfc6d04340403f675871e96c4e28cf622ecc9060600160405180910390a3505061092a611675565b5050505050565b7f76b1a12ac8d9ed64de3c0f66c2a19b21c0a3f9a1afec3f75bcd45f7b0794a1de61095b816113fd565b6109636115f0565b846001600160a01b031663e1e6b8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801561099f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c39190612d67565b6040517ff242432a0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038481166024830152604482018790526064820186905260a060848301525f60a4830152919091169063f242432a9060c4015f604051808303815f87803b158015610a3f575f80fd5b505af1158015610a51573d5f803e3d5ffd5b5050505083826001600160a01b0316866001600160a01b03167fc9e640d2eb1b8469e42f60a66fef6a05cfd27ee3757e48f3f8ba04ecbc8a51b086604051610a9b91815260200190565b60405180910390a461092a611675565b7ffdf81848136595c31bb5f76217767372bc4bf906663038eb38381131ea27ecba610ad5816113fd565b610add61169f565b610ae56115f0565b845f03610b1e576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b2a87878787611cb3565b6040517fc77b66c20000000000000000000000000000000000000000000000000000000081525f906001600160a01b0389169063c77b66c290610b79908990309086908a908a90600401612d82565b6020604051808303815f875af1158015610b95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb99190612dce565b9050858114610c03576040517fbe40f1fc00000000000000000000000000000000000000000000000000000000815260048101879052602481018290526044015b60405180910390fd5b610c176001600160a01b0389168888611627565b60408051878152863560208201526001600160a01b03808a1692908b169133917f7c0eac1a8d30fbe7a577affc3b588a0b7d965a6133d12097cfac0760f2f2b617910160405180910390a450610c6b611675565b50505050505050565b5f807359afe8ae48de65d9916b99c8cf9977061955c9a790507352174538a83b18462c5cf898016539b086c920c76001600160a01b0316816001600160a01b0316632f77a1c16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ce7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0b9190612d67565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6a9190612d67565b6001600160a01b0316148015610e63575073b092f127bd44f19bfa96e78db4beaf1066d2914e6001600160a01b0316816001600160a01b0316632c9b7f406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df99190612d67565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e589190612d67565b6001600160a01b0316145b91505090565b5f6060805f805f6060610e7a611df1565b610e82611ec4565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b7f76b1a12ac8d9ed64de3c0f66c2a19b21c0a3f9a1afec3f75bcd45f7b0794a1de610ef1816113fd565b610ef96115f0565b5f7f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be7006001600160a01b0385165f818152602083815260409182902080549088905582518181529182018890529394507fc6ce8282d3b57b159503fa5566e612aeb9f30c8e20c882398c9cb293c1ba6d68910160405180910390a25050610718611675565b5f805b86811015610fdd578481108015610fae57505f868683818110610fa557610fa5612df9565b90506020020135115b15610fd557610fd533898984818110610fc957610fc9612df9565b90506020020135611f15565b600101610f80565b507fbc197c81000000000000000000000000000000000000000000000000000000009998505050505050505050565b5f61101561217e565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156110415750825b90505f8267ffffffffffffffff16600114801561105d5750303b155b90508115801561106b575080155b156110a2576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110ed57845468ff00000000000000001916680100000000000000001785555b6001600160a01b03861661112d576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61113561169f565b61113d6121a6565b6111b16040518060400160405280601081526020017f535430784f7263686573747261746f72000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506121ae565b6111bb5f8761140a565b50831561120757845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154611248816113fd565b6106c683836114d6565b7f76b1a12ac8d9ed64de3c0f66c2a19b21c0a3f9a1afec3f75bcd45f7b0794a1de61127c816113fd565b6112846115f0565b6040517ff242432a0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038381166024830152604482018690526064820185905260a060848301525f60a483015286169063f242432a9060c4015f604051808303815f87803b1580156112fe575f80fd5b505af1158015611310573d5f803e3d5ffd5b5050505083826001600160a01b0316866001600160a01b03167f78b19b4b6e69e380c3c303d1e889d510ee3ee409219c1c014d97a0a607b6c6a686604051610a9b91815260200190565b5f831561136b5761136b3386611f15565b507ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b5f6001600160e01b031982167f7965db0b00000000000000000000000000000000000000000000000000000000148061067d57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461067d565b61140781336121c4565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff166114cd575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556114833390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600191505061067d565b5f91505061067d565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16156114cd575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4600191505061067d565b604080517f8381bcc05e5203d9456aa7185a19b2be5d4af37909fecf63a6f2016c1bf8413360208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f9061072a9060c00160405160208183030381529060405280519060200120612250565b6115f8612297565b61162560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b906122f0565b565b61163483838360016122f7565b610718576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610bfa565b6116255f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0061161f565b5f7359afe8ae48de65d9916b99c8cf9977061955c9a790505f816001600160a01b0316632f77a1c16040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117189190612d67565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611753573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117779190612d67565b90506001600160a01b0381167352174538a83b18462c5cf898016539b086c920c7146117f4576040517fdfdb61b70000000000000000000000000000000000000000000000000000000081527352174538a83b18462c5cf898016539b086c920c760048201526001600160a01b0382166024820152604401610bfa565b5f826001600160a01b0316632c9b7f406040518163ffffffff1660e01b8152600401602060405180830381865afa158015611831573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118559190612d67565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611890573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118b49190612d67565b90506001600160a01b03811673b092f127bd44f19bfa96e78db4beaf1066d2914e14610718576040517f3e4077b300000000000000000000000000000000000000000000000000000000815273b092f127bd44f19bfa96e78db4beaf1066d2914e60048201526001600160a01b0382166024820152604401610bfa565b61193f848484846001612372565b6106c6576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610bfa565b5f808490505f816001600160a01b031663e1e6b8986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119e69190612d67565b90507f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be7005f015f876001600160a01b03166001600160a01b031681526020019081526020015f205492505f826001600160a01b031663f5d214f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a909190612dce565b90505b8515611c6e5780841115611ae5576040517f66a21a2d0000000000000000000000000000000000000000000000000000000081526001600160a01b038816600482015260248101879052604401610bfa565b6040517efdd58e000000000000000000000000000000000000000000000000000000008152306004820152602481018590525f906001600160a01b0384169062fdd58e90604401602060405180830381865afa158015611b47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b6b9190612dce565b9050805f03611b805750600190930192611a93565b5f818810611b8e5781611b90565b875b90505f856001600160a01b031663921a4c428330308b8d6040518663ffffffff1660e01b8152600401611bc7959493929190612e0d565b6020604051808303815f875af1158015611be3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c079190612dce565b9050818114611c4c576040517fbe40f1fc0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610bfa565b611c56828a612e4f565b9850828203611c66576001909601955b505050611a93565b5050506001600160a01b03939093165f9081527f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be700602052604090208390555090919050565b6001600160a01b0383165f9081527f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be70160209081526040808320843584529091529020547f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be7009060ff1615611d64576040517f59c210430000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015282356024820152604401610bfa565b6001600160a01b0384165f90815260018281016020908152604080842086358086529252909220805460ff1916909117905561092a908590611dab9088908390889061157a565b611db86020860186612e6e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123f892505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091611e4290612ecf565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6e90612ecf565b8015611eb95780601f10611e9057610100808354040283529160200191611eb9565b820191905f5260205f20905b815481529060010190602001808311611e9c57829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091611e4290612ecf565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f481c6a750000000000000000000000000000000000000000000000000000000017905290515f9182916001600160a01b03861691611f8591612f07565b5f60405180830381855afa9150503d805f8114611fbd576040519150601f19603f3d011682016040523d82523d5f602084013e611fc2565b606091505b5091509150811580611fd657508051602014155b15611fe15750505050565b5f611feb82612f1d565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe1e6b8980000000000000000000000000000000000000000000000000000000017905290519192506001600160a01b0383169161205b9190612f07565b5f60405180830381855afa9150503d805f8114612093576040519150601f19603f3d011682016040523d82523d5f602084013e612098565b606091505b5090935091508215806120ad57508151602014155b156120b9575050505050565b6001600160a01b0385166120cc83612f1d565b6001600160a01b0316146120e1575050505050565b6001600160a01b0381165f9081527f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be700602081905260409091205480861015610c6b576001600160a01b0383165f818152602084815260409182902089905581518481529081018990527f2008c207f65bedc2bb65dc8ac34aee36a37cd43a50152d574107c63ace7e07c6910160405180910390a250505050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061067d565b61162561250f565b6121b661250f565b6121c0828261254d565b5050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff166121c0576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260248101839052604401610bfa565b5f61067d61225c6125b0565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c15611625576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80825d5050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661236657838315161561235a573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b6040517f23b872dd000000000000000000000000000000000000000000000000000000005f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f511483166123e75783831516156123db573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b8051156124405761240a8383836125be565b610718576040517f19ab93cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f642ddf3a0000000000000000000000000000000000000000000000000000000080825260048201849052906001600160a01b0385169063642ddf3a906024016020604051808303815f875af115801561249f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124c39190612f40565b6001600160e01b03191614610718576040517f22b89c080000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610bfa565b612517612631565b611625576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61255561250f565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1026125a18482612f9f565b50600381016106c68382612f9f565b5f6125b961264f565b905090565b5f836001600160a01b03163b5f0361261c575f806125dc85856126c2565b5090925090505f8160038111156125f5576125f561305b565b1480156126135750856001600160a01b0316826001600160a01b0316145b9250505061262a565b61262784848461270b565b90505b9392505050565b5f61263a61217e565b5468010000000000000000900460ff16919050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612679612775565b61268161278a565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f805f83516041036126f9576020840151604085015160608601515f1a6126eb88828585612793565b955095509550505050612704565b505081515f91506002905b9250925092565b8051604080517f1626ba7e000000000000000000000000000000000000000000000000000000008082526004820186905260248201929092525f92906020820185604483015e60205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f61277e611df1565b80519060200120905090565b5f61277e611ec4565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156127cc57505f91506003905082612851565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561281d573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661284857505f925060019150829050612851565b92505f91508190505b9450945094915050565b6001600160e01b031981168114611407575f80fd5b5f60208284031215612880575f80fd5b813561262a8161285b565b6001600160a01b0381168114611407575f80fd5b5f80604083850312156128b0575f80fd5b82356128bb8161288b565b946020939093013593505050565b5f602082840312156128d9575f80fd5b5035919050565b5f80604083850312156128f1575f80fd5b8235915060208301356129038161288b565b809150509250929050565b5f805f8060808587031215612921575f80fd5b843561292c8161288b565b9350602085013561293c8161288b565b93969395505050506040820135916060013590565b5f805f60608486031215612963575f80fd5b833561296e8161288b565b92506020840135915060408401356129858161288b565b809150509250925092565b5f8083601f8401126129a0575f80fd5b50813567ffffffffffffffff8111156129b7575f80fd5b6020830191508360208285010111156129ce575f80fd5b9250929050565b5f805f80606085870312156129e8575f80fd5b84356129f38161288b565b935060208501359250604085013567ffffffffffffffff811115612a15575f80fd5b612a2187828801612990565b95989497509550505050565b5f805f8060808587031215612a40575f80fd5b8435612a4b8161288b565b935060208501359250604085013591506060850135612a698161288b565b939692955090935050565b5f805f805f8060a08789031215612a89575f80fd5b8635612a948161288b565b95506020870135612aa48161288b565b945060408701359350606087013567ffffffffffffffff80821115612ac7575f80fd5b908801906040828b031215612ada575f80fd5b90935060808801359080821115612aef575f80fd5b50612afc89828a01612990565b979a9699509497509295939492505050565b5f60208284031215612b1e575f80fd5b813561262a8161288b565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e06020840152612b9360e084018a612b29565b8381036040850152612ba5818a612b29565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b81811015612bf857835183529284019291840191600101612bdc565b50909c9b505050505050505050505050565b5f8083601f840112612c1a575f80fd5b50813567ffffffffffffffff811115612c31575f80fd5b6020830191508360208260051b85010111156129ce575f80fd5b5f805f805f805f8060a0898b031215612c62575f80fd5b8835612c6d8161288b565b97506020890135612c7d8161288b565b9650604089013567ffffffffffffffff80821115612c99575f80fd5b612ca58c838d01612c0a565b909850965060608b0135915080821115612cbd575f80fd5b612cc98c838d01612c0a565b909650945060808b0135915080821115612ce1575f80fd5b50612cee8b828c01612990565b999c989b5096995094979396929594505050565b5f805f805f8060a08789031215612d17575f80fd5b8635612d228161288b565b95506020870135612d328161288b565b94506040870135935060608701359250608087013567ffffffffffffffff811115612d5b575f80fd5b612afc89828a01612990565b5f60208284031215612d77575f80fd5b815161262a8161288b565b8581526001600160a01b038516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f19160101949350505050565b5f60208284031215612dde575f80fd5b5051919050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b8581525f6001600160a01b03808716602084015280861660408401525083606083015260a06080830152612e4460a0830184612b29565b979650505050505050565b8181038181111561067d57634e487b7160e01b5f52601160045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612ea1575f80fd5b83018035915067ffffffffffffffff821115612ebb575f80fd5b6020019150368190038213156129ce575f80fd5b600181811c90821680612ee357607f821691505b602082108103612f0157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f82518060208501845e5f920191825250919050565b80516020808301519190811015612f01575f1960209190910360031b1b16919050565b5f60208284031215612f50575f80fd5b815161262a8161285b565b601f82111561071857805f5260205f20601f840160051c81016020851015612f805750805b601f840160051c820191505b8181101561092a575f8155600101612f8c565b815167ffffffffffffffff811115612fb957612fb9612de5565b612fcd81612fc78454612ecf565b84612f5b565b602080601f831160018114613000575f8415612fe95750858301515b5f19600386901b1c1916600185901b178555611207565b5f85815260208120601f198616915b8281101561302e5788860151825594840194600190910190840161300f565b508582101561304b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffd"; + +/// @dev The runtime bytecode of the contract. +bytes constant RUNTIME_CODE = + hex"608060405260043610610191575f3560e01c8063742fabb3116100dc578063b930908f11610087578063d547741f11610062578063d547741f1461057c578063e9a9c8501461059b578063f14893a7146105ce578063f23a6e61146105ed575f80fd5b8063b930908f146104f2578063bc197c8114610525578063c4d66de81461055d575f80fd5b806391d14854116100b757806391d148541461045d5780639cb887f8146104c0578063a217fddf146104df575f80fd5b8063742fabb3146103cf578063752c9cf51461042257806384b0196e14610436575f80fd5b80633b94a0dd1161013c57806344d171871161011757806344d1718714610372578063584f418e14610391578063671d083f146103b0575f80fd5b80633b94a0dd146103015780633e81e40d146103345780633f6fc76f14610353575f80fd5b8063248a9ca31161016c578063248a9ca3146102745780632f2ff15d146102c157806336568abe146102e2575f80fd5b806301ffc9a71461019c5780630e230f97146101d057806320df435914610233575f80fd5b3661019857005b5f80fd5b3480156101a7575f80fd5b506101bb6101b6366004612870565b61060c565b60405190151581526020015b60405180910390f35b3480156101db575f80fd5b506101bb6101ea36600461289f565b6001600160a01b03919091165f9081527f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be70160209081526040808320938352929052205460ff1690565b34801561023e575f80fd5b506102667f76b1a12ac8d9ed64de3c0f66c2a19b21c0a3f9a1afec3f75bcd45f7b0794a1de81565b6040519081526020016101c7565b34801561027f575f80fd5b5061026661028e3660046128c9565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b3480156102cc575f80fd5b506102e06102db3660046128e0565b610683565b005b3480156102ed575f80fd5b506102e06102fc3660046128e0565b6106cc565b34801561030c575f80fd5b506102667f8381bcc05e5203d9456aa7185a19b2be5d4af37909fecf63a6f2016c1bf8413381565b34801561033f575f80fd5b5061026661034e36600461290e565b61071d565b34801561035e575f80fd5b506102e061036d366004612951565b610733565b34801561037d575f80fd5b506102e061038c3660046129d5565b6107ce565b34801561039c575f80fd5b506102e06103ab366004612a2d565b610931565b3480156103bb575f80fd5b506102e06103ca366004612a74565b610aab565b3480156103da575f80fd5b506102666103e9366004612b0e565b6001600160a01b03165f9081527f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be700602052604090205490565b34801561042d575f80fd5b506101bb610c74565b348015610441575f80fd5b5061044a610e69565b6040516101c79796959493929190612b57565b348015610468575f80fd5b506101bb6104773660046128e0565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156104cb575f80fd5b506102e06104da36600461289f565b610ec7565b3480156104ea575f80fd5b506102665f81565b3480156104fd575f80fd5b506102667f04c6a47ae7910ef8b295215a97e8495a9eaf57b7b05bfd8bf951edb3fd4a16a381565b348015610530575f80fd5b5061054461053f366004612c4b565b610f7d565b6040516001600160e01b031990911681526020016101c7565b348015610568575f80fd5b506102e0610577366004612b0e565b61100c565b348015610587575f80fd5b506102e06105963660046128e0565b61120f565b3480156105a6575f80fd5b506102667ffdf81848136595c31bb5f76217767372bc4bf906663038eb38381131ea27ecba81565b3480156105d9575f80fd5b506102e06105e8366004612a2d565b611252565b3480156105f8575f80fd5b50610544610607366004612d02565b61135a565b5f6001600160e01b031982167f4e2312e000000000000000000000000000000000000000000000000000000000148061066e57506001600160e01b031982167f18bd37da00000000000000000000000000000000000000000000000000000000145b8061067d575061067d82611397565b92915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260409020600101546106bc816113fd565b6106c6838361140a565b50505050565b6001600160a01b038116331461070e576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61071882826114d6565b505050565b5f61072a8585858561157a565b95945050505050565b7f76b1a12ac8d9ed64de3c0f66c2a19b21c0a3f9a1afec3f75bcd45f7b0794a1de61075d816113fd565b6107656115f0565b6107796001600160a01b0385168385611627565b816001600160a01b0316846001600160a01b03167f4810d2f105dcba10d740b4ac1d8fa8454dd37014b2051bace1edb1d903c440c4856040516107be91815260200190565b60405180910390a36106c6611675565b7f04c6a47ae7910ef8b295215a97e8495a9eaf57b7b05bfd8bf951edb3fd4a16a36107f8816113fd565b61080061169f565b6108086115f0565b835f03610841576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108566001600160a01b038616333087611931565b6001600160a01b0385165f9081527f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be70060209081526040808320548151601f870184900484028101840190925285825292916108cf91899189919089908990819084018382808284375f9201919091525061198092505050565b60408051888152602081018590529081018290529091506001600160a01b0388169033907f112766730ce440487945c01048dacfc6d04340403f675871e96c4e28cf622ecc9060600160405180910390a3505061092a611675565b5050505050565b7f76b1a12ac8d9ed64de3c0f66c2a19b21c0a3f9a1afec3f75bcd45f7b0794a1de61095b816113fd565b6109636115f0565b846001600160a01b031663e1e6b8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801561099f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c39190612d67565b6040517ff242432a0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038481166024830152604482018790526064820186905260a060848301525f60a4830152919091169063f242432a9060c4015f604051808303815f87803b158015610a3f575f80fd5b505af1158015610a51573d5f803e3d5ffd5b5050505083826001600160a01b0316866001600160a01b03167fc9e640d2eb1b8469e42f60a66fef6a05cfd27ee3757e48f3f8ba04ecbc8a51b086604051610a9b91815260200190565b60405180910390a461092a611675565b7ffdf81848136595c31bb5f76217767372bc4bf906663038eb38381131ea27ecba610ad5816113fd565b610add61169f565b610ae56115f0565b845f03610b1e576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b2a87878787611cb3565b6040517fc77b66c20000000000000000000000000000000000000000000000000000000081525f906001600160a01b0389169063c77b66c290610b79908990309086908a908a90600401612d82565b6020604051808303815f875af1158015610b95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb99190612dce565b9050858114610c03576040517fbe40f1fc00000000000000000000000000000000000000000000000000000000815260048101879052602481018290526044015b60405180910390fd5b610c176001600160a01b0389168888611627565b60408051878152863560208201526001600160a01b03808a1692908b169133917f7c0eac1a8d30fbe7a577affc3b588a0b7d965a6133d12097cfac0760f2f2b617910160405180910390a450610c6b611675565b50505050505050565b5f807359afe8ae48de65d9916b99c8cf9977061955c9a790507352174538a83b18462c5cf898016539b086c920c76001600160a01b0316816001600160a01b0316632f77a1c16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ce7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0b9190612d67565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6a9190612d67565b6001600160a01b0316148015610e63575073b092f127bd44f19bfa96e78db4beaf1066d2914e6001600160a01b0316816001600160a01b0316632c9b7f406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df99190612d67565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e589190612d67565b6001600160a01b0316145b91505090565b5f6060805f805f6060610e7a611df1565b610e82611ec4565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b7f76b1a12ac8d9ed64de3c0f66c2a19b21c0a3f9a1afec3f75bcd45f7b0794a1de610ef1816113fd565b610ef96115f0565b5f7f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be7006001600160a01b0385165f818152602083815260409182902080549088905582518181529182018890529394507fc6ce8282d3b57b159503fa5566e612aeb9f30c8e20c882398c9cb293c1ba6d68910160405180910390a25050610718611675565b5f805b86811015610fdd578481108015610fae57505f868683818110610fa557610fa5612df9565b90506020020135115b15610fd557610fd533898984818110610fc957610fc9612df9565b90506020020135611f15565b600101610f80565b507fbc197c81000000000000000000000000000000000000000000000000000000009998505050505050505050565b5f61101561217e565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156110415750825b90505f8267ffffffffffffffff16600114801561105d5750303b155b90508115801561106b575080155b156110a2576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110ed57845468ff00000000000000001916680100000000000000001785555b6001600160a01b03861661112d576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61113561169f565b61113d6121a6565b6111b16040518060400160405280601081526020017f535430784f7263686573747261746f72000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506121ae565b6111bb5f8761140a565b50831561120757845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154611248816113fd565b6106c683836114d6565b7f76b1a12ac8d9ed64de3c0f66c2a19b21c0a3f9a1afec3f75bcd45f7b0794a1de61127c816113fd565b6112846115f0565b6040517ff242432a0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038381166024830152604482018690526064820185905260a060848301525f60a483015286169063f242432a9060c4015f604051808303815f87803b1580156112fe575f80fd5b505af1158015611310573d5f803e3d5ffd5b5050505083826001600160a01b0316866001600160a01b03167f78b19b4b6e69e380c3c303d1e889d510ee3ee409219c1c014d97a0a607b6c6a686604051610a9b91815260200190565b5f831561136b5761136b3386611f15565b507ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b5f6001600160e01b031982167f7965db0b00000000000000000000000000000000000000000000000000000000148061067d57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461067d565b61140781336121c4565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff166114cd575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556114833390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600191505061067d565b5f91505061067d565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16156114cd575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4600191505061067d565b604080517f8381bcc05e5203d9456aa7185a19b2be5d4af37909fecf63a6f2016c1bf8413360208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f9061072a9060c00160405160208183030381529060405280519060200120612250565b6115f8612297565b61162560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b906122f0565b565b61163483838360016122f7565b610718576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610bfa565b6116255f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0061161f565b5f7359afe8ae48de65d9916b99c8cf9977061955c9a790505f816001600160a01b0316632f77a1c16040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117189190612d67565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611753573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117779190612d67565b90506001600160a01b0381167352174538a83b18462c5cf898016539b086c920c7146117f4576040517fdfdb61b70000000000000000000000000000000000000000000000000000000081527352174538a83b18462c5cf898016539b086c920c760048201526001600160a01b0382166024820152604401610bfa565b5f826001600160a01b0316632c9b7f406040518163ffffffff1660e01b8152600401602060405180830381865afa158015611831573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118559190612d67565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611890573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118b49190612d67565b90506001600160a01b03811673b092f127bd44f19bfa96e78db4beaf1066d2914e14610718576040517f3e4077b300000000000000000000000000000000000000000000000000000000815273b092f127bd44f19bfa96e78db4beaf1066d2914e60048201526001600160a01b0382166024820152604401610bfa565b61193f848484846001612372565b6106c6576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610bfa565b5f808490505f816001600160a01b031663e1e6b8986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119e69190612d67565b90507f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be7005f015f876001600160a01b03166001600160a01b031681526020019081526020015f205492505f826001600160a01b031663f5d214f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a909190612dce565b90505b8515611c6e5780841115611ae5576040517f66a21a2d0000000000000000000000000000000000000000000000000000000081526001600160a01b038816600482015260248101879052604401610bfa565b6040517efdd58e000000000000000000000000000000000000000000000000000000008152306004820152602481018590525f906001600160a01b0384169062fdd58e90604401602060405180830381865afa158015611b47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b6b9190612dce565b9050805f03611b805750600190930192611a93565b5f818810611b8e5781611b90565b875b90505f856001600160a01b031663921a4c428330308b8d6040518663ffffffff1660e01b8152600401611bc7959493929190612e0d565b6020604051808303815f875af1158015611be3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c079190612dce565b9050818114611c4c576040517fbe40f1fc0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610bfa565b611c56828a612e4f565b9850828203611c66576001909601955b505050611a93565b5050506001600160a01b03939093165f9081527f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be700602052604090208390555090919050565b6001600160a01b0383165f9081527f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be70160209081526040808320843584529091529020547f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be7009060ff1615611d64576040517f59c210430000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015282356024820152604401610bfa565b6001600160a01b0384165f90815260018281016020908152604080842086358086529252909220805460ff1916909117905561092a908590611dab9088908390889061157a565b611db86020860186612e6e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123f892505050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091611e4290612ecf565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6e90612ecf565b8015611eb95780601f10611e9057610100808354040283529160200191611eb9565b820191905f5260205f20905b815481529060010190602001808311611e9c57829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10380546060917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10091611e4290612ecf565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f481c6a750000000000000000000000000000000000000000000000000000000017905290515f9182916001600160a01b03861691611f8591612f07565b5f60405180830381855afa9150503d805f8114611fbd576040519150601f19603f3d011682016040523d82523d5f602084013e611fc2565b606091505b5091509150811580611fd657508051602014155b15611fe15750505050565b5f611feb82612f1d565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe1e6b8980000000000000000000000000000000000000000000000000000000017905290519192506001600160a01b0383169161205b9190612f07565b5f60405180830381855afa9150503d805f8114612093576040519150601f19603f3d011682016040523d82523d5f602084013e612098565b606091505b5090935091508215806120ad57508151602014155b156120b9575050505050565b6001600160a01b0385166120cc83612f1d565b6001600160a01b0316146120e1575050505050565b6001600160a01b0381165f9081527f4bb94ceb743cdbfc320393e9b6fac11d883b2f90ac89bce731e459177c5be700602081905260409091205480861015610c6b576001600160a01b0383165f818152602084815260409182902089905581518481529081018990527f2008c207f65bedc2bb65dc8ac34aee36a37cd43a50152d574107c63ace7e07c6910160405180910390a250505050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061067d565b61162561250f565b6121b661250f565b6121c0828261254d565b5050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff166121c0576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260248101839052604401610bfa565b5f61067d61225c6125b0565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c15611625576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80825d5050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661236657838315161561235a573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b6040517f23b872dd000000000000000000000000000000000000000000000000000000005f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f511483166123e75783831516156123db573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b8051156124405761240a8383836125be565b610718576040517f19ab93cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f642ddf3a0000000000000000000000000000000000000000000000000000000080825260048201849052906001600160a01b0385169063642ddf3a906024016020604051808303815f875af115801561249f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124c39190612f40565b6001600160e01b03191614610718576040517f22b89c080000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610bfa565b612517612631565b611625576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61255561250f565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1007fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1026125a18482612f9f565b50600381016106c68382612f9f565b5f6125b961264f565b905090565b5f836001600160a01b03163b5f0361261c575f806125dc85856126c2565b5090925090505f8160038111156125f5576125f561305b565b1480156126135750856001600160a01b0316826001600160a01b0316145b9250505061262a565b61262784848461270b565b90505b9392505050565b5f61263a61217e565b5468010000000000000000900460ff16919050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612679612775565b61268161278a565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f805f83516041036126f9576020840151604085015160608601515f1a6126eb88828585612793565b955095509550505050612704565b505081515f91506002905b9250925092565b8051604080517f1626ba7e000000000000000000000000000000000000000000000000000000008082526004820186905260248201929092525f92906020820185604483015e60205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f61277e611df1565b80519060200120905090565b5f61277e611ec4565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156127cc57505f91506003905082612851565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561281d573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661284857505f925060019150829050612851565b92505f91508190505b9450945094915050565b6001600160e01b031981168114611407575f80fd5b5f60208284031215612880575f80fd5b813561262a8161285b565b6001600160a01b0381168114611407575f80fd5b5f80604083850312156128b0575f80fd5b82356128bb8161288b565b946020939093013593505050565b5f602082840312156128d9575f80fd5b5035919050565b5f80604083850312156128f1575f80fd5b8235915060208301356129038161288b565b809150509250929050565b5f805f8060808587031215612921575f80fd5b843561292c8161288b565b9350602085013561293c8161288b565b93969395505050506040820135916060013590565b5f805f60608486031215612963575f80fd5b833561296e8161288b565b92506020840135915060408401356129858161288b565b809150509250925092565b5f8083601f8401126129a0575f80fd5b50813567ffffffffffffffff8111156129b7575f80fd5b6020830191508360208285010111156129ce575f80fd5b9250929050565b5f805f80606085870312156129e8575f80fd5b84356129f38161288b565b935060208501359250604085013567ffffffffffffffff811115612a15575f80fd5b612a2187828801612990565b95989497509550505050565b5f805f8060808587031215612a40575f80fd5b8435612a4b8161288b565b935060208501359250604085013591506060850135612a698161288b565b939692955090935050565b5f805f805f8060a08789031215612a89575f80fd5b8635612a948161288b565b95506020870135612aa48161288b565b945060408701359350606087013567ffffffffffffffff80821115612ac7575f80fd5b908801906040828b031215612ada575f80fd5b90935060808801359080821115612aef575f80fd5b50612afc89828a01612990565b979a9699509497509295939492505050565b5f60208284031215612b1e575f80fd5b813561262a8161288b565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e06020840152612b9360e084018a612b29565b8381036040850152612ba5818a612b29565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b81811015612bf857835183529284019291840191600101612bdc565b50909c9b505050505050505050505050565b5f8083601f840112612c1a575f80fd5b50813567ffffffffffffffff811115612c31575f80fd5b6020830191508360208260051b85010111156129ce575f80fd5b5f805f805f805f8060a0898b031215612c62575f80fd5b8835612c6d8161288b565b97506020890135612c7d8161288b565b9650604089013567ffffffffffffffff80821115612c99575f80fd5b612ca58c838d01612c0a565b909850965060608b0135915080821115612cbd575f80fd5b612cc98c838d01612c0a565b909650945060808b0135915080821115612ce1575f80fd5b50612cee8b828c01612990565b999c989b5096995094979396929594505050565b5f805f805f8060a08789031215612d17575f80fd5b8635612d228161288b565b95506020870135612d328161288b565b94506040870135935060608701359250608087013567ffffffffffffffff811115612d5b575f80fd5b612afc89828a01612990565b5f60208284031215612d77575f80fd5b815161262a8161288b565b8581526001600160a01b038516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f19160101949350505050565b5f60208284031215612dde575f80fd5b5051919050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b8581525f6001600160a01b03808716602084015280861660408401525083606083015260a06080830152612e4460a0830184612b29565b979650505050505050565b8181038181111561067d57634e487b7160e01b5f52601160045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612ea1575f80fd5b83018035915067ffffffffffffffff821115612ebb575f80fd5b6020019150368190038213156129ce575f80fd5b600181811c90821680612ee357607f821691505b602082108103612f0157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f82518060208501845e5f920191825250919050565b80516020808301519190811015612f01575f1960209190910360031b1b16919050565b5f60208284031215612f50575f80fd5b815161262a8161285b565b601f82111561071857805f5260205f20601f840160051c81016020851015612f805750805b601f840160051c820191505b8181101561092a575f8155600101612f8c565b815167ffffffffffffffff811115612fb957612fb9612de5565b612fcd81612fc78454612ecf565b84612f5b565b602080601f831160018114613000575f8415612fe95750858301515b5f19600386901b1c1916600185901b178555611207565b5f85815260208120601f198616915b8281101561302e5788860151825594840194600190910190840161300f565b508582101561304b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffd"; diff --git a/src/generated/0_1_30/ST0xOrchestratorBeaconSetDeployer.pointers.sol b/src/generated/0_1_30/ST0xOrchestratorBeaconSetDeployer.pointers.sol new file mode 100644 index 00000000..64ce415e --- /dev/null +++ b/src/generated/0_1_30/ST0xOrchestratorBeaconSetDeployer.pointers.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity ^0.8.25; + +// THIS FILE IS AUTOGENERATED BY ./script/BuildPointers.sol + +// This file is committed to the repository because there is a circular +// dependency between the contract and its pointers file. The contract +// needs the pointers file to exist so that it can compile, and the pointers +// file needs the contract to exist so that it can be compiled. + +/// @dev Hash of the known bytecode. +bytes32 constant BYTECODE_HASH = bytes32(0x779b9e3b829a16736d5d29c81e925395da9ff76d7d94c3618d48bdf1bc438a60); + +/// @dev The deterministic deploy address of the contract when deployed via +/// the Zoltu factory. +address constant DEPLOYED_ADDRESS = address(0x945D0Faf6f268e805246907507ef1044e70E75D7); + +/// @dev The creation bytecode of the contract. +bytes constant CREATION_CODE = + hex"60a0604052348015600e575f80fd5b50731c3a4d12f88bd39303bb8510c6c1fa8ad37a4b72738e4bdeec7ceb9570d440676345da1dce10329f5b6040516043906083565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156072573d5f803e3d5ffd5b506001600160a01b03166080526090565b6104758061099483390190565b6080516108e66100ae5f395f81816070015261023401526108e65ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c806301ffc9a714610043578063429b15441461006b5780634c96a389146100b7575b5f80fd5b6100566100513660046102eb565b6100ca565b60405190151581526020015b60405180910390f35b6100927f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610062565b6100926100c5366004610331565b610162565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4c96a38900000000000000000000000000000000000000000000000000000000148061015c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82166101b0576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff831660248201525f9060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052519091505f907f000000000000000000000000000000000000000000000000000000000000000090839061025f906102de565b61026a929190610364565b604051809103905ff080158015610283573d5f803e3d5ffd5b5060405173ffffffffffffffffffffffffffffffffffffffff86811682529192509082169033907fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9060200160405180910390a39392505050565b61052f806103b783390190565b5f602082840312156102fb575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461032a575f80fd5b9392505050565b5f60208284031215610341575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461032a575f80fd5b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f830116840101915050939250505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056608060405234801561000f575f80fd5b5060405161047538038061047583398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b6102d88061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100a65780638da5cb5b146100ae578063f2fde38b146100be575f80fd5b80633659cfe6146100685780635c60da1b1461007d575b5f80fd5b61007b6100763660046102ab565b6100d1565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61007b6100e5565b5f546001600160a01b031661008a565b61007b6100cc3660046102ab565b6100f8565b6100d9610150565b6100e281610195565b50565b6100ed610150565b6100f65f610244565b565b610100610150565b6001600160a01b038116610147576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6100e281610244565b5f546001600160a01b031633146100f6576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161013e565b806001600160a01b03163b5f036101e3576040517f847ac5640000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161013e565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156102bb575f80fd5b81356001600160a01b03811681146102d1575f80fd5b939250505056"; + +/// @dev The runtime bytecode of the contract. +bytes constant RUNTIME_CODE = + hex"608060405234801561000f575f80fd5b506004361061003f575f3560e01c806301ffc9a714610043578063429b15441461006b5780634c96a389146100b7575b5f80fd5b6100566100513660046102eb565b6100ca565b60405190151581526020015b60405180910390f35b6100927f000000000000000000000000b9dcd744b0413dff0edc70a5b229c7aa0373461381565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610062565b6100926100c5366004610331565b610162565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4c96a38900000000000000000000000000000000000000000000000000000000148061015c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82166101b0576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff831660248201525f9060440160408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052519091505f907f000000000000000000000000b9dcd744b0413dff0edc70a5b229c7aa0373461390839061025f906102de565b61026a929190610364565b604051809103905ff080158015610283573d5f803e3d5ffd5b5060405173ffffffffffffffffffffffffffffffffffffffff86811682529192509082169033907fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9060200160405180910390a39392505050565b61052f806103b783390190565b5f602082840312156102fb575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461032a575f80fd5b9392505050565b5f60208284031215610341575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461032a575f80fd5b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f830116840101915050939250505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056"; diff --git a/src/generated/0_1_30/StoxCorporateActionsFacet.pointers.sol b/src/generated/0_1_30/StoxCorporateActionsFacet.pointers.sol new file mode 100644 index 00000000..49171b4a --- /dev/null +++ b/src/generated/0_1_30/StoxCorporateActionsFacet.pointers.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity ^0.8.25; + +// THIS FILE IS AUTOGENERATED BY ./script/BuildPointers.sol + +// This file is committed to the repository because there is a circular +// dependency between the contract and its pointers file. The contract +// needs the pointers file to exist so that it can compile, and the pointers +// file needs the contract to exist so that it can be compiled. + +/// @dev Hash of the known bytecode. +bytes32 constant BYTECODE_HASH = bytes32(0x870162e771dac7e0dfe7226bad633055130d1e28128bcfb8afe7fee1097eb055); + +/// @dev The deterministic deploy address of the contract when deployed via +/// the Zoltu factory. +address constant DEPLOYED_ADDRESS = address(0xad6219d71cCF6904C0633e3a8a8C423F54036fd1); + +/// @dev The creation bytecode of the contract. +bytes constant CREATION_CODE = + hex"60a0604052348015600e575f80fd5b503060805260805161248a6100635f395f818161018a01528181610301015281816103620152818161043201528181610488015281816104ed01528181610676015281816106cd01526107f7015261248a5ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c806379ba430511610072578063bb7bb45a11610058578063bb7bb45a14610151578063dad601be14610159578063e388df491461016c575f80fd5b806379ba43051461011e578063b21a249414610131575f80fd5b80630d1e0432146100a35780631cb5642f146100be578063358116b9146100f65780634e6c280e1461010b575b5f80fd5b6100ab61017f565b6040519081526020015b60405180910390f35b6100d16100cc366004611f59565b6102f4565b60408051938452602084019290925267ffffffffffffffff16908201526060016100b5565b610109610104366004611f83565b610358565b005b6100d1610119366004611f59565b610425565b6100d161012c366004611f9a565b61047b565b61014461013f366004611f83565b6104e1565b6040516100b59190611ffa565b6100ab61066b565b6100ab61016736600461200c565b6106c2565b6100d161017a366004611f9a565b6107ea565b5f6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101c9576040516309e815f560e01b815260040160405180910390fd5b5f6101d2610841565b905060015f6101e45f196003846108a2565b90505b5f1981146102ed57600283600201828154811061020657610206612094565b905f5260205f2090600502015f0154036102d9576102d6826102d185600201848154811061023657610236612094565b905f5260205f2090600502016004018054610250906120a8565b80601f016020809104026020016040519081016040528092919081815260200182805461027c906120a8565b80156102c75780601f1061029e576101008083540402835291602001916102c7565b820191905f5260205f20905b8154815290600101906020018083116102aa57829003601f168201915b50505050506109a9565b6109c4565b91505b6102e681600360016108a2565b90506101e7565b5091505090565b5f80806001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610340576040516309e815f560e01b815260040160405180910390fd5b61034a8585610a26565b9250925092505b9250925092565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036103a1576040516309e815f560e01b815260040160405180910390fd5b6103ed337f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e7836040516020016103d991815260200190565b604051602081830303815290604052610a54565b6103f681610b34565b604051819033907f94041431cee1a4c20be97117d396e73eb1e601e124b48fbc5dc07397c31d5f8a905f90a350565b5f80806001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610471576040516309e815f560e01b815260040160405180910390fd5b61034a8585610cc8565b5f80806001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036104c7576040516309e815f560e01b815260040160405180910390fd5b6104d2868686610cd8565b92509250925093509350939050565b60606001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361052c576040516309e815f560e01b815260040160405180910390fd5b5f610535610841565b600281015490915083106105645760405163029c6c3560e01b8152600481018490526024015b60405180910390fd5b80600201838154811061057957610579612094565b5f918252602082206001600590920201015467ffffffffffffffff1690036105b75760405163029c6c3560e01b81526004810184905260240161055b565b8060020183815481106105cc576105cc612094565b905f5260205f20906005020160040180546105e6906120a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610612906120a8565b801561065d5780601f106106345761010080835404028352916020019161065d565b820191905f5260205f20905b81548152906001019060200180831161064057829003601f168201915b50505050509150505b919050565b5f6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036106b5576040516309e815f560e01b815260040160405180910390fd5b6106bd610d06565b905090565b5f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361070c576040516309e815f560e01b815260040160405180910390fd5b610748337ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f89878787876040516020016103d994939291906120da565b5f610754868585610d5a565b90505f610797828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e0592505050565b6040805184815267ffffffffffffffff89166020820152919250829133917fa9c7784142e419f4660627c0c145b3873c2a415ce062f5c81bc19e6850f873d8910160405180910390a39695505050505050565b5f80806001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610836576040516309e815f560e01b815260040160405180910390fd5b6104d2868686610f08565b5f8060ff1961087160017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71612134565b60405160200161088391815260200190565b60408051601f1981840301815291905280516020909101201692915050565b5f6007831681036108df576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6108e8610841565b60028101549091505f03610900575f199150506109a2565b5f5f1986146109335781600201868154811061091e5761091e612094565b905f5260205f20906005020160030154610936565b81545b9050600284600281111561094c5761094c612147565b0361096e576109658261095f8484610f17565b87610f92565b925050506109a2565b600184600281111561098257610982612147565b0361099257610965828287610fea565b61099d828287610f92565b925050505b9392505050565b5f818060200190518101906109be919061215b565b92915050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610a0986868686611057565b915091505f610a188383611176565b9a9950505050505050505050565b5f805f80610a365f1987876111dc565b90505f80610a43836112d1565b939650945091925050509250925092565b5f306001600160a01b031663d09edf316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab59190612172565b6040517f59f89dda0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906359f89dda90610b0190879087908790600401612198565b5f604051808303815f87803b158015610b18575f80fd5b505af1158015610b2a573d5f803e3d5ffd5b5050505050505050565b5f610b3d610841565b60028101549091508210610b675760405163029c6c3560e01b81526004810183905260240161055b565b5f816002018381548110610b7d57610b7d612094565b5f9182526020822060016005909202019081015490925067ffffffffffffffff169003610bc05760405163029c6c3560e01b81526004810184905260240161055b565b60018101544267ffffffffffffffff90911611610c0c576040517f99fa8c690000000000000000000000000000000000000000000000000000000081526004810184905260240161055b565b600281015460038201545f198214610c4c5780846002018381548110610c3457610c34612094565b905f5260205f20906005020160030181905550610c50565b8084555b5f198114610c865781846002018281548110610c6e57610c6e612094565b905f5260205f20906005020160020181905550610c8e565b600184018290555b5f1960028401819055600384015560018301805467ffffffffffffffff191690555f808455610cc1906004850190611efd565b5050505050565b5f805f80610a365f1987876108a2565b5f805f80610ce78787876108a2565b90505f80610cf4836112d1565b939a9099509297509195505050505050565b5f610d0f610841565b600201545f03610d1e57505f90565b60065f80610d2f5f198460016108a2565b90505b5f1981146102ed5781610d44816121bf565b925050610d53818460016108a2565b9050610d32565b5f7f4548e57ae2f1604df75a3d17fecaff7dd11ad7a93d9f8a0dc05e7144f46f3f7c8403610dd057610dc8610dc384848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506109a992505050565b61132f565b5060026109a2565b6040517ff17c1d460000000000000000000000000000000000000000000000000000000081526004810185905260240161055b565b5f428367ffffffffffffffff1611610e5b576040517fc0851c8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015242602482015260440161055b565b5f610e64610841565b9050610e6f8161142f565b60028101805460019081018083555f928352610e8b9190612134565b90505f826002018281548110610ea357610ea3612094565b5f918252602090912060059091020187815560018101805467ffffffffffffffff191667ffffffffffffffff8916179055905060048101610ee48682612234565b505f19600282018190556003820155610efe8383886114c1565b5095945050505050565b5f805f80610ce78787876111dc565b5f5b5f198214158015610f5b575042836002018381548110610f3b57610f3b612094565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b15610f8c57826002018281548110610f7557610f75612094565b905f5260205f209060050201600301549150610f19565b50919050565b5f5b5f198314610fe0575f846002018481548110610fb257610fb2612094565b905f5260205f209060050201905082815f0154165f14610fd557839150506109a2565b600301549250610f94565b505f199392505050565b5f5b5f198314610fe0575f84600201848154811061100a5761100a612094565b5f918252602090912060059091020160018101549091504267ffffffffffffffff909116111561103a5750610fe0565b805483161561104c57839150506109a2565b600301549250610fec565b5f808515841517801561106f575f92505f915061116c565b61107984876122f0565b91505f6110858861160b565b90505f6110918761160b565b90505f61109e8383611634565b5090505f6f0785ee10d5da46d900f436a0000000008211156110d3576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a76400008211156110f457670de0b6b3a7640000820491506012015b633b9aca0082111561110d57633b9aca00820491506009015b61271082111561112257612710820491506004015b811561113657600a82049150600101611122565b61114081876122f0565b95506111628b8a61115c878761115787600a61240b565b611650565b89611735565b9097509550505050505b5094509492505050565b5f805f6111838585611825565b9150915080158015611193575081155b156111d4576040517f8eba4d07000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161055b565b509392505050565b5f600783168103611219576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611222610841565b60028101549091505f0361123a575f199150506109a2565b5f5f19861461126d5781600201868154811061125857611258612094565b905f5260205f20906005020160020154611273565b81600101545b9050600184600281111561128957611289612147565b036112a2576109658261129c848461192c565b876119a0565b60028460028111156112b6576112b6612147565b036112c6576109658282876119ee565b61099d8282876119a0565b5f805f1983036112e557505f928392509050565b5f6112ee610841565b600201848154811061130257611302612094565b5f91825260209091206005909102018054600190910154909567ffffffffffffffff909116945092505050565b611339815f611a5a565b15611370576040517f018d151200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61137a30611aaa565b90505f611388600183611b47565b90506113948382611b6b565b156113ce576040517f06c327120000000000000000000000000000000000000000000000000000000081526004810184905260240161055b565b5f6113e36113dd84600a612416565b5f611b47565b90506113ef8482611bba565b15611429576040517fd24a8af10000000000000000000000000000000000000000000000000000000081526004810185905260240161055b565b50505050565b60028101541561143c5750565b6002810180546001018082555f8281529190829061145c5761145c612094565b5f91825260209091206001600590920201818155908101805467ffffffffffffffff19164267ffffffffffffffff161790555f1960028201819055600382015590506114a6611c09565b5f808052600484016020526040902055505f19600590910155565b5f8360020183815481106114d7576114d7612094565b905f5260205f20906005020190505f846001015490505b5f198114610cc1578267ffffffffffffffff1685600201828154811061151657611516612094565b5f91825260209091206001600590920201015467ffffffffffffffff16116115df575f85600201828154811061154e5761154e612094565b905f5260205f2090600502016003015490508486600201838154811061157657611576612094565b5f918252602090912060036005909202018101919091556002840183905583018190555f1981146115cf57848660020182815481106115b7576115b7612094565b905f5260205f209060050201600201819055506115d7565b600186018590555b505050505050565b8460020181815481106115f4576115f4612094565b905f5260205f2090600502016002015490506114ee565b5f8082121561163057600160ff1b820361162a5750600160ff1b919050565b505f0390565b5090565b5f805f1983850993909202808410938190039390930393915050565b5f805f61165d8686611634565b91509150815f036116815783818161167757611677612317565b04925050506109a2565b8382106116cb576040517f6c59da1200000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044810185905260640161055b565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f85871812156117e3577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156117d0576117947f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001612424565b84036117a85750600160ff1b90508161181c565b6117b3600a85612437565b6117bc90612456565b6117c78460016122f0565b9150915061181c565b6117d984612456565b839150915061181c565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115611816576117bc600a85612437565b50829050815b94509492505050565b5f601b83900b8314838382611889577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561186957620186a0860595506005850194505b8586601b0b1461188457600a86059550846001019450611869565b61189f565b855f0361189f57505f9250600191506119259050565b848560030b146118fb575f8512156118bf57505f92508291506119259050565b6040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161055b565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791505b9250929050565b5f5b5f19821415801561196f57504283600201838154811061195057611950612094565b5f91825260209091206001600590920201015467ffffffffffffffff16115b15610f8c5782600201828154811061198957611989612094565b905f5260205f20906005020160020154915061192e565b5f5b5f198314610fe0575f8460020184815481106119c0576119c0612094565b905f5260205f209060050201905082815f0154165f146119e357839150506109a2565b6002015492506119a2565b5f5b5f198314610fe0575f846002018481548110611a0e57611a0e612094565b5f918252602090912060059091020160018101549091504267ffffffffffffffff90911611611a3d5750610fe0565b8054831615611a4f57839150506109a2565b6002015492506119f0565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d611a9d84848484611c76565b1215979650505050505050565b5f611ab3611d4a565b6040517f54636d2b0000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015611b23573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109be919061246a565b5f805f611b548585611df0565b91509150611b628282611e52565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d611bae84848484611c76565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d611bfd84848484611c76565b12979650505050505050565b5f8060ff19611c3960017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff612134565b604051602001611c4b91815260200190565b60408051601f198184030181529190528051602090910120611c6f91166002612424565b5492915050565b5f8085158415178187128286121817858414178015611c9b578685925092505061181c565b505f85841315611caf575092949193919260015b8386035f8112604c8213178015611ce2578215611cd4575f899450945050505061181c565b885f9450945050505061181c565b600a82900a8981028a828281611cfa57611cfa612317565b0514611d26578415611d16575f8b96509650505050505061181c565b8a5f96509650505050505061181c565b8415611d3b57889650945061181c9350505050565b955087945061181c9350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580611da1575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15611dee576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb9389600482015260240161055b565b565b5f805f805f611dff8787611ea4565b92509250925080611e46576040517fc4717966000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260440161055b565b50909590945092505050565b5f805f611e5f8585611825565b91509150806111d4576040517f22c9f7bb000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161055b565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115611eef57600a860460018201600a88065f1493509350935050610351565b859350915060019050610351565b508054611f09906120a8565b5f825580601f10611f18575050565b601f0160209004905f5260205f2090810190611f349190611f37565b50565b5b80821115611630575f8155600101611f38565b803560038110610666575f80fd5b5f8060408385031215611f6a575f80fd5b82359150611f7a60208401611f4b565b90509250929050565b5f60208284031215611f93575f80fd5b5035919050565b5f805f60608486031215611fac575f80fd5b8335925060208401359150611fc360408501611f4b565b90509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109a26020830184611fcc565b5f805f806060858703121561201f575f80fd5b84359350602085013567ffffffffffffffff808216821461203e575f80fd5b90935060408601359080821115612053575f80fd5b818701915087601f830112612066575f80fd5b813581811115612074575f80fd5b886020828501011115612085575f80fd5b95989497505060200194505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806120bc57607f821691505b602082108103610f8c57634e487b7160e01b5f52602260045260245ffd5b84815267ffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f909201601f191601019392505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156109be576109be612120565b634e487b7160e01b5f52602160045260245ffd5b5f6020828403121561216b575f80fd5b5051919050565b5f60208284031215612182575f80fd5b81516001600160a01b03811681146109a2575f80fd5b6001600160a01b0384168152826020820152606060408201525f611b626060830184611fcc565b5f5f1982036121d0576121d0612120565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b601f82111561222f57805f5260205f20601f840160051c810160208510156122105750805b601f840160051c820191505b81811015610cc1575f815560010161221c565b505050565b815167ffffffffffffffff81111561224e5761224e6121d7565b6122628161225c84546120a8565b846121eb565b602080601f831160018114612295575f841561227e5750858301515b5f19600386901b1c1916600185901b1785556115d7565b5f85815260208120601f198616915b828110156122c3578886015182559484019460019091019084016122a4565b50858210156122e057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b8082018281125f83128015821682158216171561230f5761230f612120565b505092915050565b634e487b7160e01b5f52601260045260245ffd5b600181815b8085111561236557815f190482111561234b5761234b612120565b8085161561235857918102915b93841c9390800290612330565b509250929050565b5f8261237b575060016109be565b8161238757505f6109be565b816001811461239d57600281146123a7576123c3565b60019150506109be565b60ff8411156123b8576123b8612120565b50506001821b6109be565b5060208310610133831016604e8410600b84101617156123e6575081810a6109be565b6123f0838361232b565b805f190482111561240357612403612120565b029392505050565b5f6109a2838361236d565b5f6109a260ff84168361236d565b808201808211156109be576109be612120565b5f8261245157634e487b7160e01b5f52601260045260245ffd5b500490565b5f600160ff1b820361162a5761162a612120565b5f6020828403121561247a575f80fd5b815160ff811681146109a2575f80fd"; + +/// @dev The runtime bytecode of the contract. +bytes constant RUNTIME_CODE = + hex"608060405234801561000f575f80fd5b506004361061009f575f3560e01c806379ba430511610072578063bb7bb45a11610058578063bb7bb45a14610151578063dad601be14610159578063e388df491461016c575f80fd5b806379ba43051461011e578063b21a249414610131575f80fd5b80630d1e0432146100a35780631cb5642f146100be578063358116b9146100f65780634e6c280e1461010b575b5f80fd5b6100ab61017f565b6040519081526020015b60405180910390f35b6100d16100cc366004611f59565b6102f4565b60408051938452602084019290925267ffffffffffffffff16908201526060016100b5565b610109610104366004611f83565b610358565b005b6100d1610119366004611f59565b610425565b6100d161012c366004611f9a565b61047b565b61014461013f366004611f83565b6104e1565b6040516100b59190611ffa565b6100ab61066b565b6100ab61016736600461200c565b6106c2565b6100d161017a366004611f9a565b6107ea565b5f6001600160a01b037f000000000000000000000000ad6219d71ccf6904c0633e3a8a8c423f54036fd11630036101c9576040516309e815f560e01b815260040160405180910390fd5b5f6101d2610841565b905060015f6101e45f196003846108a2565b90505b5f1981146102ed57600283600201828154811061020657610206612094565b905f5260205f2090600502015f0154036102d9576102d6826102d185600201848154811061023657610236612094565b905f5260205f2090600502016004018054610250906120a8565b80601f016020809104026020016040519081016040528092919081815260200182805461027c906120a8565b80156102c75780601f1061029e576101008083540402835291602001916102c7565b820191905f5260205f20905b8154815290600101906020018083116102aa57829003601f168201915b50505050506109a9565b6109c4565b91505b6102e681600360016108a2565b90506101e7565b5091505090565b5f80806001600160a01b037f000000000000000000000000ad6219d71ccf6904c0633e3a8a8c423f54036fd1163003610340576040516309e815f560e01b815260040160405180910390fd5b61034a8585610a26565b9250925092505b9250925092565b6001600160a01b037f000000000000000000000000ad6219d71ccf6904c0633e3a8a8c423f54036fd11630036103a1576040516309e815f560e01b815260040160405180910390fd5b6103ed337f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e7836040516020016103d991815260200190565b604051602081830303815290604052610a54565b6103f681610b34565b604051819033907f94041431cee1a4c20be97117d396e73eb1e601e124b48fbc5dc07397c31d5f8a905f90a350565b5f80806001600160a01b037f000000000000000000000000ad6219d71ccf6904c0633e3a8a8c423f54036fd1163003610471576040516309e815f560e01b815260040160405180910390fd5b61034a8585610cc8565b5f80806001600160a01b037f000000000000000000000000ad6219d71ccf6904c0633e3a8a8c423f54036fd11630036104c7576040516309e815f560e01b815260040160405180910390fd5b6104d2868686610cd8565b92509250925093509350939050565b60606001600160a01b037f000000000000000000000000ad6219d71ccf6904c0633e3a8a8c423f54036fd116300361052c576040516309e815f560e01b815260040160405180910390fd5b5f610535610841565b600281015490915083106105645760405163029c6c3560e01b8152600481018490526024015b60405180910390fd5b80600201838154811061057957610579612094565b5f918252602082206001600590920201015467ffffffffffffffff1690036105b75760405163029c6c3560e01b81526004810184905260240161055b565b8060020183815481106105cc576105cc612094565b905f5260205f20906005020160040180546105e6906120a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610612906120a8565b801561065d5780601f106106345761010080835404028352916020019161065d565b820191905f5260205f20905b81548152906001019060200180831161064057829003601f168201915b50505050509150505b919050565b5f6001600160a01b037f000000000000000000000000ad6219d71ccf6904c0633e3a8a8c423f54036fd11630036106b5576040516309e815f560e01b815260040160405180910390fd5b6106bd610d06565b905090565b5f6001600160a01b037f000000000000000000000000ad6219d71ccf6904c0633e3a8a8c423f54036fd116300361070c576040516309e815f560e01b815260040160405180910390fd5b610748337ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f89878787876040516020016103d994939291906120da565b5f610754868585610d5a565b90505f610797828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e0592505050565b6040805184815267ffffffffffffffff89166020820152919250829133917fa9c7784142e419f4660627c0c145b3873c2a415ce062f5c81bc19e6850f873d8910160405180910390a39695505050505050565b5f80806001600160a01b037f000000000000000000000000ad6219d71ccf6904c0633e3a8a8c423f54036fd1163003610836576040516309e815f560e01b815260040160405180910390fd5b6104d2868686610f08565b5f8060ff1961087160017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71612134565b60405160200161088391815260200190565b60408051601f1981840301815291905280516020909101201692915050565b5f6007831681036108df576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6108e8610841565b60028101549091505f03610900575f199150506109a2565b5f5f1986146109335781600201868154811061091e5761091e612094565b905f5260205f20906005020160030154610936565b81545b9050600284600281111561094c5761094c612147565b0361096e576109658261095f8484610f17565b87610f92565b925050506109a2565b600184600281111561098257610982612147565b0361099257610965828287610fea565b61099d828287610f92565b925050505b9392505050565b5f818060200190518101906109be919061215b565b92915050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610a0986868686611057565b915091505f610a188383611176565b9a9950505050505050505050565b5f805f80610a365f1987876111dc565b90505f80610a43836112d1565b939650945091925050509250925092565b5f306001600160a01b031663d09edf316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab59190612172565b6040517f59f89dda0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906359f89dda90610b0190879087908790600401612198565b5f604051808303815f87803b158015610b18575f80fd5b505af1158015610b2a573d5f803e3d5ffd5b5050505050505050565b5f610b3d610841565b60028101549091508210610b675760405163029c6c3560e01b81526004810183905260240161055b565b5f816002018381548110610b7d57610b7d612094565b5f9182526020822060016005909202019081015490925067ffffffffffffffff169003610bc05760405163029c6c3560e01b81526004810184905260240161055b565b60018101544267ffffffffffffffff90911611610c0c576040517f99fa8c690000000000000000000000000000000000000000000000000000000081526004810184905260240161055b565b600281015460038201545f198214610c4c5780846002018381548110610c3457610c34612094565b905f5260205f20906005020160030181905550610c50565b8084555b5f198114610c865781846002018281548110610c6e57610c6e612094565b905f5260205f20906005020160020181905550610c8e565b600184018290555b5f1960028401819055600384015560018301805467ffffffffffffffff191690555f808455610cc1906004850190611efd565b5050505050565b5f805f80610a365f1987876108a2565b5f805f80610ce78787876108a2565b90505f80610cf4836112d1565b939a9099509297509195505050505050565b5f610d0f610841565b600201545f03610d1e57505f90565b60065f80610d2f5f198460016108a2565b90505b5f1981146102ed5781610d44816121bf565b925050610d53818460016108a2565b9050610d32565b5f7f4548e57ae2f1604df75a3d17fecaff7dd11ad7a93d9f8a0dc05e7144f46f3f7c8403610dd057610dc8610dc384848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506109a992505050565b61132f565b5060026109a2565b6040517ff17c1d460000000000000000000000000000000000000000000000000000000081526004810185905260240161055b565b5f428367ffffffffffffffff1611610e5b576040517fc0851c8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015242602482015260440161055b565b5f610e64610841565b9050610e6f8161142f565b60028101805460019081018083555f928352610e8b9190612134565b90505f826002018281548110610ea357610ea3612094565b5f918252602090912060059091020187815560018101805467ffffffffffffffff191667ffffffffffffffff8916179055905060048101610ee48682612234565b505f19600282018190556003820155610efe8383886114c1565b5095945050505050565b5f805f80610ce78787876111dc565b5f5b5f198214158015610f5b575042836002018381548110610f3b57610f3b612094565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b15610f8c57826002018281548110610f7557610f75612094565b905f5260205f209060050201600301549150610f19565b50919050565b5f5b5f198314610fe0575f846002018481548110610fb257610fb2612094565b905f5260205f209060050201905082815f0154165f14610fd557839150506109a2565b600301549250610f94565b505f199392505050565b5f5b5f198314610fe0575f84600201848154811061100a5761100a612094565b5f918252602090912060059091020160018101549091504267ffffffffffffffff909116111561103a5750610fe0565b805483161561104c57839150506109a2565b600301549250610fec565b5f808515841517801561106f575f92505f915061116c565b61107984876122f0565b91505f6110858861160b565b90505f6110918761160b565b90505f61109e8383611634565b5090505f6f0785ee10d5da46d900f436a0000000008211156110d3576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a76400008211156110f457670de0b6b3a7640000820491506012015b633b9aca0082111561110d57633b9aca00820491506009015b61271082111561112257612710820491506004015b811561113657600a82049150600101611122565b61114081876122f0565b95506111628b8a61115c878761115787600a61240b565b611650565b89611735565b9097509550505050505b5094509492505050565b5f805f6111838585611825565b9150915080158015611193575081155b156111d4576040517f8eba4d07000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161055b565b509392505050565b5f600783168103611219576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611222610841565b60028101549091505f0361123a575f199150506109a2565b5f5f19861461126d5781600201868154811061125857611258612094565b905f5260205f20906005020160020154611273565b81600101545b9050600184600281111561128957611289612147565b036112a2576109658261129c848461192c565b876119a0565b60028460028111156112b6576112b6612147565b036112c6576109658282876119ee565b61099d8282876119a0565b5f805f1983036112e557505f928392509050565b5f6112ee610841565b600201848154811061130257611302612094565b5f91825260209091206005909102018054600190910154909567ffffffffffffffff909116945092505050565b611339815f611a5a565b15611370576040517f018d151200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61137a30611aaa565b90505f611388600183611b47565b90506113948382611b6b565b156113ce576040517f06c327120000000000000000000000000000000000000000000000000000000081526004810184905260240161055b565b5f6113e36113dd84600a612416565b5f611b47565b90506113ef8482611bba565b15611429576040517fd24a8af10000000000000000000000000000000000000000000000000000000081526004810185905260240161055b565b50505050565b60028101541561143c5750565b6002810180546001018082555f8281529190829061145c5761145c612094565b5f91825260209091206001600590920201818155908101805467ffffffffffffffff19164267ffffffffffffffff161790555f1960028201819055600382015590506114a6611c09565b5f808052600484016020526040902055505f19600590910155565b5f8360020183815481106114d7576114d7612094565b905f5260205f20906005020190505f846001015490505b5f198114610cc1578267ffffffffffffffff1685600201828154811061151657611516612094565b5f91825260209091206001600590920201015467ffffffffffffffff16116115df575f85600201828154811061154e5761154e612094565b905f5260205f2090600502016003015490508486600201838154811061157657611576612094565b5f918252602090912060036005909202018101919091556002840183905583018190555f1981146115cf57848660020182815481106115b7576115b7612094565b905f5260205f209060050201600201819055506115d7565b600186018590555b505050505050565b8460020181815481106115f4576115f4612094565b905f5260205f2090600502016002015490506114ee565b5f8082121561163057600160ff1b820361162a5750600160ff1b919050565b505f0390565b5090565b5f805f1983850993909202808410938190039390930393915050565b5f805f61165d8686611634565b91509150815f036116815783818161167757611677612317565b04925050506109a2565b8382106116cb576040517f6c59da1200000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044810185905260640161055b565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f85871812156117e3577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156117d0576117947f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001612424565b84036117a85750600160ff1b90508161181c565b6117b3600a85612437565b6117bc90612456565b6117c78460016122f0565b9150915061181c565b6117d984612456565b839150915061181c565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115611816576117bc600a85612437565b50829050815b94509492505050565b5f601b83900b8314838382611889577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561186957620186a0860595506005850194505b8586601b0b1461188457600a86059550846001019450611869565b61189f565b855f0361189f57505f9250600191506119259050565b848560030b146118fb575f8512156118bf57505f92508291506119259050565b6040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161055b565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791505b9250929050565b5f5b5f19821415801561196f57504283600201838154811061195057611950612094565b5f91825260209091206001600590920201015467ffffffffffffffff16115b15610f8c5782600201828154811061198957611989612094565b905f5260205f20906005020160020154915061192e565b5f5b5f198314610fe0575f8460020184815481106119c0576119c0612094565b905f5260205f209060050201905082815f0154165f146119e357839150506109a2565b6002015492506119a2565b5f5b5f198314610fe0575f846002018481548110611a0e57611a0e612094565b5f918252602090912060059091020160018101549091504267ffffffffffffffff90911611611a3d5750610fe0565b8054831615611a4f57839150506109a2565b6002015492506119f0565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d611a9d84848484611c76565b1215979650505050505050565b5f611ab3611d4a565b6040517f54636d2b0000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015611b23573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109be919061246a565b5f805f611b548585611df0565b91509150611b628282611e52565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d611bae84848484611c76565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d611bfd84848484611c76565b12979650505050505050565b5f8060ff19611c3960017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff612134565b604051602001611c4b91815260200190565b60408051601f198184030181529190528051602090910120611c6f91166002612424565b5492915050565b5f8085158415178187128286121817858414178015611c9b578685925092505061181c565b505f85841315611caf575092949193919260015b8386035f8112604c8213178015611ce2578215611cd4575f899450945050505061181c565b885f9450945050505061181c565b600a82900a8981028a828281611cfa57611cfa612317565b0514611d26578415611d16575f8b96509650505050505061181c565b8a5f96509650505050505061181c565b8415611d3b57889650945061181c9350505050565b955087945061181c9350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580611da1575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15611dee576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb9389600482015260240161055b565b565b5f805f805f611dff8787611ea4565b92509250925080611e46576040517fc4717966000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260440161055b565b50909590945092505050565b5f805f611e5f8585611825565b91509150806111d4576040517f22c9f7bb000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161055b565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115611eef57600a860460018201600a88065f1493509350935050610351565b859350915060019050610351565b508054611f09906120a8565b5f825580601f10611f18575050565b601f0160209004905f5260205f2090810190611f349190611f37565b50565b5b80821115611630575f8155600101611f38565b803560038110610666575f80fd5b5f8060408385031215611f6a575f80fd5b82359150611f7a60208401611f4b565b90509250929050565b5f60208284031215611f93575f80fd5b5035919050565b5f805f60608486031215611fac575f80fd5b8335925060208401359150611fc360408501611f4b565b90509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6109a26020830184611fcc565b5f805f806060858703121561201f575f80fd5b84359350602085013567ffffffffffffffff808216821461203e575f80fd5b90935060408601359080821115612053575f80fd5b818701915087601f830112612066575f80fd5b813581811115612074575f80fd5b886020828501011115612085575f80fd5b95989497505060200194505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806120bc57607f821691505b602082108103610f8c57634e487b7160e01b5f52602260045260245ffd5b84815267ffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f909201601f191601019392505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156109be576109be612120565b634e487b7160e01b5f52602160045260245ffd5b5f6020828403121561216b575f80fd5b5051919050565b5f60208284031215612182575f80fd5b81516001600160a01b03811681146109a2575f80fd5b6001600160a01b0384168152826020820152606060408201525f611b626060830184611fcc565b5f5f1982036121d0576121d0612120565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b601f82111561222f57805f5260205f20601f840160051c810160208510156122105750805b601f840160051c820191505b81811015610cc1575f815560010161221c565b505050565b815167ffffffffffffffff81111561224e5761224e6121d7565b6122628161225c84546120a8565b846121eb565b602080601f831160018114612295575f841561227e5750858301515b5f19600386901b1c1916600185901b1785556115d7565b5f85815260208120601f198616915b828110156122c3578886015182559484019460019091019084016122a4565b50858210156122e057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b8082018281125f83128015821682158216171561230f5761230f612120565b505092915050565b634e487b7160e01b5f52601260045260245ffd5b600181815b8085111561236557815f190482111561234b5761234b612120565b8085161561235857918102915b93841c9390800290612330565b509250929050565b5f8261237b575060016109be565b8161238757505f6109be565b816001811461239d57600281146123a7576123c3565b60019150506109be565b60ff8411156123b8576123b8612120565b50506001821b6109be565b5060208310610133831016604e8410600b84101617156123e6575081810a6109be565b6123f0838361232b565b805f190482111561240357612403612120565b029392505050565b5f6109a2838361236d565b5f6109a260ff84168361236d565b808201808211156109be576109be612120565b5f8261245157634e487b7160e01b5f52601260045260245ffd5b500490565b5f600160ff1b820361162a5761162a612120565b5f6020828403121561247a575f80fd5b815160ff811681146109a2575f80fd"; diff --git a/src/generated/0_1_30/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol b/src/generated/0_1_30/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol new file mode 100644 index 00000000..beb01ba4 --- /dev/null +++ b/src/generated/0_1_30/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity ^0.8.25; + +// THIS FILE IS AUTOGENERATED BY ./script/BuildPointers.sol + +// This file is committed to the repository because there is a circular +// dependency between the contract and its pointers file. The contract +// needs the pointers file to exist so that it can compile, and the pointers +// file needs the contract to exist so that it can be compiled. + +/// @dev Hash of the known bytecode. +bytes32 constant BYTECODE_HASH = bytes32(0x6b2699420a64c92fc4f8a027a5769d0a27291e4489eaeb0e185cb660bf49d42f); + +/// @dev The deterministic deploy address of the contract when deployed via +/// the Zoltu factory. +address constant DEPLOYED_ADDRESS = address(0x59aFE8ae48De65D9916b99C8CF9977061955C9A7); + +/// @dev The creation bytecode of the contract. +bytes constant CREATION_CODE = + hex"60c060405234801561000f575f80fd5b5060408051606081018252738e4bdeec7ceb9570d440676345da1dce10329f5b80825273b092f127bd44f19bfa96e78db4beaf1066d2914e602083018190527352174538a83b18462c5cf898016539b086c920c78385015292519192916100759061010b565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156100a5573d5f803e3d5ffd5b506001600160a01b0316608052604080820151825191519091906100c89061010b565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156100f8573d5f803e3d5ffd5b506001600160a01b031660a05250610118565b61047580610ef283390190565b60805160a051610dad6101455f395f818160ba015261029701525f8181607b015261022f0152610dad5ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301ffc9a71461004e5780632c9b7f40146100765780632f77a1c1146100b55780634904fab3146100dc575b5f80fd5b61006161005c366004610541565b6100ef565b60405190151581526020015b60405180910390f35b61009d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161006d565b61009d7f000000000000000000000000000000000000000000000000000000000000000081565b61009d6100ea3660046106a4565b610187565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4ae8243200000000000000000000000000000000000000000000000000000000148061018157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6020810151606001515f906001600160a01b0316156101eb576020820151606001516040517ffc47d9760000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240160405180910390fd5b81516001600160a01b031661022c576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000060405161025a90610534565b6001600160a01b0390911681526040602082018190525f90820152606001604051809103905ff080158015610291573d5f803e3d5ffd5b5090505f7f00000000000000000000000000000000000000000000000000000000000000006040516102c290610534565b6001600160a01b0390911681526040602082018190525f90820152606001604051809103905ff0801580156102f9573d5f803e3d5ffd5b50604080516001600160a01b0380841660208301529293507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39285169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b815260040161036891906107bc565b6020604051808303815f875af1158015610384573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906107ce565b146103df576040517f0219069c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818460200151606001906001600160a01b031690816001600160a01b0316815250507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3816001600160a01b031663439fab918660405160200161044291906107e5565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161046d91906107bc565b6020604051808303815f875af1158015610489573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ad91906107ce565b146104e4576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513381526001600160a01b03838116602083015284168183015290517fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9181900360600190a19392505050565b61052f8061087e83390190565b5f60208284031215610551575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610580575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156105d7576105d7610587565b60405290565b6040516080810167ffffffffffffffff811182821017156105d7576105d7610587565b80356001600160a01b0381168114610616575f80fd5b919050565b5f82601f83011261062a575f80fd5b813567ffffffffffffffff8082111561064557610645610587565b604051601f8301601f19908116603f0116810190828211818310171561066d5761066d610587565b81604052838152866020858801011115610685575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f602082840312156106b4575f80fd5b813567ffffffffffffffff808211156106cb575f80fd5b90830190604082860312156106de575f80fd5b6106e66105b4565b6106ef83610600565b8152602083013582811115610702575f80fd5b929092019160808387031215610716575f80fd5b61071e6105dd565b61072784610600565b815260208401358381111561073a575f80fd5b6107468882870161061b565b60208301525060408401358381111561075d575f80fd5b6107698882870161061b565b60408301525061077b60608501610600565b6060820152602082015295945050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610580602083018461078e565b5f602082840312156107de575f80fd5b5051919050565b602081525f6001600160a01b038084511660208401526020840151604080850152818151166060850152602081015160808086015261082760e086018261078e565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a0870152610862828261078e565b9150508260608301511660c08601528093505050509291505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056608060405234801561000f575f80fd5b5060405161047538038061047583398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b6102d88061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100a65780638da5cb5b146100ae578063f2fde38b146100be575f80fd5b80633659cfe6146100685780635c60da1b1461007d575b5f80fd5b61007b6100763660046102ab565b6100d1565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61007b6100e5565b5f546001600160a01b031661008a565b61007b6100cc3660046102ab565b6100f8565b6100d9610150565b6100e281610195565b50565b6100ed610150565b6100f65f610244565b565b610100610150565b6001600160a01b038116610147576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6100e281610244565b5f546001600160a01b031633146100f6576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161013e565b806001600160a01b03163b5f036101e3576040517f847ac5640000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161013e565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156102bb575f80fd5b81356001600160a01b03811681146102d1575f80fd5b939250505056"; + +/// @dev The runtime bytecode of the contract. +bytes constant RUNTIME_CODE = + hex"608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301ffc9a71461004e5780632c9b7f40146100765780632f77a1c1146100b55780634904fab3146100dc575b5f80fd5b61006161005c366004610541565b6100ef565b60405190151581526020015b60405180910390f35b61009d7f0000000000000000000000006dc55094e45f3556d4ea4e1c68990efddfdf9c3e81565b6040516001600160a01b03909116815260200161006d565b61009d7f0000000000000000000000009a731918ec03a2464958b992f469ae7f911a0b7481565b61009d6100ea3660046106a4565b610187565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4ae8243200000000000000000000000000000000000000000000000000000000148061018157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6020810151606001515f906001600160a01b0316156101eb576020820151606001516040517ffc47d9760000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260240160405180910390fd5b81516001600160a01b031661022c576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f0000000000000000000000006dc55094e45f3556d4ea4e1c68990efddfdf9c3e60405161025a90610534565b6001600160a01b0390911681526040602082018190525f90820152606001604051809103905ff080158015610291573d5f803e3d5ffd5b5090505f7f0000000000000000000000009a731918ec03a2464958b992f469ae7f911a0b746040516102c290610534565b6001600160a01b0390911681526040602082018190525f90820152606001604051809103905ff0801580156102f9573d5f803e3d5ffd5b50604080516001600160a01b0380841660208301529293507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39285169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b815260040161036891906107bc565b6020604051808303815f875af1158015610384573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a891906107ce565b146103df576040517f0219069c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818460200151606001906001600160a01b031690816001600160a01b0316815250507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3816001600160a01b031663439fab918660405160200161044291906107e5565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161046d91906107bc565b6020604051808303815f875af1158015610489573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ad91906107ce565b146104e4576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513381526001600160a01b03838116602083015284168183015290517fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9181900360600190a19392505050565b61052f8061087e83390190565b5f60208284031215610551575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610580575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156105d7576105d7610587565b60405290565b6040516080810167ffffffffffffffff811182821017156105d7576105d7610587565b80356001600160a01b0381168114610616575f80fd5b919050565b5f82601f83011261062a575f80fd5b813567ffffffffffffffff8082111561064557610645610587565b604051601f8301601f19908116603f0116810190828211818310171561066d5761066d610587565b81604052838152866020858801011115610685575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f602082840312156106b4575f80fd5b813567ffffffffffffffff808211156106cb575f80fd5b90830190604082860312156106de575f80fd5b6106e66105b4565b6106ef83610600565b8152602083013582811115610702575f80fd5b929092019160808387031215610716575f80fd5b61071e6105dd565b61072784610600565b815260208401358381111561073a575f80fd5b6107468882870161061b565b60208301525060408401358381111561075d575f80fd5b6107698882870161061b565b60408301525061077b60608501610600565b6060820152602082015295945050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610580602083018461078e565b5f602082840312156107de575f80fd5b5051919050565b602081525f6001600160a01b038084511660208401526020840151604080850152818151166060850152602081015160808086015261082760e086018261078e565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a0870152610862828261078e565b9150508260608301511660c08601528093505050509291505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056"; diff --git a/src/generated/0_1_30/StoxReceipt.pointers.sol b/src/generated/0_1_30/StoxReceipt.pointers.sol new file mode 100644 index 00000000..0c73b09e --- /dev/null +++ b/src/generated/0_1_30/StoxReceipt.pointers.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity ^0.8.25; + +// THIS FILE IS AUTOGENERATED BY ./script/BuildPointers.sol + +// This file is committed to the repository because there is a circular +// dependency between the contract and its pointers file. The contract +// needs the pointers file to exist so that it can compile, and the pointers +// file needs the contract to exist so that it can be compiled. + +/// @dev Hash of the known bytecode. +bytes32 constant BYTECODE_HASH = bytes32(0xba9e672e00e89c68294ae67b2d99a80f7509a6b10da809bf84b5c2e578579862); + +/// @dev The deterministic deploy address of the contract when deployed via +/// the Zoltu factory. +address constant DEPLOYED_ADDRESS = address(0xB092f127Bd44F19BFa96e78dB4BeaF1066D2914E); + +/// @dev The creation bytecode of the contract. +bytes constant CREATION_CODE = + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613518806100d65f395ff3fe608060405234801561000f575f80fd5b50600436106100fa575f3560e01c8063481c6a7511610093578063a22cb46511610063578063a22cb46514610232578063c2530e3914610245578063e985e9c514610258578063f242432a146102b2575f80fd5b8063481c6a75146101bd5780634e1273f4146101f75780636d5b3f781461021757806395d89b411461022a575f80fd5b80630e89341c116100ce5780630e89341c14610171578063177769cb146101845780632eb2c2d614610197578063439fab91146101aa575f80fd5b8062fdd58e146100fe57806301ffc9a714610124578063043fa9871461014757806306fdde031461015c575b5f80fd5b61011161010c36600461289a565b6102c5565b6040519081526020015b60405180910390f35b6101376101323660046128f1565b6102e1565b604051901515815260200161011b565b61015a6101553660046129ca565b6103c3565b005b61016461046a565b60405161011b9190612a7a565b61016461017f366004612a8c565b6104cf565b61015a610192366004612aa3565b610580565b61015a6101a5366004612b71565b61058f565b6101116101b8366004612c18565b6105ae565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200546040516001600160a01b03909116815260200161011b565b61020a610205366004612c52565b610782565b60405161011b9190612d3e565b61015a610225366004612d50565b610899565b610164610949565b61015a610240366004612db4565b61099a565b61015a610253366004612d50565b6109a5565b610137610266366004612def565b6001600160a01b039182165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45016020908152604080832093909416825291909152205460ff1690565b61015a6102c0366004612d50565b610a0b565b5f6102d883836102d3610a21565b610a87565b90505b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061037357507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806102db57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102db565b6103cb610adb565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038816179055856104208686868686610b42565b6104617fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19169055565b50505050505050565b6060610474610bc6565b6040518060400160405280600881526020017f20526563656970740000000000000000000000000000000000000000000000008152506040516020016104bb929190612e32565b604051602081830303815290604052905090565b60605f6104e56104dd610c74565b60ff16610d19565b6104ed610bc6565b6104f5610db6565b6104fd61046a565b6040516020016105109493929190612e46565b60408051601f19818403018152828201909152601d82527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020830152915061055882610e96565b604051602001610569929190612e32565b604051602081830303815290604052915050919050565b61058b338383610ea2565b5050565b61059a335b86610eea565b6105a78585858585610f9a565b5050505050565b5f806105b8610ffa565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156105e45750825b90505f8267ffffffffffffffff1660011480156106005750303b155b90508115801561060e575080155b15610645576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001178555831561069057845468ff00000000000000001916680100000000000000001785555b6106a760405180602001604052805f815250611022565b5f7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20090505f888060200190518101906106e09190612f88565b825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039190911617909155507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39550831561077857845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b606081518351146107d157815183516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f6107da610a21565b90505f845167ffffffffffffffff8111156107f7576107f761290c565b604051908082528060200260200182016040528015610820578160200160208202803683370190505b5090505f5b85518110156108905761086b86828151811061084357610843612fa3565b602002602001015186838151811061085d5761085d612fa3565b602002602001015185610a87565b82828151811061087d5761087d612fa3565b6020908102919091010152600101610825565b50949350505050565b6108a1610adb565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038716179055846108f4868584610ea2565b61090085858585611033565b6109417fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19169055565b505050505050565b6060610953610bc6565b6040518060400160405280600581526020017f20524350540000000000000000000000000000000000000000000000000000008152506040516020016104bb929190612e32565b61058b33838361108f565b6109ad610adb565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03871617905584610a00868584610ea2565b6109008585856111a3565b610a1433610594565b6105a78585858585610b42565b5f306001600160a01b031663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a829190612f88565b905090565b5f80610a93858561120a565b90505f610a9e61121f565b6001600160a01b0387165f90815260209182526040808220888352909252908120549150610acd838387611280565b5093505050505b9392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20080546001600160a01b03163314610b3f576040517fc0b2335a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6001600160a01b038416610b6b57604051632bfa23e760e11b81525f60048201526024016107c8565b6001600160a01b038516610b9357604051626a0d4560e21b81525f60048201526024016107c8565b6040805160018082526020820186905281830190815260608201859052608082019092529061046187878484875f6114dd565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f95d89b410000000000000000000000000000000000000000000000000000000081529051606093926001600160a01b0316916395d89b41916004808301925f9291908290030181865afa158015610c47573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c6e9190810190612fed565b91505090565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f93926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015610cf5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6e9190613032565b60605f610d2583611535565b60010190505f8167ffffffffffffffff811115610d4457610d4461290c565b6040519080825280601f01601f191660200182016040528015610d6e576020820181803683370190505b5090508181016020015b5f19017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610d7857509392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f38d52e0f0000000000000000000000000000000000000000000000000000000081529051606093926001600160a01b0316916338d52e0f9160048083019260209291908290030181865afa158015610e38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5c9190612f88565b6001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610c47573d5f803e3d5ffd5b60606102db825f611616565b805115610ee5577fd66d6a9810a5cef78b704e7e04334961e997c81d337f029f74637f060f3d8d65838383604051610edc93929190613066565b60405180910390a15b505050565b816001600160a01b0316816001600160a01b031614158015610f5057506001600160a01b038082165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209386168352929052205460ff16155b1561058b576040517fe237d9220000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152821660248201526044016107c8565b6001600160a01b038416610fc357604051632bfa23e760e11b81525f60048201526024016107c8565b6001600160a01b038516610feb57604051626a0d4560e21b81525f60048201526024016107c8565b6105a7858585858560016114dd565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102db565b61102a611795565b610b3f816117d5565b6001600160a01b03841661105c57604051632bfa23e760e11b81525f60048201526024016107c8565b604080516001808252602082018690528183019081526060820185905260808201909252906109415f87848487846114dd565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45006001600160a01b0384166110f2576040517f3e31884e0000000000000000000000000000000000000000000000000000000081525f60048201526024016107c8565b6001600160a01b038316611134576040517fced3e1000000000000000000000000000000000000000000000000000000000081525f60048201526024016107c8565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b6001600160a01b0383166111cb57604051626a0d4560e21b81525f60048201526024016107c8565b604080516001808252602082018590528183019081526060820184905260a082019092525f608082018181529192916105a791879185908590836114dd565b5f8061121684846117e6565b54949350505050565b5f8060ff1961124f60017fedb99b3af8e1c50d494d6f1b4c75245a0b733cb90baa42bfe0e2f5bc8b000f826130aa565b60405160200161126191815260200190565b60408051601f1981840301815291905280516020909101201692915050565b6040516379ba430560e01b81525f9081908490829081906001600160a01b038716906379ba4305906112bc9086906003906001906004016130bd565b606060405180830381865afa1580156112d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112fb91906130f5565b5091509150875f0361139f575b5f198214611391576040516379ba430560e01b815291925082916001600160a01b038716906379ba4305906113479085906003906001906004016130bd565b606060405180830381865afa158015611362573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061138691906130f5565b509092509050611308565b5f83945094505050506114d5565b875b5f1983146114cd5782935060028203611451576040517fb21a2494000000000000000000000000000000000000000000000000000000008152600481018490525f90611441906001600160a01b038a169063b21a2494906024015f60405180830381865afa158015611415573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261143c9190810190612fed565b61185a565b905061144d828261186f565b9150505b6040516379ba430560e01b81526001600160a01b038816906379ba4305906114839086906003906001906004016130bd565b606060405180830381865afa15801561149e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c291906130f5565b5090935091506113a1565b945091925050505b935093915050565b6114e9868686866118ea565b6001600160a01b03851615610941573381156115125761150d81888888888861194f565b610461565b6020858101519085015161152a838a8a85858a611aba565b505050505050505050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061157d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106115a9576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106115c757662386f26fc10000830492506010015b6305f5e10083106115df576305f5e100830492506008015b61271083106115f357612710830492506004015b60648310611605576064830492506002015b600a83106102db5760010192915050565b606082515f03611634575060408051602081019091525f81526102db565b5f826116645760038451600261164a9190613137565b611654919061314a565b61165f906004613169565b611689565b6003845160046116749190613169565b61167f906002613137565b611689919061314a565b905060405191507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f5261067083027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f18603f526020820181810185865187016020810180515f82525b82841015611747576003840193508351603f8160121c16518753600187019650603f81600c1c16518753600187019650603f8160061c16518753600187019650603f8116518753506001860195506116f4565b9052508590506117885760038651066001811461176b576002811461177e57611786565b603d6001840353603d6002840353611786565b603d60018403535b505b9183525060405292915050565b61179d611beb565b6117d3576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6117dd611795565b610b3f81611c09565b5f8060ff1961181660017f3a8e79826d53842322cdcc810d4a989eb01ac46cfabfd48dcc021625ce13c2d76130aa565b60405160200161182891815260200190565b60408051808303601f1901815291815281516020928301205f9687529290921681528185209585529490945250502090565b5f818060200190518101906102db9190613180565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156118cd576040517fbf463fe9000000000000000000000000000000000000000000000000000000008152600481018490526024016107c8565b5f6108906118e46118de865f611c55565b85611caf565b5f611d11565b5f6118f3610a21565b90505f5b8351811015611942576119248685838151811061191657611916612fa3565b602002602001015184611d53565b61193a8585838151811061191657611916612fa3565b6001016118f7565b506105a785858585611e55565b6001600160a01b0384163b15610941576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c81906119ac9089908990889088908890600401613197565b6020604051808303815f875af19250505080156119e6575060408051601f3d908101601f191682019092526119e3918101906131f4565b60015b611a4d573d808015611a13576040519150601f19603f3d011682016040523d82523d5f602084013e611a18565b606091505b5080515f03611a4557604051632bfa23e760e11b81526001600160a01b03861660048201526024016107c8565b805160208201fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461046157604051632bfa23e760e11b81526001600160a01b03861660048201526024016107c8565b6001600160a01b0384163b15610941576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e6190611b17908990899088908890889060040161320f565b6020604051808303815f875af1925050508015611b51575060408051601f3d908101601f19168201909252611b4e918101906131f4565b60015b611b7e573d808015611a13576040519150601f19603f3d011682016040523d82523d5f602084013e611a18565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461046157604051632bfa23e760e11b81526001600160a01b03861660048201526024016107c8565b5f611bf4610ffa565b5468010000000000000000900460ff16919050565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45007f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4502610ee583826132cd565b5f805f611c628585611f08565b9150915080611ca7576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016107c8565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480611cf48686868661200e565b915091505f611d03838361212d565b9a9950505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d611d4582828761218b565b9350935050505b9250929050565b6001600160a01b038316611d6657505050565b5f611d6f61121f565b6001600160a01b0385165f90815260208281526040808320878452909152812054919250611d9d868661120a565b90505f80611dac838588611280565b91509150838103611dc1575050505050505050565b6001600160a01b0388165f908152602086815260408083208a84529091529020819055818314611df657611df6888884612373565b60408051858152602081018390529081018490526060810183905287906001600160a01b038a16907f956b049289f8dbe8716375414d9fa6bf32cde65ec1b7e102623775cacc66a6999060800160405180910390a35050505050505050565b5f611e5e612387565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200546040517fe5be7d900000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063e5be7d9090611ecf9084908990899089908990600401613389565b5f604051808303815f87803b158015611ee6575f80fd5b505af1158015611ef8573d5f803e3d5ffd5b505050506105a785858585612408565b5f601b83900b8314838382611f6c577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000860515611f4c57620186a0860595506005850194505b8586601b0b14611f6757600a86059550846001019450611f4c565b611f82565b855f03611f8257505f925060019150611d4c9050565b848560030b14611fde575f851215611fa257505f9250829150611d4c9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016107c8565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f8085158415178015612026575f92505f9150612123565b61203084876133ce565b91505f61203c8861266c565b90505f6120488761266c565b90505f6120558383612695565b5090505f6f0785ee10d5da46d900f436a00000000082111561208a576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a76400008211156120ab57670de0b6b3a7640000820491506012015b633b9aca008211156120c457633b9aca00820491506009015b6127108211156120d957612710820491506004015b81156120ed57600a820491506001016120d9565b6120f781876133ce565b95506121198b8a612113878761210e87600a6134d5565b6126b1565b89612796565b9097509550505050505b5094509492505050565b5f805f61213a8585611f08565b915091508015801561214a575081155b15611ca7576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016107c8565b5f805f8512156121d1576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016107c8565b845f036121e357505f905060016114d5565b8460ff841685018581121561222e576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016107c8565b5f805f831215612298577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb383121561226f575f8095509550505050506114d5565b825f03600a0a915081848161228657612286613052565b04955050840290911491506114d59050565b5f83131561236357604d8313156122ee576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016107c8565b82600a0a9150815f198161230457612304613052565b04841115612351576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016107c8565b50919091029250600191506114d59050565b83600195509550505050506114d5565b5f61237e84846117e6565b91909155505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201545f907fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200906001600160a01b0316806123e357339250505090565b6001909101805473ffffffffffffffffffffffffffffffffffffffff19169055919050565b805182517f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4500911461247257825182516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016107c8565b335f5b845181101561258d576020818102868101820151908601909101516001600160a01b0389161561253f575f828152602086815260408083206001600160a01b038d16845290915290205481811015612519576040517f03dee4c50000000000000000000000000000000000000000000000000000000081526001600160a01b038b1660048201526024810182905260448101839052606481018490526084016107c8565b5f838152602087815260408083206001600160a01b038e16845290915290209082900390555b6001600160a01b03881615612583575f828152602086815260408083206001600160a01b038c1684529091528120805483929061257d908490613137565b90915550505b5050600101612475565b50835160010361260d5760208401515f906020850151909150866001600160a01b0316886001600160a01b0316846001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6285856040516125fe929190918252602082015260400190565b60405180910390a45050610941565b846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161265c9291906134e0565b60405180910390a4505050505050565b5f8082121561269157600160ff1b820361268b5750600160ff1b919050565b505f0390565b5090565b5f805f1983850993909202808410938190039390930393915050565b5f805f6126be8686612695565b91509150815f036126e2578381816126d8576126d8613052565b0492505050610ad4565b83821061272c576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016107c8565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215612844577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612831576127f57f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001613137565b84036128095750600160ff1b90508161287d565b612814600a8561314a565b61281d90613504565b6128288460016133ce565b9150915061287d565b61283a84613504565b839150915061287d565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156128775761281d600a8561314a565b50829050815b94509492505050565b6001600160a01b0381168114610b3f575f80fd5b5f80604083850312156128ab575f80fd5b82356128b681612886565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610b3f575f80fd5b5f60208284031215612901575f80fd5b8135610ad4816128c4565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129495761294961290c565b604052919050565b5f67ffffffffffffffff82111561296a5761296a61290c565b50601f01601f191660200190565b5f82601f830112612987575f80fd5b813561299a61299582612951565b612920565b8181528460208386010111156129ae575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c087890312156129df575f80fd5b86356129ea81612886565b955060208701356129fa81612886565b94506040870135612a0a81612886565b9350606087013592506080870135915060a087013567ffffffffffffffff811115612a33575f80fd5b612a3f89828a01612978565b9150509295509295509295565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6102d86020830184612a4c565b5f60208284031215612a9c575f80fd5b5035919050565b5f8060408385031215612ab4575f80fd5b82359150602083013567ffffffffffffffff811115612ad1575f80fd5b612add85828601612978565b9150509250929050565b5f67ffffffffffffffff821115612b0057612b0061290c565b5060051b60200190565b5f82601f830112612b19575f80fd5b81356020612b2961299583612ae7565b8083825260208201915060208460051b870101935086841115612b4a575f80fd5b602086015b84811015612b665780358352918301918301612b4f565b509695505050505050565b5f805f805f60a08688031215612b85575f80fd5b8535612b9081612886565b94506020860135612ba081612886565b9350604086013567ffffffffffffffff80821115612bbc575f80fd5b612bc889838a01612b0a565b94506060880135915080821115612bdd575f80fd5b612be989838a01612b0a565b93506080880135915080821115612bfe575f80fd5b50612c0b88828901612978565b9150509295509295909350565b5f60208284031215612c28575f80fd5b813567ffffffffffffffff811115612c3e575f80fd5b612c4a84828501612978565b949350505050565b5f8060408385031215612c63575f80fd5b823567ffffffffffffffff80821115612c7a575f80fd5b818501915085601f830112612c8d575f80fd5b81356020612c9d61299583612ae7565b82815260059290921b84018101918181019089841115612cbb575f80fd5b948201945b83861015612ce2578535612cd381612886565b82529482019490820190612cc0565b96505086013592505080821115612cf7575f80fd5b50612add85828601612b0a565b5f815180845260208085019450602084015f5b83811015612d3357815187529582019590820190600101612d17565b509495945050505050565b602081525f6102d86020830184612d04565b5f805f805f60a08688031215612d64575f80fd5b8535612d6f81612886565b94506020860135612d7f81612886565b93506040860135925060608601359150608086013567ffffffffffffffff811115612da8575f80fd5b612c0b88828901612978565b5f8060408385031215612dc5575f80fd5b8235612dd081612886565b915060208301358015158114612de4575f80fd5b809150509250929050565b5f8060408385031215612e00575f80fd5b8235612e0b81612886565b91506020830135612de481612886565b5f81518060208401855e5f93019283525090919050565b5f612c4a612e408386612e1b565b84612e1b565b7f7b22646563696d616c73223a000000000000000000000000000000000000000081525f612e77600c830187612e1b565b7f2c226465736372697074696f6e223a2231206f6620746865736520726563656981527f7074732063616e206265206275726e656420616c6f6e677369646520312000006020820152612ecd603e820187612e1b565b90507f20746f2072656465656d200000000000000000000000000000000000000000008152612eff600b820186612e1b565b90507f2066726f6d20746865207661756c742e222c000000000000000000000000000081527f226e616d65223a220000000000000000000000000000000000000000000000006012820152612f57601a820185612e1b565b7f227d0000000000000000000000000000000000000000000000000000000000008152600201979650505050505050565b5f60208284031215612f98575f80fd5b8151610ad481612886565b634e487b7160e01b5f52603260045260245ffd5b5f612fc461299584612951565b9050828152838383011115612fd7575f80fd5b8282602083015e5f602084830101529392505050565b5f60208284031215612ffd575f80fd5b815167ffffffffffffffff811115613013575f80fd5b8201601f81018413613023575f80fd5b612c4a84825160208401612fb7565b5f60208284031215613042575f80fd5b815160ff81168114610ad4575f80fd5b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b0384168152826020820152606060408201525f61308d6060830184612a4c565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156102db576102db613096565b8381526020810183905260608101600383106130e757634e487b7160e01b5f52602160045260245ffd5b826040830152949350505050565b5f805f60608486031215613107575f80fd5b8351925060208401519150604084015167ffffffffffffffff8116811461312c575f80fd5b809150509250925092565b808201808211156102db576102db613096565b5f8261316457634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176102db576102db613096565b5f60208284031215613190575f80fd5b5051919050565b5f6001600160a01b03808816835280871660208401525060a060408301526131c260a0830186612d04565b82810360608401526131d48186612d04565b905082810360808401526131e88185612a4c565b98975050505050505050565b5f60208284031215613204575f80fd5b8151610ad4816128c4565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261324660a0830184612a4c565b979650505050505050565b600181811c9082168061326557607f821691505b60208210810361328357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610ee557805f5260205f20601f840160051c810160208510156132ae5750805b601f840160051c820191505b818110156105a7575f81556001016132ba565b815167ffffffffffffffff8111156132e7576132e761290c565b6132fb816132f58454613251565b84613289565b602080601f83116001811461332e575f84156133175750858301515b5f19600386901b1c1916600185901b178555610941565b5f85815260208120601f198616915b8281101561335c5788860151825594840194600190910190840161333d565b508582101561337957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160a01b038088168352808716602084015280861660408401525060a060608301526133bc60a0830185612d04565b82810360808401526131e88185612d04565b8082018281125f8312801582168215821617156133ed576133ed613096565b505092915050565b600181815b8085111561342f57815f190482111561341557613415613096565b8085161561342257918102915b93841c93908002906133fa565b509250929050565b5f82613445575060016102db565b8161345157505f6102db565b816001811461346757600281146134715761348d565b60019150506102db565b60ff84111561348257613482613096565b50506001821b6102db565b5060208310610133831016604e8410600b84101617156134b0575081810a6102db565b6134ba83836133f5565b805f19048211156134cd576134cd613096565b029392505050565b5f6102d88383613437565b604081525f6134f26040830185612d04565b828103602084015261308d8185612d04565b5f600160ff1b820361268b5761268b61309656"; + +/// @dev The runtime bytecode of the contract. +bytes constant RUNTIME_CODE = + hex"608060405234801561000f575f80fd5b50600436106100fa575f3560e01c8063481c6a7511610093578063a22cb46511610063578063a22cb46514610232578063c2530e3914610245578063e985e9c514610258578063f242432a146102b2575f80fd5b8063481c6a75146101bd5780634e1273f4146101f75780636d5b3f781461021757806395d89b411461022a575f80fd5b80630e89341c116100ce5780630e89341c14610171578063177769cb146101845780632eb2c2d614610197578063439fab91146101aa575f80fd5b8062fdd58e146100fe57806301ffc9a714610124578063043fa9871461014757806306fdde031461015c575b5f80fd5b61011161010c36600461289a565b6102c5565b6040519081526020015b60405180910390f35b6101376101323660046128f1565b6102e1565b604051901515815260200161011b565b61015a6101553660046129ca565b6103c3565b005b61016461046a565b60405161011b9190612a7a565b61016461017f366004612a8c565b6104cf565b61015a610192366004612aa3565b610580565b61015a6101a5366004612b71565b61058f565b6101116101b8366004612c18565b6105ae565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200546040516001600160a01b03909116815260200161011b565b61020a610205366004612c52565b610782565b60405161011b9190612d3e565b61015a610225366004612d50565b610899565b610164610949565b61015a610240366004612db4565b61099a565b61015a610253366004612d50565b6109a5565b610137610266366004612def565b6001600160a01b039182165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45016020908152604080832093909416825291909152205460ff1690565b61015a6102c0366004612d50565b610a0b565b5f6102d883836102d3610a21565b610a87565b90505b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061037357507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806102db57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102db565b6103cb610adb565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038816179055856104208686868686610b42565b6104617fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19169055565b50505050505050565b6060610474610bc6565b6040518060400160405280600881526020017f20526563656970740000000000000000000000000000000000000000000000008152506040516020016104bb929190612e32565b604051602081830303815290604052905090565b60605f6104e56104dd610c74565b60ff16610d19565b6104ed610bc6565b6104f5610db6565b6104fd61046a565b6040516020016105109493929190612e46565b60408051601f19818403018152828201909152601d82527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020830152915061055882610e96565b604051602001610569929190612e32565b604051602081830303815290604052915050919050565b61058b338383610ea2565b5050565b61059a335b86610eea565b6105a78585858585610f9a565b5050505050565b5f806105b8610ffa565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156105e45750825b90505f8267ffffffffffffffff1660011480156106005750303b155b90508115801561060e575080155b15610645576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001178555831561069057845468ff00000000000000001916680100000000000000001785555b6106a760405180602001604052805f815250611022565b5f7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20090505f888060200190518101906106e09190612f88565b825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039190911617909155507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39550831561077857845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b606081518351146107d157815183516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f6107da610a21565b90505f845167ffffffffffffffff8111156107f7576107f761290c565b604051908082528060200260200182016040528015610820578160200160208202803683370190505b5090505f5b85518110156108905761086b86828151811061084357610843612fa3565b602002602001015186838151811061085d5761085d612fa3565b602002602001015185610a87565b82828151811061087d5761087d612fa3565b6020908102919091010152600101610825565b50949350505050565b6108a1610adb565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038716179055846108f4868584610ea2565b61090085858585611033565b6109417fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19169055565b505050505050565b6060610953610bc6565b6040518060400160405280600581526020017f20524350540000000000000000000000000000000000000000000000000000008152506040516020016104bb929190612e32565b61058b33838361108f565b6109ad610adb565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03871617905584610a00868584610ea2565b6109008585856111a3565b610a1433610594565b6105a78585858585610b42565b5f306001600160a01b031663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a829190612f88565b905090565b5f80610a93858561120a565b90505f610a9e61121f565b6001600160a01b0387165f90815260209182526040808220888352909252908120549150610acd838387611280565b5093505050505b9392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20080546001600160a01b03163314610b3f576040517fc0b2335a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6001600160a01b038416610b6b57604051632bfa23e760e11b81525f60048201526024016107c8565b6001600160a01b038516610b9357604051626a0d4560e21b81525f60048201526024016107c8565b6040805160018082526020820186905281830190815260608201859052608082019092529061046187878484875f6114dd565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f95d89b410000000000000000000000000000000000000000000000000000000081529051606093926001600160a01b0316916395d89b41916004808301925f9291908290030181865afa158015610c47573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c6e9190810190612fed565b91505090565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f93926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015610cf5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6e9190613032565b60605f610d2583611535565b60010190505f8167ffffffffffffffff811115610d4457610d4461290c565b6040519080825280601f01601f191660200182016040528015610d6e576020820181803683370190505b5090508181016020015b5f19017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610d7857509392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f38d52e0f0000000000000000000000000000000000000000000000000000000081529051606093926001600160a01b0316916338d52e0f9160048083019260209291908290030181865afa158015610e38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5c9190612f88565b6001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610c47573d5f803e3d5ffd5b60606102db825f611616565b805115610ee5577fd66d6a9810a5cef78b704e7e04334961e997c81d337f029f74637f060f3d8d65838383604051610edc93929190613066565b60405180910390a15b505050565b816001600160a01b0316816001600160a01b031614158015610f5057506001600160a01b038082165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209386168352929052205460ff16155b1561058b576040517fe237d9220000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152821660248201526044016107c8565b6001600160a01b038416610fc357604051632bfa23e760e11b81525f60048201526024016107c8565b6001600160a01b038516610feb57604051626a0d4560e21b81525f60048201526024016107c8565b6105a7858585858560016114dd565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102db565b61102a611795565b610b3f816117d5565b6001600160a01b03841661105c57604051632bfa23e760e11b81525f60048201526024016107c8565b604080516001808252602082018690528183019081526060820185905260808201909252906109415f87848487846114dd565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45006001600160a01b0384166110f2576040517f3e31884e0000000000000000000000000000000000000000000000000000000081525f60048201526024016107c8565b6001600160a01b038316611134576040517fced3e1000000000000000000000000000000000000000000000000000000000081525f60048201526024016107c8565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b6001600160a01b0383166111cb57604051626a0d4560e21b81525f60048201526024016107c8565b604080516001808252602082018590528183019081526060820184905260a082019092525f608082018181529192916105a791879185908590836114dd565b5f8061121684846117e6565b54949350505050565b5f8060ff1961124f60017fedb99b3af8e1c50d494d6f1b4c75245a0b733cb90baa42bfe0e2f5bc8b000f826130aa565b60405160200161126191815260200190565b60408051601f1981840301815291905280516020909101201692915050565b6040516379ba430560e01b81525f9081908490829081906001600160a01b038716906379ba4305906112bc9086906003906001906004016130bd565b606060405180830381865afa1580156112d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112fb91906130f5565b5091509150875f0361139f575b5f198214611391576040516379ba430560e01b815291925082916001600160a01b038716906379ba4305906113479085906003906001906004016130bd565b606060405180830381865afa158015611362573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061138691906130f5565b509092509050611308565b5f83945094505050506114d5565b875b5f1983146114cd5782935060028203611451576040517fb21a2494000000000000000000000000000000000000000000000000000000008152600481018490525f90611441906001600160a01b038a169063b21a2494906024015f60405180830381865afa158015611415573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261143c9190810190612fed565b61185a565b905061144d828261186f565b9150505b6040516379ba430560e01b81526001600160a01b038816906379ba4305906114839086906003906001906004016130bd565b606060405180830381865afa15801561149e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c291906130f5565b5090935091506113a1565b945091925050505b935093915050565b6114e9868686866118ea565b6001600160a01b03851615610941573381156115125761150d81888888888861194f565b610461565b6020858101519085015161152a838a8a85858a611aba565b505050505050505050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061157d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106115a9576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106115c757662386f26fc10000830492506010015b6305f5e10083106115df576305f5e100830492506008015b61271083106115f357612710830492506004015b60648310611605576064830492506002015b600a83106102db5760010192915050565b606082515f03611634575060408051602081019091525f81526102db565b5f826116645760038451600261164a9190613137565b611654919061314a565b61165f906004613169565b611689565b6003845160046116749190613169565b61167f906002613137565b611689919061314a565b905060405191507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f5261067083027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f18603f526020820181810185865187016020810180515f82525b82841015611747576003840193508351603f8160121c16518753600187019650603f81600c1c16518753600187019650603f8160061c16518753600187019650603f8116518753506001860195506116f4565b9052508590506117885760038651066001811461176b576002811461177e57611786565b603d6001840353603d6002840353611786565b603d60018403535b505b9183525060405292915050565b61179d611beb565b6117d3576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6117dd611795565b610b3f81611c09565b5f8060ff1961181660017f3a8e79826d53842322cdcc810d4a989eb01ac46cfabfd48dcc021625ce13c2d76130aa565b60405160200161182891815260200190565b60408051808303601f1901815291815281516020928301205f9687529290921681528185209585529490945250502090565b5f818060200190518101906102db9190613180565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156118cd576040517fbf463fe9000000000000000000000000000000000000000000000000000000008152600481018490526024016107c8565b5f6108906118e46118de865f611c55565b85611caf565b5f611d11565b5f6118f3610a21565b90505f5b8351811015611942576119248685838151811061191657611916612fa3565b602002602001015184611d53565b61193a8585838151811061191657611916612fa3565b6001016118f7565b506105a785858585611e55565b6001600160a01b0384163b15610941576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c81906119ac9089908990889088908890600401613197565b6020604051808303815f875af19250505080156119e6575060408051601f3d908101601f191682019092526119e3918101906131f4565b60015b611a4d573d808015611a13576040519150601f19603f3d011682016040523d82523d5f602084013e611a18565b606091505b5080515f03611a4557604051632bfa23e760e11b81526001600160a01b03861660048201526024016107c8565b805160208201fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461046157604051632bfa23e760e11b81526001600160a01b03861660048201526024016107c8565b6001600160a01b0384163b15610941576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e6190611b17908990899088908890889060040161320f565b6020604051808303815f875af1925050508015611b51575060408051601f3d908101601f19168201909252611b4e918101906131f4565b60015b611b7e573d808015611a13576040519150601f19603f3d011682016040523d82523d5f602084013e611a18565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461046157604051632bfa23e760e11b81526001600160a01b03861660048201526024016107c8565b5f611bf4610ffa565b5468010000000000000000900460ff16919050565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45007f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4502610ee583826132cd565b5f805f611c628585611f08565b9150915080611ca7576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016107c8565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480611cf48686868661200e565b915091505f611d03838361212d565b9a9950505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d611d4582828761218b565b9350935050505b9250929050565b6001600160a01b038316611d6657505050565b5f611d6f61121f565b6001600160a01b0385165f90815260208281526040808320878452909152812054919250611d9d868661120a565b90505f80611dac838588611280565b91509150838103611dc1575050505050505050565b6001600160a01b0388165f908152602086815260408083208a84529091529020819055818314611df657611df6888884612373565b60408051858152602081018390529081018490526060810183905287906001600160a01b038a16907f956b049289f8dbe8716375414d9fa6bf32cde65ec1b7e102623775cacc66a6999060800160405180910390a35050505050505050565b5f611e5e612387565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200546040517fe5be7d900000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063e5be7d9090611ecf9084908990899089908990600401613389565b5f604051808303815f87803b158015611ee6575f80fd5b505af1158015611ef8573d5f803e3d5ffd5b505050506105a785858585612408565b5f601b83900b8314838382611f6c577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000860515611f4c57620186a0860595506005850194505b8586601b0b14611f6757600a86059550846001019450611f4c565b611f82565b855f03611f8257505f925060019150611d4c9050565b848560030b14611fde575f851215611fa257505f9250829150611d4c9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016107c8565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f8085158415178015612026575f92505f9150612123565b61203084876133ce565b91505f61203c8861266c565b90505f6120488761266c565b90505f6120558383612695565b5090505f6f0785ee10d5da46d900f436a00000000082111561208a576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a76400008211156120ab57670de0b6b3a7640000820491506012015b633b9aca008211156120c457633b9aca00820491506009015b6127108211156120d957612710820491506004015b81156120ed57600a820491506001016120d9565b6120f781876133ce565b95506121198b8a612113878761210e87600a6134d5565b6126b1565b89612796565b9097509550505050505b5094509492505050565b5f805f61213a8585611f08565b915091508015801561214a575081155b15611ca7576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016107c8565b5f805f8512156121d1576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016107c8565b845f036121e357505f905060016114d5565b8460ff841685018581121561222e576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016107c8565b5f805f831215612298577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb383121561226f575f8095509550505050506114d5565b825f03600a0a915081848161228657612286613052565b04955050840290911491506114d59050565b5f83131561236357604d8313156122ee576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016107c8565b82600a0a9150815f198161230457612304613052565b04841115612351576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016107c8565b50919091029250600191506114d59050565b83600195509550505050506114d5565b5f61237e84846117e6565b91909155505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201545f907fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200906001600160a01b0316806123e357339250505090565b6001909101805473ffffffffffffffffffffffffffffffffffffffff19169055919050565b805182517f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4500911461247257825182516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016107c8565b335f5b845181101561258d576020818102868101820151908601909101516001600160a01b0389161561253f575f828152602086815260408083206001600160a01b038d16845290915290205481811015612519576040517f03dee4c50000000000000000000000000000000000000000000000000000000081526001600160a01b038b1660048201526024810182905260448101839052606481018490526084016107c8565b5f838152602087815260408083206001600160a01b038e16845290915290209082900390555b6001600160a01b03881615612583575f828152602086815260408083206001600160a01b038c1684529091528120805483929061257d908490613137565b90915550505b5050600101612475565b50835160010361260d5760208401515f906020850151909150866001600160a01b0316886001600160a01b0316846001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6285856040516125fe929190918252602082015260400190565b60405180910390a45050610941565b846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161265c9291906134e0565b60405180910390a4505050505050565b5f8082121561269157600160ff1b820361268b5750600160ff1b919050565b505f0390565b5090565b5f805f1983850993909202808410938190039390930393915050565b5f805f6126be8686612695565b91509150815f036126e2578381816126d8576126d8613052565b0492505050610ad4565b83821061272c576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016107c8565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215612844577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612831576127f57f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001613137565b84036128095750600160ff1b90508161287d565b612814600a8561314a565b61281d90613504565b6128288460016133ce565b9150915061287d565b61283a84613504565b839150915061287d565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156128775761281d600a8561314a565b50829050815b94509492505050565b6001600160a01b0381168114610b3f575f80fd5b5f80604083850312156128ab575f80fd5b82356128b681612886565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610b3f575f80fd5b5f60208284031215612901575f80fd5b8135610ad4816128c4565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129495761294961290c565b604052919050565b5f67ffffffffffffffff82111561296a5761296a61290c565b50601f01601f191660200190565b5f82601f830112612987575f80fd5b813561299a61299582612951565b612920565b8181528460208386010111156129ae575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c087890312156129df575f80fd5b86356129ea81612886565b955060208701356129fa81612886565b94506040870135612a0a81612886565b9350606087013592506080870135915060a087013567ffffffffffffffff811115612a33575f80fd5b612a3f89828a01612978565b9150509295509295509295565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6102d86020830184612a4c565b5f60208284031215612a9c575f80fd5b5035919050565b5f8060408385031215612ab4575f80fd5b82359150602083013567ffffffffffffffff811115612ad1575f80fd5b612add85828601612978565b9150509250929050565b5f67ffffffffffffffff821115612b0057612b0061290c565b5060051b60200190565b5f82601f830112612b19575f80fd5b81356020612b2961299583612ae7565b8083825260208201915060208460051b870101935086841115612b4a575f80fd5b602086015b84811015612b665780358352918301918301612b4f565b509695505050505050565b5f805f805f60a08688031215612b85575f80fd5b8535612b9081612886565b94506020860135612ba081612886565b9350604086013567ffffffffffffffff80821115612bbc575f80fd5b612bc889838a01612b0a565b94506060880135915080821115612bdd575f80fd5b612be989838a01612b0a565b93506080880135915080821115612bfe575f80fd5b50612c0b88828901612978565b9150509295509295909350565b5f60208284031215612c28575f80fd5b813567ffffffffffffffff811115612c3e575f80fd5b612c4a84828501612978565b949350505050565b5f8060408385031215612c63575f80fd5b823567ffffffffffffffff80821115612c7a575f80fd5b818501915085601f830112612c8d575f80fd5b81356020612c9d61299583612ae7565b82815260059290921b84018101918181019089841115612cbb575f80fd5b948201945b83861015612ce2578535612cd381612886565b82529482019490820190612cc0565b96505086013592505080821115612cf7575f80fd5b50612add85828601612b0a565b5f815180845260208085019450602084015f5b83811015612d3357815187529582019590820190600101612d17565b509495945050505050565b602081525f6102d86020830184612d04565b5f805f805f60a08688031215612d64575f80fd5b8535612d6f81612886565b94506020860135612d7f81612886565b93506040860135925060608601359150608086013567ffffffffffffffff811115612da8575f80fd5b612c0b88828901612978565b5f8060408385031215612dc5575f80fd5b8235612dd081612886565b915060208301358015158114612de4575f80fd5b809150509250929050565b5f8060408385031215612e00575f80fd5b8235612e0b81612886565b91506020830135612de481612886565b5f81518060208401855e5f93019283525090919050565b5f612c4a612e408386612e1b565b84612e1b565b7f7b22646563696d616c73223a000000000000000000000000000000000000000081525f612e77600c830187612e1b565b7f2c226465736372697074696f6e223a2231206f6620746865736520726563656981527f7074732063616e206265206275726e656420616c6f6e677369646520312000006020820152612ecd603e820187612e1b565b90507f20746f2072656465656d200000000000000000000000000000000000000000008152612eff600b820186612e1b565b90507f2066726f6d20746865207661756c742e222c000000000000000000000000000081527f226e616d65223a220000000000000000000000000000000000000000000000006012820152612f57601a820185612e1b565b7f227d0000000000000000000000000000000000000000000000000000000000008152600201979650505050505050565b5f60208284031215612f98575f80fd5b8151610ad481612886565b634e487b7160e01b5f52603260045260245ffd5b5f612fc461299584612951565b9050828152838383011115612fd7575f80fd5b8282602083015e5f602084830101529392505050565b5f60208284031215612ffd575f80fd5b815167ffffffffffffffff811115613013575f80fd5b8201601f81018413613023575f80fd5b612c4a84825160208401612fb7565b5f60208284031215613042575f80fd5b815160ff81168114610ad4575f80fd5b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b0384168152826020820152606060408201525f61308d6060830184612a4c565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156102db576102db613096565b8381526020810183905260608101600383106130e757634e487b7160e01b5f52602160045260245ffd5b826040830152949350505050565b5f805f60608486031215613107575f80fd5b8351925060208401519150604084015167ffffffffffffffff8116811461312c575f80fd5b809150509250925092565b808201808211156102db576102db613096565b5f8261316457634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176102db576102db613096565b5f60208284031215613190575f80fd5b5051919050565b5f6001600160a01b03808816835280871660208401525060a060408301526131c260a0830186612d04565b82810360608401526131d48186612d04565b905082810360808401526131e88185612a4c565b98975050505050505050565b5f60208284031215613204575f80fd5b8151610ad4816128c4565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261324660a0830184612a4c565b979650505050505050565b600181811c9082168061326557607f821691505b60208210810361328357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610ee557805f5260205f20601f840160051c810160208510156132ae5750805b601f840160051c820191505b818110156105a7575f81556001016132ba565b815167ffffffffffffffff8111156132e7576132e761290c565b6132fb816132f58454613251565b84613289565b602080601f83116001811461332e575f84156133175750858301515b5f19600386901b1c1916600185901b178555610941565b5f85815260208120601f198616915b8281101561335c5788860151825594840194600190910190840161333d565b508582101561337957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160a01b038088168352808716602084015280861660408401525060a060608301526133bc60a0830185612d04565b82810360808401526131e88185612d04565b8082018281125f8312801582168215821617156133ed576133ed613096565b505092915050565b600181815b8085111561342f57815f190482111561341557613415613096565b8085161561342257918102915b93841c93908002906133fa565b509250929050565b5f82613445575060016102db565b8161345157505f6102db565b816001811461346757600281146134715761348d565b60019150506102db565b60ff84111561348257613482613096565b50506001821b6102db565b5060208310610133831016604e8410600b84101617156134b0575081810a6102db565b6134ba83836133f5565b805f19048211156134cd576134cd613096565b029392505050565b5f6102d88383613437565b604081525f6134f26040830185612d04565b828103602084015261308d8185612d04565b5f600160ff1b820361268b5761268b61309656"; diff --git a/src/generated/0_1_30/StoxReceiptVault.pointers.sol b/src/generated/0_1_30/StoxReceiptVault.pointers.sol new file mode 100644 index 00000000..429e3ab4 --- /dev/null +++ b/src/generated/0_1_30/StoxReceiptVault.pointers.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity ^0.8.25; + +// THIS FILE IS AUTOGENERATED BY ./script/BuildPointers.sol + +// This file is committed to the repository because there is a circular +// dependency between the contract and its pointers file. The contract +// needs the pointers file to exist so that it can compile, and the pointers +// file needs the contract to exist so that it can be compiled. + +/// @dev Hash of the known bytecode. +bytes32 constant BYTECODE_HASH = bytes32(0x81f5b328841117c2b0a4759cc87e76cf2abab03b4a461d9082c1c147cd8705a6); + +/// @dev The deterministic deploy address of the contract when deployed via +/// the Zoltu factory. +address constant DEPLOYED_ADDRESS = address(0x52174538a83b18462c5cF898016539B086c920C7); + +/// @dev The creation bytecode of the contract. +bytes constant CREATION_CODE = + hex"608060405234801561000f575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561003c610041565b6100f3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100915760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100f05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615dfa806101005f395ff3fe608060405260043610610337575f3560e01c8063715018a6116101af578063bbec4d06116100eb578063dd62ed3e11610094578063e70689f51161006e578063e70689f51461098c578063f2fde38b146109ab578063f5647943146109ca578063f5d214f5146109ff5761033e565b8063dd62ed3e146108ce578063e1e6b89814610931578063e5be7d901461096d5761033e565b8063c77b66c2116100c5578063c77b66c214610894578063d09edf31146108a7578063db2088f4146108bb5761033e565b8063bbec4d0614610856578063c54cafee14610875578063c63d75b6146105445761033e565b80638da5cb5b11610158578063a9059cbb11610132578063a9059cbb14610799578063ac9650d8146107b8578063ae57de0c146107e4578063ae98b39f146108035761033e565b80638da5cb5b14610752578063921a4c421461076657806395d89b41146107855761033e565b80637a7af70d116101895780637a7af70d1461070157806381c3fcb91461071457806385b68756146107335761033e565b8063715018a6146106af578063770afee1146106c3578063786cd916146106e25761033e565b8063276b11401161027e5780634abe413711610227578063633ac71711610201578063633ac717146105ff5780636ba235211461061e5780636c876b941461067157806370a08231146106905761033e565b80634abe4137146105a257806356db02e8146105c157806359f89dda146105e05761033e565b8063402d267d11610258578063402d267d14610544578063439fab9114610564578063488bd7b0146105835761033e565b8063276b1140146104df578063313ce567146104f257806338d52e0f146105185761033e565b806318160ddd116102e05780631f6759d3116102ba5780631f6759d31461048d57806323b872dd146104a15780632755c6c7146104c05761033e565b806318160ddd1461043b578063181e7b3b1461044f5780631e4344a11461046e5761033e565b806306fdde031161031157806306fdde03146103e8578063095ea7b3146104095780631423feba146104285761033e565b806301e1d1141461037357806301ffc9a71461039a578063058a628f146103c95761033e565b3661033e57005b73ad6219d71ccf6904c0633e3a8a8c423f54036fd1365f80375f80365f845af43d5f803e80801561036d573d5ff35b3d5ffd5b005b34801561037e575f80fd5b50610387610a32565b6040519081526020015b60405180910390f35b3480156103a5575f80fd5b506103b96103b4366004614dd8565b610a40565b6040519015158152602001610391565b3480156103d4575f80fd5b506103716103e3366004614e13565b610a83565b3480156103f3575f80fd5b506103fc610cac565b6040516103919190614e5c565b348015610414575f80fd5b506103b9610423366004614e6e565b610d7f565b610387610436366004614fa2565b610d96565b348015610446575f80fd5b50610387610de0565b34801561045a575f80fd5b50610387610469366004615001565b610de9565b348015610479575f80fd5b50610371610488366004615021565b610e08565b348015610498575f80fd5b50610387610e94565b3480156104ac575f80fd5b506103b96104bb366004615038565b610ebf565b3480156104cb575f80fd5b506103716104da366004614e6e565b610ee2565b6103876104ed366004615001565b61101c565b3480156104fd575f80fd5b50610506611047565b60405160ff9091168152602001610391565b348015610523575f80fd5b5061052c6110ec565b6040516001600160a01b039091168152602001610391565b34801561054f575f80fd5b5061038761055e366004614e13565b505f1990565b34801561056f575f80fd5b5061038761057e366004615076565b611120565b34801561058e575f80fd5b5061038761059d366004615001565b611399565b3480156105ad575f80fd5b506103876105bc366004614e6e565b6113b1565b3480156105cc575f80fd5b506103876105db3660046150a8565b611452565b3480156105eb575f80fd5b506103716105fa3660046150ef565b611762565b34801561060a575f80fd5b50610371610619366004614e13565b61179a565b348015610629575f80fd5b50610387610638366004614e13565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be701602052604090205490565b34801561067c575f80fd5b5061037161068b366004614e13565b6118c7565b34801561069b575f80fd5b506103876106aa366004614e13565b6119c7565b3480156106ba575f80fd5b50610371611a10565b3480156106ce575f80fd5b506103876106dd3660046150ef565b611a23565b3480156106ed575f80fd5b506103716106fc366004614e6e565b611bdd565b61038761070f366004615001565b611d0e565b34801561071f575f80fd5b5061037161072e366004615076565b611d23565b34801561073e575f80fd5b5061038761074d366004614e6e565b611d5f565b34801561075d575f80fd5b5061052c611e29565b348015610771575f80fd5b50610387610780366004615144565b611e32565b348015610790575f80fd5b506103fc611e5f565b3480156107a4575f80fd5b506103b96107b3366004614e6e565b611eb0565b3480156107c3575f80fd5b506107d76107d23660046151b5565b611ebd565b6040516103919190615224565b3480156107ef575f80fd5b506103876107fe366004615144565b611fa3565b34801561080e575f80fd5b5061038761081d366004614e13565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be702602052604090205490565b348015610861575f80fd5b50610387610870366004615001565b611fc6565b348015610880575f80fd5b5061038761088f3660046152e2565b611fd4565b6103876108a2366004614fa2565b6120a3565b3480156108b2575f80fd5b5061052c6120d2565b6103876108c9366004615001565b6120fa565b3480156108d9575f80fd5b506103876108e8366004615347565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b34801561093c575f80fd5b507f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031661052c565b348015610978575f80fd5b506103716109873660046153f0565b61210e565b348015610997575f80fd5b506103716109a6366004615486565b612245565b3480156109b6575f80fd5b506103716109c5366004614e13565b6123ae565b3480156109d5575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd025442116103b9565b348015610a0a575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0154610387565b5f610a3b610de0565b905090565b5f6001600160e01b031982167f59f89dda000000000000000000000000000000000000000000000000000000001480610a7d5750610a7d82612404565b92915050565b6040517f248a9ca30000000000000000000000000000000000000000000000000000000081527ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f8960048201525f906001600160a01b0383169063248a9ca390602401602060405180830381865afa158015610b00573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2491906154de565b905080610b93576040517f76728ed90000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201527ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f8960248201526044015b60405180910390fd5b6040517f248a9ca30000000000000000000000000000000000000000000000000000000081527f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e760048201525f906001600160a01b0384169063248a9ca390602401602060405180830381865afa158015610c10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3491906154de565b905080610c9e576040517f76728ed90000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201527f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e76024820152604401610b8a565b610ca7836124d2565b505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610cfd906154f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d29906154f5565b8015610d745780601f10610d4b57610100808354040283529160200191610d74565b820191905f5260205f20905b815481529060010190602001808311610d5757829003601f168201915b505050505091505090565b5f33610d8c8185856124e3565b5060019392505050565b5f80610da06124f0565b90505f610dba87610db4335b89865f612547565b8761255b565b9050610dc98787838588612571565b610dd4335b4761277f565b9150505b949350505050565b5f610a3b612828565b5f610e0183670de0b6b3a7640000612987565b612987565b9392505050565b610e10612993565b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054821115610e3e578181555b7fff9fd4facd8bd30d905cc7ffbd03e8829a414df4c6554d155d132c3377868a42610e67611e29565b8254604080516001600160a01b039093168352602083018690528201526060015b60405180910390a15050565b5f807f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7005b5492915050565b5f33610ecc8582856129de565b610ed7858585612a92565b506001949350505050565b610eea612993565b805f03610f2e576040517f5a6084530000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b8a565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115610fab576001600160a01b0383165f90815260028201602052604090208290555b7fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd610fd4611e29565b6001600160a01b038581165f818152600286016020908152604091829020548251959094168552840191909152820185905260608201526080015b60405180910390a1505050565b5f8061103c84611036335b336110306124f0565b5f612547565b85612b21565b9050610e0133610dce565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080545f91906001600160a01b0316803b806110845760126110e4565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e49190615527565b935050505090565b5f807f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326005b546001600160a01b031692915050565b5f8061112a612b38565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156111565750825b90505f8267ffffffffffffffff1660011480156111725750303b155b905081158015611180575080155b156111b7576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001178555831561120257845468ff00000000000000001916680100000000000000001785555b61120a612b60565b5f8780602001905181019061121f9190615594565b905061122e8160200151612b99565b6020810151516001600160a01b031615611274576040517f8951799200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03166112b5576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112be30612d01565b80516112c990612e56565b7ffa89761502e992c8c755fba778ced00f4562485023f656906eb76f5dd65a9fe53360408051808201825284516001600160a01b0316815260208086015190820152905161131892919061568b565b60405180910390a17fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3965050831561138f57845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b5f610e01836113ac335b33866001612547565b612ed3565b5f6113e37f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b604051627eeac760e11b81526001600160a01b03858116600483015260248201859052919091169062fdd58e90604401602060405180830381865afa15801561142e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0191906154de565b5f61145b612ee0565b825f03611494576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61153f846114ca7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b604051627eeac760e11b81526001600160a01b038a81166004830152602482018a9052919091169062fdd58e90604401602060405180830381865afa158015611515573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153991906154de565b90612f0e565b90508015611644577f88e2280ece62e9296d3578b77647db2c11f9fa7e42578e2db5d4262123ffae3e3387878785886040516115809695949392919061572f565b60405180910390a17f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663043fa98733883360405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018890526084810184905260c060a48201525f60c482015260e4015f604051808303815f87803b15801561162d575f80fd5b505af115801561163f573d5f803e3d5ffd5b505050505b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e36040518060a001604052808c6001600160a01b031681526020018b81526020018a8152602001878152602001898152506040516020016116db9190615778565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611708939291906157c3565b5f604051808303815f87803b15801561171f575f80fd5b505af1158015611731573d5f803e3d5ffd5b5093945050505050610dd860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610b8a939291906157c3565b6117a2612993565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700904211611857576001600160a01b0382165f818152600283016020526040908190205490517f81a7897700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610b8a565b6001600160a01b0382165f9081526002820160205260408120557fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd61189a611e29565b604080516001600160a01b03928316815291851660208301525f9082018190526060820152608001610e88565b6118cf612993565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700904211611984576001600160a01b0382165f818152600183016020526040908190205490517ff1b01b5400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610b8a565b6001600160a01b0382165f9081526001820160205260408120557fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af2532695447499161189a611e29565b5f806119d283612f1d565b90505f6119dd612f30565b6001600160a01b0385165f90815260038201602052604081205491925090611a06908490612f91565b5095945050505050565b611a18612993565b611a215f612e56565b565b5f611a2c612ee0565b825f03611a65576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611a7384611539876119c7565b90508015611ac5577f3fc1c49e72362e91416388fe7a107b92db924642476e83e701eeeb6256d7249e3386868487604051611ab29594939291906157ea565b60405180910390a1611ac5853383612a92565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed60405180608001604052808b6001600160a01b031681526020018a815260200187815260200189815250604051602001611b569190615821565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611b83939291906157c3565b5f604051808303815f87803b158015611b9a575f80fd5b505af1158015611bac573d5f803e3d5ffd5b5093945050505050610e0160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611be5612993565b805f03611c29576040517ffd86061b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b8a565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115611ca6576001600160a01b0383165f90815260018201602052604090208290555b7fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af25326954474991611ccf611e29565b6001600160a01b038581165f8181526001860160209081526040918290205482519590941685528401919091528201859052606082015260800161100f565b5f8061103c84611d1d33611027565b8561255b565b7fdaffad82f53a38a62340f14cdd6fd3b437c5dcda6b32029dac1e661dbce28b2d3382604051611d54929190615862565b60405180910390a150565b5f80611d6e8485856001612547565b9050805f03611d80575f915050610a7d565b610dd8611db47f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b604051627eeac760e11b81526001600160a01b03878116600483015260248201879052919091169062fdd58e90604401602060405180830381865afa158015611dff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e2391906154de565b82612987565b5f610a3b61303f565b5f80611e4587610dfc8789886001612547565b9050611e558187878a8888613067565b9695505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610cfd906154f5565b5f33610d8c818585612a92565b604080515f8152602081019091526060908267ffffffffffffffff811115611ee757611ee7614e98565b604051908082528060200260200182016040528015611f1a57816020015b6060815260200190600190039081611f055790505b5091505f5b83811015611f9b57611f7630868684818110611f3d57611f3d6158aa565b9050602002810190611f4f91906158be565b85604051602001611f629392919061591f565b6040516020818303038152906040526133fc565b838281518110611f8857611f886158aa565b6020908102919091010152600101611f1f565b505092915050565b5f80611fb6876113ac8789886001612547565b9050611e55878787848888613067565b5f610e0183610dfc336113a3565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd009085111561203d5760405163725238c160e11b815260048101869052602401610b8a565b5f6120548861204e338a8a5f612547565b5f61255b565b90506120988888838989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061257192505050565b979650505050505050565b5f806120ad6124f0565b90505f6120c3876120bd33610dac565b87612b21565b9050610dc98187898588612571565b5f807fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00611110565b5f8061103c84670de0b6b3a764000061204e565b61211b8585858585613497565b61212584846134fa565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080546040805160a0810182526001600160a01b0388811682528781166020830152918101869052606081018590529116906359f89dda9088907f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4890608081016121cf7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040516121e3919060200161597c565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401612210939291906157c3565b5f604051808303815f87803b158015612227575f80fd5b505af1158015612239573d5f803e3d5ffd5b50505050505050505050565b835f0361227e576040517f8672985d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090505f6040518060a001604052808360020154815260200183600201548152602001878152602001861515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250905084806123185750816002015486115b1561232c5760028201869055602081018690525b7f7ef5cae78e9bd364afb19bb0f8a881a6d156e35a119e28c0d17524e50795815833878787876040516123639594939291906159ee565b60405180910390a181546001600160a01b03166359f89dda337f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d053391846040516020016121e39190615a3c565b6123b6612993565b6001600160a01b0381166123f8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b61240181612e56565b50565b5f6001600160e01b031982167fe5be7d9000000000000000000000000000000000000000000000000000000000148061246657506001600160e01b031982167f439fab9100000000000000000000000000000000000000000000000000000000145b8061249a57506001600160e01b031982167fe1e6b89800000000000000000000000000000000000000000000000000000000145b80610a7d57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610a7d565b6124da612993565b61240181612d01565b610ca783838360016135ba565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090612541906001615a80565b91505090565b5f670de0b6b3a76400005b95945050505050565b5f61256682846136e2565b610dd884845f613726565b612579612ee0565b845f036125b2576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f036125eb576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841661262b576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f0361264d5760405163725238c160e11b81525f6004820152602401610b8a565b7f3377bcbed49a0c0005e53931cd8fe7334b5371523e5de784c0d0d3d01089cfea3385878686866040516126869695949392919061572f565b60405180910390a161269b858585858561373b565b6126a58484613796565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517f6d5b3f780000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690636d5b3f789061271590339088908790899088906004016157ea565b5f604051808303815f87803b15801561272c575f80fd5b505af115801561273e573d5f803e3d5ffd5b5050505061274f85858585856137e3565b61277860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b804710156127c2576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610b8a565b6127db828260405180602001604052805f81525061388f565b156127e4575050565b3d156127f6576127f26138a4565b5050565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80612832612f30565b60028101549091505f03612848576125416138af565b5f6128575f1960036001613915565b90505f5b5f198214610e01575f836002018381548110612879576128796158aa565b905f5260205f2090600502015f0154905060028103612956575f6129468560020185815481106128ab576128ab6158aa565b905f5260205f20906005020160040180546128c5906154f5565b80601f01602080910402602001604051908101604052809291908181526020018280546128f1906154f5565b801561293c5780601f106129135761010080835404028352916020019161293c565b820191905f5260205f20905b81548152906001019060200180831161291f57829003601f168201915b5050505050613a10565b90506129528382613a25565b9250505b5f8381526004850160205260409020546129709083615a80565b915061297f8360036001613915565b92505061285b565b5f610e01838383613aa9565b3361299c611e29565b6001600160a01b031614611a21576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610b8a565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015612a8c5781811015612a7e576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610b8a565b612a8c84848484035f6135ba565b50505050565b6001600160a01b038316612ad4576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b6001600160a01b038216612b16576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b610ca7838383613abe565b5f612b2c82846136e2565b610dd884846001613aa9565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610a7d565b425f03611a21576040517f789a532d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ba1613b11565b612bb381602001518260400151613b19565b80517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432600805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b0393841617825560608401517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601805490921693169283179055604080517f481c6a75000000000000000000000000000000000000000000000000000000008152905191925f92909163481c6a759160048083019260209291908290030181865afa158015612c88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cac9190615a93565b90506001600160a01b0381163014610ca7576040517f7935475e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0382166024820152604401610b8a565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f59f89dda0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612d7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612da09190615aae565b612dd6576040517ffd12061600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03831690811782556040805133815260208101929092527fa8c713fe8fb360697fc0daab836d85208a605d485fbc265aea0f773fc6cdd71a9101610e88565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610e0183836001613726565b612ee8613b2b565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f828218828410028218610e01565b5f80612f2883613b86565b549392505050565b5f8060ff19612f6060017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71615897565b604051602001612f7291815260200190565b60408051601f1981840301815291905280516020909101201692915050565b5f808281612f9d612f30565b9050855f612fae8760036001613915565b90505b5f198114613030579250828115801590612fee57506002836002018281548110612fdd57612fdd6158aa565b905f5260205f2090600502015f0154145b1561301c575f61300c8460020183815481106128ab576128ab6158aa565b90506130188382613a25565b9250505b6130298160036001613915565b9050612fb1565b509350909150505b9250929050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300611110565b61306f612ee0565b855f036130a8576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f036130e1576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516613121576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416613161576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036131845760405163725238c160e11b815260048101839052602401610b8a565b7f2845b9458bcc357e1abfe8de7f6832dfe7220596a053496b33d0deb6577d8d2a338686898787876040516131bf9796959493929190615ac9565b60405180910390a16001600160a01b0384163314613316576131e28433856129de565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663e985e9c585336040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015613266573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061328a9190615aae565b613316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610b8a565b6133208484613bf3565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517fc2530e390000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c2530e399061339090339088908790899088906004016157ea565b5f604051808303815f87803b1580156133a7575f80fd5b505af11580156133b9573d5f803e3d5ffd5b505050506133cb868686868686613c40565b6133f460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b60605f6134098484613d49565b905080801561342a57505f3d118061342a57505f846001600160a01b03163b115b1561343f57613437613d5c565b915050610a7d565b8015613482576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610b8a565b3d156127f6576134906138a4565b5092915050565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03163314612778576040517f8813aac300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054421180159061354357506001600160a01b0383165f908152600182016020526040902054155b801561356657506001600160a01b0382165f908152600282016020526040902054155b15610ca75780546040517f79d7155100000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b03808516602483015283166044820152606401610b8a565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b03851661361d576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b6001600160a01b03841661365f576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561277857836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516136d391815260200190565b60405180910390a35050505050565b818110156127f2576040517fa3e322340000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610b8a565b5f610dd88484670de0b6b3a764000085613d75565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01547fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906137899084613db7565b6001909101555050505050565b6001600160a01b0382166137d8576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b6127f25f8383613abe565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216040518060c0016040528061384c3390565b6001600160a01b031681526020018a6001600160a01b031681526020018881526020018b8152602001898152602001878152506040516020016121e39190615b6e565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f8060ff196138df60017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615897565b6040516020016138f191815260200190565b60408051601f198184030181529190528051602090910120610eb891166002615a80565b5f600783168103613952576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61395b612f30565b60028101549091505f03613973575f19915050610e01565b5f5f1986146139a657816002018681548110613991576139916158aa565b905f5260205f209060050201600301546139a9565b81545b905060028460028111156139bf576139bf615b80565b036139e1576139d8826139d28484613dc6565b87613e41565b92505050610e01565b60018460028111156139f5576139f5615b80565b03613a05576139d8828287613e99565b611e55828287613e41565b5f81806020019051810190610a7d91906154de565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613a83576040517fbf463fe900000000000000000000000000000000000000000000000000000000815260048101849052602401610b8a565b5f613aa0613a9a613a94865f613f06565b85613f60565b5f613fc2565b50949350505050565b5f610dd884670de0b6b3a76400008585613d75565b613ac6614003565b613acf83614069565b613ad882614069565b613ae3838383614160565b6001600160a01b038316613afa57610ca7816142c0565b6001600160a01b038216610ca757610ca781614303565b611a2161433d565b613b2161433d565b6127f2828261437b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203611a21576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060ff19613bb660017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615897565b604051602001613bc891815260200190565b60408051601f1981840301815291815281516020928301205f96875292909216905290922092915050565b6001600160a01b038216613c35576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b6127f2825f83613abe565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696040518060c001604052808a6001600160a01b031681526020018b6001600160a01b031681526020018881526020018c815260200189815260200187815250604051602001613ce69190615b6e565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613d13939291906157c3565b5f604051808303815f87803b158015613d2a575f80fd5b505af1158015613d3c573d5f803e3d5ffd5b5050505050505050505050565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b5f613da2613d82836143de565b8015613d9d57505f8480613d9857613d98615b94565b868809115b151590565b613dad86868661440a565b6125529190615a80565b5f828218828411028218610e01565b5f5b5f198214158015613e0a575042836002018381548110613dea57613dea6158aa565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b15613e3b57826002018281548110613e2457613e246158aa565b905f5260205f209060050201600301549150613dc8565b50919050565b5f5b5f198314613e8f575f846002018481548110613e6157613e616158aa565b905f5260205f209060050201905082815f0154165f14613e845783915050610e01565b600301549250613e43565b505f199392505050565b5f5b5f198314613e8f575f846002018481548110613eb957613eb96158aa565b5f918252602090912060059091020160018101549091504267ffffffffffffffff9091161115613ee95750613e8f565b8054831615613efb5783915050610e01565b600301549250613e9b565b5f805f613f1385856144ba565b9150915080613f58576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610b8a565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480613fa5868686866145c0565b915091505f613fb483836146df565b9a9950505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d613ff682828761473d565b9350935050509250929050565b5f61400c612f30565b60028101549091505f0361401d5750565b5f614032826005015460026001176001613915565b90505f195b5f19821461405557508061404e8160036001613915565b9150614037565b5f198114610ca75760058301819055505050565b6001600160a01b03811661407a5750565b5f614083612f30565b6001600160a01b0383165f9081526003820160205260408120549192506140a984612f1d565b90505f806140b78385612f91565b915091508381036140ca57505050505050565b6001600160a01b0386165f9081526003860160205260409020819055818314614101576140f78683614928565b614101838361493a565b6040805185815260208101839052908101849052606081018390526001600160a01b038716907f36a2eb39b73568d38e98721588b15b309c9380e1b1ab575c2c3d71d5148ccb4a9060800160405180910390a26133f484848385614960565b61416a83836134fa565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a6040518060800160405280896001600160a01b03168152602001886001600160a01b0316815260200187815260200161421a7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040805182516001600160a01b03908116602080840191909152840151168183015290820151606080830191909152909101511515608082015260a0016040516020818303038152906040526040518463ffffffff1660e01b8152600401614288939291906157c3565b5f604051808303815f87803b15801561429f575f80fd5b505af11580156142b1573d5f803e3d5ffd5b50505050612a8c8484846149bd565b5f6142c9612f30565b6002810154909150156127f25760058101545f908152600482016020526040812080548492906142fa908490615a80565b90915550505050565b5f61430c612f30565b6002810154909150156127f25760058101545f908152600482016020526040812080548492906142fa908490615897565b6143456149c8565b611a21576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61438361433d565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036143cf8482615bec565b5060048101612a8c8382615bec565b5f60028260038111156143f3576143f3615b80565b6143fd9190615ca8565b60ff166001149050919050565b5f805f61441786866149e6565b91509150815f0361443b5783818161443157614431615b94565b0492505050610e01565b818411614452576144526003851502601118614a02565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f601b83900b831483838261451e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156144fe57620186a0860595506005850194505b8586601b0b1461451957600a860595508460010194506144fe565b614534565b855f0361453457505f9250600191506130389050565b848560030b14614590575f85121561455457505f92508291506130389050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610b8a565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f80851584151780156145d8575f92505f91506146d5565b6145e28487615cc9565b91505f6145ee88614a13565b90505f6145fa87614a13565b90505f61460783836149e6565b5090505f6f0785ee10d5da46d900f436a00000000082111561463c576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561465d57670de0b6b3a7640000820491506012015b633b9aca0082111561467657633b9aca00820491506009015b61271082111561468b57612710820491506004015b811561469f57600a8204915060010161468b565b6146a98187615cc9565b95506146cb8b8a6146c587876146c087600a615dc8565b614a3c565b89614b17565b9097509550505050505b5094509492505050565b5f805f6146ec85856144ba565b91509150801580156146fc575081155b15613f58576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610b8a565b5f805f851215614783576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610b8a565b845f0361479557505f90506001614920565b8460ff84168501858112156147e0576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610b8a565b5f805f83121561484a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215614821575f809550955050505050614920565b825f03600a0a915081848161483857614838615b94565b04955050840290911491506149209050565b5f83131561491557604d8313156148a0576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610b8a565b82600a0a9150815f19816148b6576148b6615b94565b04841115614903576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610b8a565b50919091029250600191506149209050565b509193506001925050505b935093915050565b5f61493283613b86565b919091555050565b6127f282826149476138af565b6149519190615a80565b61495b9190615897565b614c07565b5f614969612f30565b905083816004015f8781526020019081526020015f205f82825461498d9190615897565b90915550505f838152600482016020526040812080548492906149b1908490615a80565b90915550505050505050565b610ca7838383614c73565b5f6149d1612b38565b5468010000000000000000900460ff16919050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f80821215614a3857600160ff1b8203614a325750600160ff1b919050565b505f0390565b5090565b5f805f614a4986866149e6565b91509150815f03614a635783818161443157614431615b94565b838210614aad576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610b8a565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614bc5577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614bb257614b767f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615a80565b8403614b8a5750600160ff1b905081614bfe565b614b95600a85615dd3565b614b9e90615de6565b614ba9846001615cc9565b91509150614bfe565b614bbb84615de6565b8391509150614bfe565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614bf857614b9e600a85615dd3565b50829050815b94509492505050565b5f60ff19614c3660017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615897565b604051602001614c4891815260200190565b60408051601f198184030181529190528051602090910120614c6c91166002615a80565b9190915550565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416614cc05781816002015f828254614cb59190615a80565b90915550614d499050565b6001600160a01b0384165f9081526020829052604090205482811015614d2b576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101849052606401610b8a565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316614d67576002810180548390039055614d85565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614dca91815260200190565b60405180910390a350505050565b5f60208284031215614de8575f80fd5b81356001600160e01b031981168114610e01575f80fd5b6001600160a01b0381168114612401575f80fd5b5f60208284031215614e23575f80fd5b8135610e0181614dff565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610e016020830184614e2e565b5f8060408385031215614e7f575f80fd5b8235614e8a81614dff565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715614ecf57614ecf614e98565b60405290565b6040516080810167ffffffffffffffff81118282101715614ecf57614ecf614e98565b604051601f8201601f1916810167ffffffffffffffff81118282101715614f2157614f21614e98565b604052919050565b5f67ffffffffffffffff821115614f4257614f42614e98565b50601f01601f191660200190565b5f82601f830112614f5f575f80fd5b8135614f72614f6d82614f29565b614ef8565b818152846020838601011115614f86575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215614fb5575f80fd5b843593506020850135614fc781614dff565b925060408501359150606085013567ffffffffffffffff811115614fe9575f80fd5b614ff587828801614f50565b91505092959194509250565b5f8060408385031215615012575f80fd5b50508035926020909101359150565b5f60208284031215615031575f80fd5b5035919050565b5f805f6060848603121561504a575f80fd5b833561505581614dff565b9250602084013561506581614dff565b929592945050506040919091013590565b5f60208284031215615086575f80fd5b813567ffffffffffffffff81111561509c575f80fd5b610dd884828501614f50565b5f805f80608085870312156150bb575f80fd5b84356150c681614dff565b93506020850135925060408501359150606085013567ffffffffffffffff811115614fe9575f80fd5b5f805f60608486031215615101575f80fd5b833561510c81614dff565b925060208401359150604084013567ffffffffffffffff81111561512e575f80fd5b61513a86828701614f50565b9150509250925092565b5f805f805f60a08688031215615158575f80fd5b85359450602086013561516a81614dff565b9350604086013561517a81614dff565b925060608601359150608086013567ffffffffffffffff81111561519c575f80fd5b6151a888828901614f50565b9150509295509295909350565b5f80602083850312156151c6575f80fd5b823567ffffffffffffffff808211156151dd575f80fd5b818501915085601f8301126151f0575f80fd5b8135818111156151fe575f80fd5b8660208260051b8501011115615212575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015615297577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452615285858351614e2e565b9450928501929085019060010161524b565b5092979650505050505050565b5f8083601f8401126152b4575f80fd5b50813567ffffffffffffffff8111156152cb575f80fd5b602083019150836020828501011115613038575f80fd5b5f805f805f608086880312156152f6575f80fd5b85359450602086013561530881614dff565b935060408601359250606086013567ffffffffffffffff81111561532a575f80fd5b615336888289016152a4565b969995985093965092949392505050565b5f8060408385031215615358575f80fd5b823561536381614dff565b9150602083013561537381614dff565b809150509250929050565b5f82601f83011261538d575f80fd5b8135602067ffffffffffffffff8211156153a9576153a9614e98565b8160051b6153b8828201614ef8565b92835284810182019282810190878511156153d1575f80fd5b83870192505b84831015612098578235825291830191908301906153d7565b5f805f805f60a08688031215615404575f80fd5b853561540f81614dff565b9450602086013561541f81614dff565b9350604086013561542f81614dff565b9250606086013567ffffffffffffffff8082111561544b575f80fd5b61545789838a0161537e565b9350608088013591508082111561546c575f80fd5b506151a88882890161537e565b8015158114612401575f80fd5b5f805f8060608587031215615499575f80fd5b8435935060208501356154ab81615479565b9250604085013567ffffffffffffffff8111156154c6575f80fd5b6154d2878288016152a4565b95989497509550505050565b5f602082840312156154ee575f80fd5b5051919050565b600181811c9082168061550957607f821691505b602082108103613e3b57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215615537575f80fd5b815160ff81168114610e01575f80fd5b5f82601f830112615556575f80fd5b8151615564614f6d82614f29565b818152846020838601011115615578575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f602082840312156155a4575f80fd5b815167ffffffffffffffff808211156155bb575f80fd5b90830190604082860312156155ce575f80fd5b6155d6614eac565b82516155e181614dff565b81526020830151828111156155f4575f80fd5b929092019160808387031215615608575f80fd5b615610614ed5565b835161561b81614dff565b815260208401518381111561562e575f80fd5b61563a88828701615547565b602083015250604084015183811115615651575f80fd5b61565d88828701615547565b6040830152506060840151935061567384614dff565b60608101939093526020810192909252509392505050565b5f6001600160a01b038085168352604060208401528084511660408401526020840151604060608501528181511660808501526020810151608060a08601526156d8610100860182614e2e565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808683030160c08701526157138282614e2e565b9150508260608301511660e08601528093505050509392505050565b5f6001600160a01b03808916835280881660208401525085604083015284606083015283608083015260c060a083015261576c60c0830184614e2e565b98975050505050505050565b602081526001600160a01b0382511660208201526020820151604082015260408201516060820152606082015160808201525f608083015160a080840152610dd860c0840182614e2e565b6001600160a01b0384168152826020820152606060408201525f6125526060830184614e2e565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261209860a0830184614e2e565b602081526001600160a01b03825116602082015260208201516040820152604082015160608201525f6060830151608080840152610dd860a0840182614e2e565b6001600160a01b0383168152604060208201525f610dd86040830184614e2e565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a7d57610a7d615883565b634e487b7160e01b5f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126158f1575f80fd5b83018035915067ffffffffffffffff82111561590b575f80fd5b602001915036819003821315613038575f80fd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b5f815180845260208085019450602084015f5b8381101561597157815187529582019590820190600101615955565b509495945050505050565b602081525f6001600160a01b0380845116602084015280602085015116604084015250604083015160a060608401526159b860c0840182615942565b90506060840151601f198483030160808501526159d58282615942565b9150506080840151151560a08401528091505092915050565b6001600160a01b0386168152846020820152831515604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f19160101949350505050565b602081528151602082015260208201516040820152604082015160608201526060820151151560808201525f608083015160a080840152610dd860c0840182614e2e565b80820180821115610a7d57610a7d615883565b5f60208284031215615aa3575f80fd5b8151610e0181614dff565b5f60208284031215615abe575f80fd5b8151610e0181615479565b5f6001600160a01b03808a16835280891660208401528088166040840152508560608301528460808301528360a083015260e060c0830152615b0e60e0830184614e2e565b9998505050505050505050565b5f6001600160a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160c060a0850152610dd860c0850182614e2e565b602081525f610e016020830184615b1b565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b601f821115610ca757805f5260205f20601f840160051c81016020851015615bcd5750805b601f840160051c820191505b81811015612778575f8155600101615bd9565b815167ffffffffffffffff811115615c0657615c06614e98565b615c1a81615c1484546154f5565b84615ba8565b602080601f831160018114615c4d575f8415615c365750858301515b5f19600386901b1c1916600185901b1785556133f4565b5f85815260208120601f198616915b82811015615c7b57888601518255948401946001909101908401615c5c565b5085821015615c9857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60ff831680615cba57615cba615b94565b8060ff84160691505092915050565b8082018281125f831280158216821582161715611f9b57611f9b615883565b600181815b80851115615d2257815f1904821115615d0857615d08615883565b80851615615d1557918102915b93841c9390800290615ced565b509250929050565b5f82615d3857506001610a7d565b81615d4457505f610a7d565b8160018114615d5a5760028114615d6457615d80565b6001915050610a7d565b60ff841115615d7557615d75615883565b50506001821b610a7d565b5060208310610133831016604e8410600b8410161715615da3575081810a610a7d565b615dad8383615ce8565b805f1904821115615dc057615dc0615883565b029392505050565b5f610e018383615d2a565b5f82615de157615de1615b94565b500490565b5f600160ff1b8203614a3257614a3261588356"; + +/// @dev The runtime bytecode of the contract. +bytes constant RUNTIME_CODE = + hex"608060405260043610610337575f3560e01c8063715018a6116101af578063bbec4d06116100eb578063dd62ed3e11610094578063e70689f51161006e578063e70689f51461098c578063f2fde38b146109ab578063f5647943146109ca578063f5d214f5146109ff5761033e565b8063dd62ed3e146108ce578063e1e6b89814610931578063e5be7d901461096d5761033e565b8063c77b66c2116100c5578063c77b66c214610894578063d09edf31146108a7578063db2088f4146108bb5761033e565b8063bbec4d0614610856578063c54cafee14610875578063c63d75b6146105445761033e565b80638da5cb5b11610158578063a9059cbb11610132578063a9059cbb14610799578063ac9650d8146107b8578063ae57de0c146107e4578063ae98b39f146108035761033e565b80638da5cb5b14610752578063921a4c421461076657806395d89b41146107855761033e565b80637a7af70d116101895780637a7af70d1461070157806381c3fcb91461071457806385b68756146107335761033e565b8063715018a6146106af578063770afee1146106c3578063786cd916146106e25761033e565b8063276b11401161027e5780634abe413711610227578063633ac71711610201578063633ac717146105ff5780636ba235211461061e5780636c876b941461067157806370a08231146106905761033e565b80634abe4137146105a257806356db02e8146105c157806359f89dda146105e05761033e565b8063402d267d11610258578063402d267d14610544578063439fab9114610564578063488bd7b0146105835761033e565b8063276b1140146104df578063313ce567146104f257806338d52e0f146105185761033e565b806318160ddd116102e05780631f6759d3116102ba5780631f6759d31461048d57806323b872dd146104a15780632755c6c7146104c05761033e565b806318160ddd1461043b578063181e7b3b1461044f5780631e4344a11461046e5761033e565b806306fdde031161031157806306fdde03146103e8578063095ea7b3146104095780631423feba146104285761033e565b806301e1d1141461037357806301ffc9a71461039a578063058a628f146103c95761033e565b3661033e57005b73ad6219d71ccf6904c0633e3a8a8c423f54036fd1365f80375f80365f845af43d5f803e80801561036d573d5ff35b3d5ffd5b005b34801561037e575f80fd5b50610387610a32565b6040519081526020015b60405180910390f35b3480156103a5575f80fd5b506103b96103b4366004614dd8565b610a40565b6040519015158152602001610391565b3480156103d4575f80fd5b506103716103e3366004614e13565b610a83565b3480156103f3575f80fd5b506103fc610cac565b6040516103919190614e5c565b348015610414575f80fd5b506103b9610423366004614e6e565b610d7f565b610387610436366004614fa2565b610d96565b348015610446575f80fd5b50610387610de0565b34801561045a575f80fd5b50610387610469366004615001565b610de9565b348015610479575f80fd5b50610371610488366004615021565b610e08565b348015610498575f80fd5b50610387610e94565b3480156104ac575f80fd5b506103b96104bb366004615038565b610ebf565b3480156104cb575f80fd5b506103716104da366004614e6e565b610ee2565b6103876104ed366004615001565b61101c565b3480156104fd575f80fd5b50610506611047565b60405160ff9091168152602001610391565b348015610523575f80fd5b5061052c6110ec565b6040516001600160a01b039091168152602001610391565b34801561054f575f80fd5b5061038761055e366004614e13565b505f1990565b34801561056f575f80fd5b5061038761057e366004615076565b611120565b34801561058e575f80fd5b5061038761059d366004615001565b611399565b3480156105ad575f80fd5b506103876105bc366004614e6e565b6113b1565b3480156105cc575f80fd5b506103876105db3660046150a8565b611452565b3480156105eb575f80fd5b506103716105fa3660046150ef565b611762565b34801561060a575f80fd5b50610371610619366004614e13565b61179a565b348015610629575f80fd5b50610387610638366004614e13565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be701602052604090205490565b34801561067c575f80fd5b5061037161068b366004614e13565b6118c7565b34801561069b575f80fd5b506103876106aa366004614e13565b6119c7565b3480156106ba575f80fd5b50610371611a10565b3480156106ce575f80fd5b506103876106dd3660046150ef565b611a23565b3480156106ed575f80fd5b506103716106fc366004614e6e565b611bdd565b61038761070f366004615001565b611d0e565b34801561071f575f80fd5b5061037161072e366004615076565b611d23565b34801561073e575f80fd5b5061038761074d366004614e6e565b611d5f565b34801561075d575f80fd5b5061052c611e29565b348015610771575f80fd5b50610387610780366004615144565b611e32565b348015610790575f80fd5b506103fc611e5f565b3480156107a4575f80fd5b506103b96107b3366004614e6e565b611eb0565b3480156107c3575f80fd5b506107d76107d23660046151b5565b611ebd565b6040516103919190615224565b3480156107ef575f80fd5b506103876107fe366004615144565b611fa3565b34801561080e575f80fd5b5061038761081d366004614e13565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be702602052604090205490565b348015610861575f80fd5b50610387610870366004615001565b611fc6565b348015610880575f80fd5b5061038761088f3660046152e2565b611fd4565b6103876108a2366004614fa2565b6120a3565b3480156108b2575f80fd5b5061052c6120d2565b6103876108c9366004615001565b6120fa565b3480156108d9575f80fd5b506103876108e8366004615347565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b34801561093c575f80fd5b507f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031661052c565b348015610978575f80fd5b506103716109873660046153f0565b61210e565b348015610997575f80fd5b506103716109a6366004615486565b612245565b3480156109b6575f80fd5b506103716109c5366004614e13565b6123ae565b3480156109d5575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd025442116103b9565b348015610a0a575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0154610387565b5f610a3b610de0565b905090565b5f6001600160e01b031982167f59f89dda000000000000000000000000000000000000000000000000000000001480610a7d5750610a7d82612404565b92915050565b6040517f248a9ca30000000000000000000000000000000000000000000000000000000081527ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f8960048201525f906001600160a01b0383169063248a9ca390602401602060405180830381865afa158015610b00573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2491906154de565b905080610b93576040517f76728ed90000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201527ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f8960248201526044015b60405180910390fd5b6040517f248a9ca30000000000000000000000000000000000000000000000000000000081527f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e760048201525f906001600160a01b0384169063248a9ca390602401602060405180830381865afa158015610c10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3491906154de565b905080610c9e576040517f76728ed90000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201527f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e76024820152604401610b8a565b610ca7836124d2565b505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610cfd906154f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d29906154f5565b8015610d745780601f10610d4b57610100808354040283529160200191610d74565b820191905f5260205f20905b815481529060010190602001808311610d5757829003601f168201915b505050505091505090565b5f33610d8c8185856124e3565b5060019392505050565b5f80610da06124f0565b90505f610dba87610db4335b89865f612547565b8761255b565b9050610dc98787838588612571565b610dd4335b4761277f565b9150505b949350505050565b5f610a3b612828565b5f610e0183670de0b6b3a7640000612987565b612987565b9392505050565b610e10612993565b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054821115610e3e578181555b7fff9fd4facd8bd30d905cc7ffbd03e8829a414df4c6554d155d132c3377868a42610e67611e29565b8254604080516001600160a01b039093168352602083018690528201526060015b60405180910390a15050565b5f807f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7005b5492915050565b5f33610ecc8582856129de565b610ed7858585612a92565b506001949350505050565b610eea612993565b805f03610f2e576040517f5a6084530000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b8a565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115610fab576001600160a01b0383165f90815260028201602052604090208290555b7fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd610fd4611e29565b6001600160a01b038581165f818152600286016020908152604091829020548251959094168552840191909152820185905260608201526080015b60405180910390a1505050565b5f8061103c84611036335b336110306124f0565b5f612547565b85612b21565b9050610e0133610dce565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080545f91906001600160a01b0316803b806110845760126110e4565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e49190615527565b935050505090565b5f807f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326005b546001600160a01b031692915050565b5f8061112a612b38565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156111565750825b90505f8267ffffffffffffffff1660011480156111725750303b155b905081158015611180575080155b156111b7576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001178555831561120257845468ff00000000000000001916680100000000000000001785555b61120a612b60565b5f8780602001905181019061121f9190615594565b905061122e8160200151612b99565b6020810151516001600160a01b031615611274576040517f8951799200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03166112b5576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112be30612d01565b80516112c990612e56565b7ffa89761502e992c8c755fba778ced00f4562485023f656906eb76f5dd65a9fe53360408051808201825284516001600160a01b0316815260208086015190820152905161131892919061568b565b60405180910390a17fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3965050831561138f57845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b5f610e01836113ac335b33866001612547565b612ed3565b5f6113e37f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b604051627eeac760e11b81526001600160a01b03858116600483015260248201859052919091169062fdd58e90604401602060405180830381865afa15801561142e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0191906154de565b5f61145b612ee0565b825f03611494576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61153f846114ca7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b604051627eeac760e11b81526001600160a01b038a81166004830152602482018a9052919091169062fdd58e90604401602060405180830381865afa158015611515573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153991906154de565b90612f0e565b90508015611644577f88e2280ece62e9296d3578b77647db2c11f9fa7e42578e2db5d4262123ffae3e3387878785886040516115809695949392919061572f565b60405180910390a17f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663043fa98733883360405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018890526084810184905260c060a48201525f60c482015260e4015f604051808303815f87803b15801561162d575f80fd5b505af115801561163f573d5f803e3d5ffd5b505050505b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e36040518060a001604052808c6001600160a01b031681526020018b81526020018a8152602001878152602001898152506040516020016116db9190615778565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611708939291906157c3565b5f604051808303815f87803b15801561171f575f80fd5b505af1158015611731573d5f803e3d5ffd5b5093945050505050610dd860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610b8a939291906157c3565b6117a2612993565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700904211611857576001600160a01b0382165f818152600283016020526040908190205490517f81a7897700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610b8a565b6001600160a01b0382165f9081526002820160205260408120557fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd61189a611e29565b604080516001600160a01b03928316815291851660208301525f9082018190526060820152608001610e88565b6118cf612993565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700904211611984576001600160a01b0382165f818152600183016020526040908190205490517ff1b01b5400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610b8a565b6001600160a01b0382165f9081526001820160205260408120557fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af2532695447499161189a611e29565b5f806119d283612f1d565b90505f6119dd612f30565b6001600160a01b0385165f90815260038201602052604081205491925090611a06908490612f91565b5095945050505050565b611a18612993565b611a215f612e56565b565b5f611a2c612ee0565b825f03611a65576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611a7384611539876119c7565b90508015611ac5577f3fc1c49e72362e91416388fe7a107b92db924642476e83e701eeeb6256d7249e3386868487604051611ab29594939291906157ea565b60405180910390a1611ac5853383612a92565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed60405180608001604052808b6001600160a01b031681526020018a815260200187815260200189815250604051602001611b569190615821565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611b83939291906157c3565b5f604051808303815f87803b158015611b9a575f80fd5b505af1158015611bac573d5f803e3d5ffd5b5093945050505050610e0160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611be5612993565b805f03611c29576040517ffd86061b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b8a565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115611ca6576001600160a01b0383165f90815260018201602052604090208290555b7fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af25326954474991611ccf611e29565b6001600160a01b038581165f8181526001860160209081526040918290205482519590941685528401919091528201859052606082015260800161100f565b5f8061103c84611d1d33611027565b8561255b565b7fdaffad82f53a38a62340f14cdd6fd3b437c5dcda6b32029dac1e661dbce28b2d3382604051611d54929190615862565b60405180910390a150565b5f80611d6e8485856001612547565b9050805f03611d80575f915050610a7d565b610dd8611db47f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b604051627eeac760e11b81526001600160a01b03878116600483015260248201879052919091169062fdd58e90604401602060405180830381865afa158015611dff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e2391906154de565b82612987565b5f610a3b61303f565b5f80611e4587610dfc8789886001612547565b9050611e558187878a8888613067565b9695505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610cfd906154f5565b5f33610d8c818585612a92565b604080515f8152602081019091526060908267ffffffffffffffff811115611ee757611ee7614e98565b604051908082528060200260200182016040528015611f1a57816020015b6060815260200190600190039081611f055790505b5091505f5b83811015611f9b57611f7630868684818110611f3d57611f3d6158aa565b9050602002810190611f4f91906158be565b85604051602001611f629392919061591f565b6040516020818303038152906040526133fc565b838281518110611f8857611f886158aa565b6020908102919091010152600101611f1f565b505092915050565b5f80611fb6876113ac8789886001612547565b9050611e55878787848888613067565b5f610e0183610dfc336113a3565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd009085111561203d5760405163725238c160e11b815260048101869052602401610b8a565b5f6120548861204e338a8a5f612547565b5f61255b565b90506120988888838989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061257192505050565b979650505050505050565b5f806120ad6124f0565b90505f6120c3876120bd33610dac565b87612b21565b9050610dc98187898588612571565b5f807fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00611110565b5f8061103c84670de0b6b3a764000061204e565b61211b8585858585613497565b61212584846134fa565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080546040805160a0810182526001600160a01b0388811682528781166020830152918101869052606081018590529116906359f89dda9088907f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4890608081016121cf7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040516121e3919060200161597c565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401612210939291906157c3565b5f604051808303815f87803b158015612227575f80fd5b505af1158015612239573d5f803e3d5ffd5b50505050505050505050565b835f0361227e576040517f8672985d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090505f6040518060a001604052808360020154815260200183600201548152602001878152602001861515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250905084806123185750816002015486115b1561232c5760028201869055602081018690525b7f7ef5cae78e9bd364afb19bb0f8a881a6d156e35a119e28c0d17524e50795815833878787876040516123639594939291906159ee565b60405180910390a181546001600160a01b03166359f89dda337f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d053391846040516020016121e39190615a3c565b6123b6612993565b6001600160a01b0381166123f8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b61240181612e56565b50565b5f6001600160e01b031982167fe5be7d9000000000000000000000000000000000000000000000000000000000148061246657506001600160e01b031982167f439fab9100000000000000000000000000000000000000000000000000000000145b8061249a57506001600160e01b031982167fe1e6b89800000000000000000000000000000000000000000000000000000000145b80610a7d57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610a7d565b6124da612993565b61240181612d01565b610ca783838360016135ba565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090612541906001615a80565b91505090565b5f670de0b6b3a76400005b95945050505050565b5f61256682846136e2565b610dd884845f613726565b612579612ee0565b845f036125b2576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f036125eb576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841661262b576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f0361264d5760405163725238c160e11b81525f6004820152602401610b8a565b7f3377bcbed49a0c0005e53931cd8fe7334b5371523e5de784c0d0d3d01089cfea3385878686866040516126869695949392919061572f565b60405180910390a161269b858585858561373b565b6126a58484613796565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517f6d5b3f780000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690636d5b3f789061271590339088908790899088906004016157ea565b5f604051808303815f87803b15801561272c575f80fd5b505af115801561273e573d5f803e3d5ffd5b5050505061274f85858585856137e3565b61277860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b804710156127c2576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610b8a565b6127db828260405180602001604052805f81525061388f565b156127e4575050565b3d156127f6576127f26138a4565b5050565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80612832612f30565b60028101549091505f03612848576125416138af565b5f6128575f1960036001613915565b90505f5b5f198214610e01575f836002018381548110612879576128796158aa565b905f5260205f2090600502015f0154905060028103612956575f6129468560020185815481106128ab576128ab6158aa565b905f5260205f20906005020160040180546128c5906154f5565b80601f01602080910402602001604051908101604052809291908181526020018280546128f1906154f5565b801561293c5780601f106129135761010080835404028352916020019161293c565b820191905f5260205f20905b81548152906001019060200180831161291f57829003601f168201915b5050505050613a10565b90506129528382613a25565b9250505b5f8381526004850160205260409020546129709083615a80565b915061297f8360036001613915565b92505061285b565b5f610e01838383613aa9565b3361299c611e29565b6001600160a01b031614611a21576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610b8a565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015612a8c5781811015612a7e576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610b8a565b612a8c84848484035f6135ba565b50505050565b6001600160a01b038316612ad4576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b6001600160a01b038216612b16576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b610ca7838383613abe565b5f612b2c82846136e2565b610dd884846001613aa9565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610a7d565b425f03611a21576040517f789a532d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ba1613b11565b612bb381602001518260400151613b19565b80517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432600805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b0393841617825560608401517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601805490921693169283179055604080517f481c6a75000000000000000000000000000000000000000000000000000000008152905191925f92909163481c6a759160048083019260209291908290030181865afa158015612c88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cac9190615a93565b90506001600160a01b0381163014610ca7576040517f7935475e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0382166024820152604401610b8a565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f59f89dda0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612d7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612da09190615aae565b612dd6576040517ffd12061600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03831690811782556040805133815260208101929092527fa8c713fe8fb360697fc0daab836d85208a605d485fbc265aea0f773fc6cdd71a9101610e88565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610e0183836001613726565b612ee8613b2b565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f828218828410028218610e01565b5f80612f2883613b86565b549392505050565b5f8060ff19612f6060017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71615897565b604051602001612f7291815260200190565b60408051601f1981840301815291905280516020909101201692915050565b5f808281612f9d612f30565b9050855f612fae8760036001613915565b90505b5f198114613030579250828115801590612fee57506002836002018281548110612fdd57612fdd6158aa565b905f5260205f2090600502015f0154145b1561301c575f61300c8460020183815481106128ab576128ab6158aa565b90506130188382613a25565b9250505b6130298160036001613915565b9050612fb1565b509350909150505b9250929050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300611110565b61306f612ee0565b855f036130a8576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f036130e1576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516613121576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416613161576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036131845760405163725238c160e11b815260048101839052602401610b8a565b7f2845b9458bcc357e1abfe8de7f6832dfe7220596a053496b33d0deb6577d8d2a338686898787876040516131bf9796959493929190615ac9565b60405180910390a16001600160a01b0384163314613316576131e28433856129de565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663e985e9c585336040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015613266573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061328a9190615aae565b613316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610b8a565b6133208484613bf3565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517fc2530e390000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c2530e399061339090339088908790899088906004016157ea565b5f604051808303815f87803b1580156133a7575f80fd5b505af11580156133b9573d5f803e3d5ffd5b505050506133cb868686868686613c40565b6133f460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b60605f6134098484613d49565b905080801561342a57505f3d118061342a57505f846001600160a01b03163b115b1561343f57613437613d5c565b915050610a7d565b8015613482576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610b8a565b3d156127f6576134906138a4565b5092915050565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03163314612778576040517f8813aac300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054421180159061354357506001600160a01b0383165f908152600182016020526040902054155b801561356657506001600160a01b0382165f908152600282016020526040902054155b15610ca75780546040517f79d7155100000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b03808516602483015283166044820152606401610b8a565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b03851661361d576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b6001600160a01b03841661365f576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561277857836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516136d391815260200190565b60405180910390a35050505050565b818110156127f2576040517fa3e322340000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610b8a565b5f610dd88484670de0b6b3a764000085613d75565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01547fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906137899084613db7565b6001909101555050505050565b6001600160a01b0382166137d8576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b6127f25f8383613abe565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216040518060c0016040528061384c3390565b6001600160a01b031681526020018a6001600160a01b031681526020018881526020018b8152602001898152602001878152506040516020016121e39190615b6e565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f8060ff196138df60017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615897565b6040516020016138f191815260200190565b60408051601f198184030181529190528051602090910120610eb891166002615a80565b5f600783168103613952576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61395b612f30565b60028101549091505f03613973575f19915050610e01565b5f5f1986146139a657816002018681548110613991576139916158aa565b905f5260205f209060050201600301546139a9565b81545b905060028460028111156139bf576139bf615b80565b036139e1576139d8826139d28484613dc6565b87613e41565b92505050610e01565b60018460028111156139f5576139f5615b80565b03613a05576139d8828287613e99565b611e55828287613e41565b5f81806020019051810190610a7d91906154de565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613a83576040517fbf463fe900000000000000000000000000000000000000000000000000000000815260048101849052602401610b8a565b5f613aa0613a9a613a94865f613f06565b85613f60565b5f613fc2565b50949350505050565b5f610dd884670de0b6b3a76400008585613d75565b613ac6614003565b613acf83614069565b613ad882614069565b613ae3838383614160565b6001600160a01b038316613afa57610ca7816142c0565b6001600160a01b038216610ca757610ca781614303565b611a2161433d565b613b2161433d565b6127f2828261437b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203611a21576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060ff19613bb660017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615897565b604051602001613bc891815260200190565b60408051601f1981840301815291815281516020928301205f96875292909216905290922092915050565b6001600160a01b038216613c35576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610b8a565b6127f2825f83613abe565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696040518060c001604052808a6001600160a01b031681526020018b6001600160a01b031681526020018881526020018c815260200189815260200187815250604051602001613ce69190615b6e565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613d13939291906157c3565b5f604051808303815f87803b158015613d2a575f80fd5b505af1158015613d3c573d5f803e3d5ffd5b5050505050505050505050565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b5f613da2613d82836143de565b8015613d9d57505f8480613d9857613d98615b94565b868809115b151590565b613dad86868661440a565b6125529190615a80565b5f828218828411028218610e01565b5f5b5f198214158015613e0a575042836002018381548110613dea57613dea6158aa565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b15613e3b57826002018281548110613e2457613e246158aa565b905f5260205f209060050201600301549150613dc8565b50919050565b5f5b5f198314613e8f575f846002018481548110613e6157613e616158aa565b905f5260205f209060050201905082815f0154165f14613e845783915050610e01565b600301549250613e43565b505f199392505050565b5f5b5f198314613e8f575f846002018481548110613eb957613eb96158aa565b5f918252602090912060059091020160018101549091504267ffffffffffffffff9091161115613ee95750613e8f565b8054831615613efb5783915050610e01565b600301549250613e9b565b5f805f613f1385856144ba565b9150915080613f58576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610b8a565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480613fa5868686866145c0565b915091505f613fb483836146df565b9a9950505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d613ff682828761473d565b9350935050509250929050565b5f61400c612f30565b60028101549091505f0361401d5750565b5f614032826005015460026001176001613915565b90505f195b5f19821461405557508061404e8160036001613915565b9150614037565b5f198114610ca75760058301819055505050565b6001600160a01b03811661407a5750565b5f614083612f30565b6001600160a01b0383165f9081526003820160205260408120549192506140a984612f1d565b90505f806140b78385612f91565b915091508381036140ca57505050505050565b6001600160a01b0386165f9081526003860160205260409020819055818314614101576140f78683614928565b614101838361493a565b6040805185815260208101839052908101849052606081018390526001600160a01b038716907f36a2eb39b73568d38e98721588b15b309c9380e1b1ab575c2c3d71d5148ccb4a9060800160405180910390a26133f484848385614960565b61416a83836134fa565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a6040518060800160405280896001600160a01b03168152602001886001600160a01b0316815260200187815260200161421a7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040805182516001600160a01b03908116602080840191909152840151168183015290820151606080830191909152909101511515608082015260a0016040516020818303038152906040526040518463ffffffff1660e01b8152600401614288939291906157c3565b5f604051808303815f87803b15801561429f575f80fd5b505af11580156142b1573d5f803e3d5ffd5b50505050612a8c8484846149bd565b5f6142c9612f30565b6002810154909150156127f25760058101545f908152600482016020526040812080548492906142fa908490615a80565b90915550505050565b5f61430c612f30565b6002810154909150156127f25760058101545f908152600482016020526040812080548492906142fa908490615897565b6143456149c8565b611a21576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61438361433d565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036143cf8482615bec565b5060048101612a8c8382615bec565b5f60028260038111156143f3576143f3615b80565b6143fd9190615ca8565b60ff166001149050919050565b5f805f61441786866149e6565b91509150815f0361443b5783818161443157614431615b94565b0492505050610e01565b818411614452576144526003851502601118614a02565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f601b83900b831483838261451e577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156144fe57620186a0860595506005850194505b8586601b0b1461451957600a860595508460010194506144fe565b614534565b855f0361453457505f9250600191506130389050565b848560030b14614590575f85121561455457505f92508291506130389050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610b8a565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f80851584151780156145d8575f92505f91506146d5565b6145e28487615cc9565b91505f6145ee88614a13565b90505f6145fa87614a13565b90505f61460783836149e6565b5090505f6f0785ee10d5da46d900f436a00000000082111561463c576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561465d57670de0b6b3a7640000820491506012015b633b9aca0082111561467657633b9aca00820491506009015b61271082111561468b57612710820491506004015b811561469f57600a8204915060010161468b565b6146a98187615cc9565b95506146cb8b8a6146c587876146c087600a615dc8565b614a3c565b89614b17565b9097509550505050505b5094509492505050565b5f805f6146ec85856144ba565b91509150801580156146fc575081155b15613f58576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610b8a565b5f805f851215614783576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610b8a565b845f0361479557505f90506001614920565b8460ff84168501858112156147e0576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610b8a565b5f805f83121561484a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215614821575f809550955050505050614920565b825f03600a0a915081848161483857614838615b94565b04955050840290911491506149209050565b5f83131561491557604d8313156148a0576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610b8a565b82600a0a9150815f19816148b6576148b6615b94565b04841115614903576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610b8a565b50919091029250600191506149209050565b509193506001925050505b935093915050565b5f61493283613b86565b919091555050565b6127f282826149476138af565b6149519190615a80565b61495b9190615897565b614c07565b5f614969612f30565b905083816004015f8781526020019081526020015f205f82825461498d9190615897565b90915550505f838152600482016020526040812080548492906149b1908490615a80565b90915550505050505050565b610ca7838383614c73565b5f6149d1612b38565b5468010000000000000000900460ff16919050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f80821215614a3857600160ff1b8203614a325750600160ff1b919050565b505f0390565b5090565b5f805f614a4986866149e6565b91509150815f03614a635783818161443157614431615b94565b838210614aad576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610b8a565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614bc5577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614bb257614b767f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615a80565b8403614b8a5750600160ff1b905081614bfe565b614b95600a85615dd3565b614b9e90615de6565b614ba9846001615cc9565b91509150614bfe565b614bbb84615de6565b8391509150614bfe565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614bf857614b9e600a85615dd3565b50829050815b94509492505050565b5f60ff19614c3660017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615897565b604051602001614c4891815260200190565b60408051601f198184030181529190528051602090910120614c6c91166002615a80565b9190915550565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416614cc05781816002015f828254614cb59190615a80565b90915550614d499050565b6001600160a01b0384165f9081526020829052604090205482811015614d2b576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101849052606401610b8a565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316614d67576002810180548390039055614d85565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614dca91815260200190565b60405180910390a350505050565b5f60208284031215614de8575f80fd5b81356001600160e01b031981168114610e01575f80fd5b6001600160a01b0381168114612401575f80fd5b5f60208284031215614e23575f80fd5b8135610e0181614dff565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610e016020830184614e2e565b5f8060408385031215614e7f575f80fd5b8235614e8a81614dff565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715614ecf57614ecf614e98565b60405290565b6040516080810167ffffffffffffffff81118282101715614ecf57614ecf614e98565b604051601f8201601f1916810167ffffffffffffffff81118282101715614f2157614f21614e98565b604052919050565b5f67ffffffffffffffff821115614f4257614f42614e98565b50601f01601f191660200190565b5f82601f830112614f5f575f80fd5b8135614f72614f6d82614f29565b614ef8565b818152846020838601011115614f86575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215614fb5575f80fd5b843593506020850135614fc781614dff565b925060408501359150606085013567ffffffffffffffff811115614fe9575f80fd5b614ff587828801614f50565b91505092959194509250565b5f8060408385031215615012575f80fd5b50508035926020909101359150565b5f60208284031215615031575f80fd5b5035919050565b5f805f6060848603121561504a575f80fd5b833561505581614dff565b9250602084013561506581614dff565b929592945050506040919091013590565b5f60208284031215615086575f80fd5b813567ffffffffffffffff81111561509c575f80fd5b610dd884828501614f50565b5f805f80608085870312156150bb575f80fd5b84356150c681614dff565b93506020850135925060408501359150606085013567ffffffffffffffff811115614fe9575f80fd5b5f805f60608486031215615101575f80fd5b833561510c81614dff565b925060208401359150604084013567ffffffffffffffff81111561512e575f80fd5b61513a86828701614f50565b9150509250925092565b5f805f805f60a08688031215615158575f80fd5b85359450602086013561516a81614dff565b9350604086013561517a81614dff565b925060608601359150608086013567ffffffffffffffff81111561519c575f80fd5b6151a888828901614f50565b9150509295509295909350565b5f80602083850312156151c6575f80fd5b823567ffffffffffffffff808211156151dd575f80fd5b818501915085601f8301126151f0575f80fd5b8135818111156151fe575f80fd5b8660208260051b8501011115615212575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015615297577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452615285858351614e2e565b9450928501929085019060010161524b565b5092979650505050505050565b5f8083601f8401126152b4575f80fd5b50813567ffffffffffffffff8111156152cb575f80fd5b602083019150836020828501011115613038575f80fd5b5f805f805f608086880312156152f6575f80fd5b85359450602086013561530881614dff565b935060408601359250606086013567ffffffffffffffff81111561532a575f80fd5b615336888289016152a4565b969995985093965092949392505050565b5f8060408385031215615358575f80fd5b823561536381614dff565b9150602083013561537381614dff565b809150509250929050565b5f82601f83011261538d575f80fd5b8135602067ffffffffffffffff8211156153a9576153a9614e98565b8160051b6153b8828201614ef8565b92835284810182019282810190878511156153d1575f80fd5b83870192505b84831015612098578235825291830191908301906153d7565b5f805f805f60a08688031215615404575f80fd5b853561540f81614dff565b9450602086013561541f81614dff565b9350604086013561542f81614dff565b9250606086013567ffffffffffffffff8082111561544b575f80fd5b61545789838a0161537e565b9350608088013591508082111561546c575f80fd5b506151a88882890161537e565b8015158114612401575f80fd5b5f805f8060608587031215615499575f80fd5b8435935060208501356154ab81615479565b9250604085013567ffffffffffffffff8111156154c6575f80fd5b6154d2878288016152a4565b95989497509550505050565b5f602082840312156154ee575f80fd5b5051919050565b600181811c9082168061550957607f821691505b602082108103613e3b57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215615537575f80fd5b815160ff81168114610e01575f80fd5b5f82601f830112615556575f80fd5b8151615564614f6d82614f29565b818152846020838601011115615578575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f602082840312156155a4575f80fd5b815167ffffffffffffffff808211156155bb575f80fd5b90830190604082860312156155ce575f80fd5b6155d6614eac565b82516155e181614dff565b81526020830151828111156155f4575f80fd5b929092019160808387031215615608575f80fd5b615610614ed5565b835161561b81614dff565b815260208401518381111561562e575f80fd5b61563a88828701615547565b602083015250604084015183811115615651575f80fd5b61565d88828701615547565b6040830152506060840151935061567384614dff565b60608101939093526020810192909252509392505050565b5f6001600160a01b038085168352604060208401528084511660408401526020840151604060608501528181511660808501526020810151608060a08601526156d8610100860182614e2e565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808683030160c08701526157138282614e2e565b9150508260608301511660e08601528093505050509392505050565b5f6001600160a01b03808916835280881660208401525085604083015284606083015283608083015260c060a083015261576c60c0830184614e2e565b98975050505050505050565b602081526001600160a01b0382511660208201526020820151604082015260408201516060820152606082015160808201525f608083015160a080840152610dd860c0840182614e2e565b6001600160a01b0384168152826020820152606060408201525f6125526060830184614e2e565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261209860a0830184614e2e565b602081526001600160a01b03825116602082015260208201516040820152604082015160608201525f6060830151608080840152610dd860a0840182614e2e565b6001600160a01b0383168152604060208201525f610dd86040830184614e2e565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a7d57610a7d615883565b634e487b7160e01b5f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126158f1575f80fd5b83018035915067ffffffffffffffff82111561590b575f80fd5b602001915036819003821315613038575f80fd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b5f815180845260208085019450602084015f5b8381101561597157815187529582019590820190600101615955565b509495945050505050565b602081525f6001600160a01b0380845116602084015280602085015116604084015250604083015160a060608401526159b860c0840182615942565b90506060840151601f198483030160808501526159d58282615942565b9150506080840151151560a08401528091505092915050565b6001600160a01b0386168152846020820152831515604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f19160101949350505050565b602081528151602082015260208201516040820152604082015160608201526060820151151560808201525f608083015160a080840152610dd860c0840182614e2e565b80820180821115610a7d57610a7d615883565b5f60208284031215615aa3575f80fd5b8151610e0181614dff565b5f60208284031215615abe575f80fd5b8151610e0181615479565b5f6001600160a01b03808a16835280891660208401528088166040840152508560608301528460808301528360a083015260e060c0830152615b0e60e0830184614e2e565b9998505050505050505050565b5f6001600160a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160c060a0850152610dd860c0850182614e2e565b602081525f610e016020830184615b1b565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b601f821115610ca757805f5260205f20601f840160051c81016020851015615bcd5750805b601f840160051c820191505b81811015612778575f8155600101615bd9565b815167ffffffffffffffff811115615c0657615c06614e98565b615c1a81615c1484546154f5565b84615ba8565b602080601f831160018114615c4d575f8415615c365750858301515b5f19600386901b1c1916600185901b1785556133f4565b5f85815260208120601f198616915b82811015615c7b57888601518255948401946001909101908401615c5c565b5085821015615c9857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60ff831680615cba57615cba615b94565b8060ff84160691505092915050565b8082018281125f831280158216821582161715611f9b57611f9b615883565b600181815b80851115615d2257815f1904821115615d0857615d08615883565b80851615615d1557918102915b93841c9390800290615ced565b509250929050565b5f82615d3857506001610a7d565b81615d4457505f610a7d565b8160018114615d5a5760028114615d6457615d80565b6001915050610a7d565b60ff841115615d7557615d75615883565b50506001821b610a7d565b5060208310610133831016604e8410600b8410161715615da3575081810a610a7d565b615dad8383615ce8565b805f1904821115615dc057615dc0615883565b029392505050565b5f610e018383615d2a565b5f82615de157615de1615b94565b500490565b5f600160ff1b8203614a3257614a3261588356"; diff --git a/src/generated/LibProdDeployV4.sol b/src/generated/LibProdDeployV4.sol index 5a8a97bf..db5d5169 100644 --- a/src/generated/LibProdDeployV4.sol +++ b/src/generated/LibProdDeployV4.sol @@ -63,6 +63,42 @@ import { CREATION_CODE as STOX_CORPORATE_ACTIONS_FACET_CREATION_0_1_1_GEN, RUNTIME_CODE as STOX_CORPORATE_ACTIONS_FACET_RUNTIME_0_1_1_GEN } from "./0_1_1/StoxCorporateActionsFacet.pointers.sol"; +import { + DEPLOYED_ADDRESS as STOX_RECEIPT_ADDRESS_0_1_30_GEN, + BYTECODE_HASH as STOX_RECEIPT_CODEHASH_0_1_30_GEN, + CREATION_CODE as STOX_RECEIPT_CREATION_0_1_30_GEN, + RUNTIME_CODE as STOX_RECEIPT_RUNTIME_0_1_30_GEN +} from "./0_1_30/StoxReceipt.pointers.sol"; +import { + DEPLOYED_ADDRESS as STOX_RECEIPT_VAULT_ADDRESS_0_1_30_GEN, + BYTECODE_HASH as STOX_RECEIPT_VAULT_CODEHASH_0_1_30_GEN, + CREATION_CODE as STOX_RECEIPT_VAULT_CREATION_0_1_30_GEN, + RUNTIME_CODE as STOX_RECEIPT_VAULT_RUNTIME_0_1_30_GEN +} from "./0_1_30/StoxReceiptVault.pointers.sol"; +import { + DEPLOYED_ADDRESS as STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_ADDRESS_0_1_30_GEN, + BYTECODE_HASH as STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH_0_1_30_GEN, + CREATION_CODE as STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CREATION_0_1_30_GEN, + RUNTIME_CODE as STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RUNTIME_0_1_30_GEN +} from "./0_1_30/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol"; +import { + DEPLOYED_ADDRESS as STOX_CORPORATE_ACTIONS_FACET_ADDRESS_0_1_30_GEN, + BYTECODE_HASH as STOX_CORPORATE_ACTIONS_FACET_CODEHASH_0_1_30_GEN, + CREATION_CODE as STOX_CORPORATE_ACTIONS_FACET_CREATION_0_1_30_GEN, + RUNTIME_CODE as STOX_CORPORATE_ACTIONS_FACET_RUNTIME_0_1_30_GEN +} from "./0_1_30/StoxCorporateActionsFacet.pointers.sol"; +import { + DEPLOYED_ADDRESS as ST0X_ORCHESTRATOR_ADDRESS_0_1_30_GEN, + BYTECODE_HASH as ST0X_ORCHESTRATOR_CODEHASH_0_1_30_GEN, + CREATION_CODE as ST0X_ORCHESTRATOR_CREATION_0_1_30_GEN, + RUNTIME_CODE as ST0X_ORCHESTRATOR_RUNTIME_0_1_30_GEN +} from "./0_1_30/ST0xOrchestrator.pointers.sol"; +import { + DEPLOYED_ADDRESS as ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_ADDRESS_0_1_30_GEN, + BYTECODE_HASH as ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_CODEHASH_0_1_30_GEN, + CREATION_CODE as ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_CREATION_0_1_30_GEN, + RUNTIME_CODE as ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_RUNTIME_0_1_30_GEN +} from "./0_1_30/ST0xOrchestratorBeaconSetDeployer.pointers.sol"; import { DEPLOYED_ADDRESS as STOX_RECEIPT_ADDRESS_CANDIDATE_GEN, BYTECODE_HASH as STOX_RECEIPT_CODEHASH_CANDIDATE_GEN, @@ -203,6 +239,38 @@ library LibProdDeployV4 { bytes32 constant STOX_CORPORATE_ACTIONS_FACET_CODEHASH_0_1_1 = STOX_CORPORATE_ACTIONS_FACET_CODEHASH_0_1_1_GEN; bytes constant STOX_CORPORATE_ACTIONS_FACET_CREATION_CODE_0_1_1 = STOX_CORPORATE_ACTIONS_FACET_CREATION_0_1_1_GEN; bytes constant STOX_CORPORATE_ACTIONS_FACET_RUNTIME_CODE_0_1_1 = STOX_CORPORATE_ACTIONS_FACET_RUNTIME_0_1_1_GEN; + address constant STOX_RECEIPT_0_1_30 = STOX_RECEIPT_ADDRESS_0_1_30_GEN; + bytes32 constant STOX_RECEIPT_CODEHASH_0_1_30 = STOX_RECEIPT_CODEHASH_0_1_30_GEN; + bytes constant STOX_RECEIPT_CREATION_CODE_0_1_30 = STOX_RECEIPT_CREATION_0_1_30_GEN; + bytes constant STOX_RECEIPT_RUNTIME_CODE_0_1_30 = STOX_RECEIPT_RUNTIME_0_1_30_GEN; + address constant STOX_RECEIPT_VAULT_0_1_30 = STOX_RECEIPT_VAULT_ADDRESS_0_1_30_GEN; + bytes32 constant STOX_RECEIPT_VAULT_CODEHASH_0_1_30 = STOX_RECEIPT_VAULT_CODEHASH_0_1_30_GEN; + bytes constant STOX_RECEIPT_VAULT_CREATION_CODE_0_1_30 = STOX_RECEIPT_VAULT_CREATION_0_1_30_GEN; + bytes constant STOX_RECEIPT_VAULT_RUNTIME_CODE_0_1_30 = STOX_RECEIPT_VAULT_RUNTIME_0_1_30_GEN; + address constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_0_1_30 = + STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_ADDRESS_0_1_30_GEN; + bytes32 constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH_0_1_30 = + STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH_0_1_30_GEN; + bytes constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CREATION_CODE_0_1_30 = + STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CREATION_0_1_30_GEN; + bytes constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RUNTIME_CODE_0_1_30 = + STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RUNTIME_0_1_30_GEN; + address constant STOX_CORPORATE_ACTIONS_FACET_0_1_30 = STOX_CORPORATE_ACTIONS_FACET_ADDRESS_0_1_30_GEN; + bytes32 constant STOX_CORPORATE_ACTIONS_FACET_CODEHASH_0_1_30 = STOX_CORPORATE_ACTIONS_FACET_CODEHASH_0_1_30_GEN; + bytes constant STOX_CORPORATE_ACTIONS_FACET_CREATION_CODE_0_1_30 = STOX_CORPORATE_ACTIONS_FACET_CREATION_0_1_30_GEN; + bytes constant STOX_CORPORATE_ACTIONS_FACET_RUNTIME_CODE_0_1_30 = STOX_CORPORATE_ACTIONS_FACET_RUNTIME_0_1_30_GEN; + address constant ST0X_ORCHESTRATOR_0_1_30 = ST0X_ORCHESTRATOR_ADDRESS_0_1_30_GEN; + bytes32 constant ST0X_ORCHESTRATOR_CODEHASH_0_1_30 = ST0X_ORCHESTRATOR_CODEHASH_0_1_30_GEN; + bytes constant ST0X_ORCHESTRATOR_CREATION_CODE_0_1_30 = ST0X_ORCHESTRATOR_CREATION_0_1_30_GEN; + bytes constant ST0X_ORCHESTRATOR_RUNTIME_CODE_0_1_30 = ST0X_ORCHESTRATOR_RUNTIME_0_1_30_GEN; + address constant ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_0_1_30 = + ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_ADDRESS_0_1_30_GEN; + bytes32 constant ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_CODEHASH_0_1_30 = + ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_CODEHASH_0_1_30_GEN; + bytes constant ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_CREATION_CODE_0_1_30 = + ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_CREATION_0_1_30_GEN; + bytes constant ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_RUNTIME_CODE_0_1_30 = + ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_RUNTIME_0_1_30_GEN; address constant STOX_RECEIPT_CANDIDATE = STOX_RECEIPT_ADDRESS_CANDIDATE_GEN; bytes32 constant STOX_RECEIPT_CODEHASH_CANDIDATE = STOX_RECEIPT_CODEHASH_CANDIDATE_GEN; bytes constant STOX_RECEIPT_CREATION_CODE_CANDIDATE = STOX_RECEIPT_CREATION_CANDIDATE_GEN; diff --git a/test/src/lib/LibProdDeployV4.t.sol b/test/src/lib/LibProdDeployV4.t.sol index 00b564dd..39fcd8ae 100644 --- a/test/src/lib/LibProdDeployV4.t.sol +++ b/test/src/lib/LibProdDeployV4.t.sol @@ -326,6 +326,29 @@ contract LibProdDeployV4Test is Test { keccak256(LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_RUNTIME_CODE_0_1_1), LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_CODEHASH_0_1_1 ); + assertEq( + keccak256(LibProdDeployV4.STOX_RECEIPT_RUNTIME_CODE_0_1_30), LibProdDeployV4.STOX_RECEIPT_CODEHASH_0_1_30 + ); + assertEq( + keccak256(LibProdDeployV4.STOX_RECEIPT_VAULT_RUNTIME_CODE_0_1_30), + LibProdDeployV4.STOX_RECEIPT_VAULT_CODEHASH_0_1_30 + ); + assertEq( + keccak256(LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RUNTIME_CODE_0_1_30), + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH_0_1_30 + ); + assertEq( + keccak256(LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_RUNTIME_CODE_0_1_30), + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_CODEHASH_0_1_30 + ); + assertEq( + keccak256(LibProdDeployV4.ST0X_ORCHESTRATOR_RUNTIME_CODE_0_1_30), + LibProdDeployV4.ST0X_ORCHESTRATOR_CODEHASH_0_1_30 + ); + assertEq( + keccak256(LibProdDeployV4.ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_RUNTIME_CODE_0_1_30), + LibProdDeployV4.ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_CODEHASH_0_1_30 + ); assertEq( keccak256(LibProdDeployV4.STOX_RECEIPT_RUNTIME_CODE_CANDIDATE), LibProdDeployV4.STOX_RECEIPT_CODEHASH_CANDIDATE @@ -534,6 +557,84 @@ contract LibProdDeployV4Test is Test { ); } + // --- 0.1.30 frozen redeploys (the audited orchestrator set: source at + // tag `sol-v0.1.30`, commit 4f126183, the commit Protofire's `st0x.deploy + // 6.0` report (Aug 2026) reviews; it compiles byte-identically to this + // snapshot). The snapshot is deliberately PARTIAL: only the orchestrator's + // on-chain dependency closure is frozen — the wrapped-token-vault chain, + // the authorizers and the unified deployer stay 0.1.1-only, since their + // production instances come from the audited 0.1.1 bootstrap set. All six + // frozen contracts have a distinct (creation code, address) pair vs 0.1.1 + // — the H01 remediation's optimizer change (5000 -> 2000 runs) moved + // every address, so unlike earlier releases there are no 0.1.1 twins. --- + + function testFrozenRedeployStoxReceipt_0_1_30() external { + LibRainDeploy.etchZoltuFactory(vm); + _assertFrozenRedeploy( + LibProdDeployV4.STOX_RECEIPT_CREATION_CODE_0_1_30, + LibProdDeployV4.STOX_RECEIPT_0_1_30, + LibProdDeployV4.STOX_RECEIPT_RUNTIME_CODE_0_1_30, + LibProdDeployV4.STOX_RECEIPT_CODEHASH_0_1_30 + ); + } + + function testFrozenRedeployStoxReceiptVault_0_1_30() external { + LibRainDeploy.etchZoltuFactory(vm); + _assertFrozenRedeploy( + LibProdDeployV4.STOX_RECEIPT_VAULT_CREATION_CODE_0_1_30, + LibProdDeployV4.STOX_RECEIPT_VAULT_0_1_30, + LibProdDeployV4.STOX_RECEIPT_VAULT_RUNTIME_CODE_0_1_30, + LibProdDeployV4.STOX_RECEIPT_VAULT_CODEHASH_0_1_30 + ); + } + + function testFrozenRedeployStoxCorporateActionsFacet_0_1_30() external { + LibRainDeploy.etchZoltuFactory(vm); + _assertFrozenRedeploy( + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_CREATION_CODE_0_1_30, + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_0_1_30, + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_RUNTIME_CODE_0_1_30, + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_CODEHASH_0_1_30 + ); + } + + /// Its constructor builds two beacons over the receipt and receipt-vault + /// impls, so both are deployed (frozen, at their 0.1.30 addresses) first. + function testFrozenRedeployStoxOffchainAssetReceiptVaultBeaconSetDeployer_0_1_30() external { + LibRainDeploy.etchZoltuFactory(vm); + LibRainDeploy.deployZoltu(LibProdDeployV4.STOX_RECEIPT_CREATION_CODE_0_1_30); + LibRainDeploy.deployZoltu(LibProdDeployV4.STOX_RECEIPT_VAULT_CREATION_CODE_0_1_30); + _assertFrozenRedeploy( + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CREATION_CODE_0_1_30, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_0_1_30, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RUNTIME_CODE_0_1_30, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH_0_1_30 + ); + } + + function testFrozenRedeployST0xOrchestrator_0_1_30() external { + LibRainDeploy.etchZoltuFactory(vm); + _assertFrozenRedeploy( + LibProdDeployV4.ST0X_ORCHESTRATOR_CREATION_CODE_0_1_30, + LibProdDeployV4.ST0X_ORCHESTRATOR_0_1_30, + LibProdDeployV4.ST0X_ORCHESTRATOR_RUNTIME_CODE_0_1_30, + LibProdDeployV4.ST0X_ORCHESTRATOR_CODEHASH_0_1_30 + ); + } + + /// Its constructor builds an `UpgradeableBeacon` over the orchestrator impl, + /// so the impl is deployed (frozen, at its 0.1.30 address) first. + function testFrozenRedeployST0xOrchestratorBeaconSetDeployer_0_1_30() external { + LibRainDeploy.etchZoltuFactory(vm); + LibRainDeploy.deployZoltu(LibProdDeployV4.ST0X_ORCHESTRATOR_CREATION_CODE_0_1_30); + _assertFrozenRedeploy( + LibProdDeployV4.ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_CREATION_CODE_0_1_30, + LibProdDeployV4.ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_0_1_30, + LibProdDeployV4.ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_RUNTIME_CODE_0_1_30, + LibProdDeployV4.ST0X_ORCHESTRATOR_BEACON_SET_DEPLOYER_CODEHASH_0_1_30 + ); + } + // --- candidate movers' frozen redeploys (seven candidate contracts differ // from the audited 0.1.1 set: the corporate-actions facet plus the receipt // vault, OARV beacon-set deployer, unified deployer, orchestrator, and