diff --git a/agent/flow-trace/00_INDEX.md b/agent/flow-trace/00_INDEX.md index d2de50871a..4d2c9eb5f3 100644 --- a/agent/flow-trace/00_INDEX.md +++ b/agent/flow-trace/00_INDEX.md @@ -170,7 +170,7 @@ _Found during source-code cross-referencing of these trace documents._ | 5 | `E3Requested` event is `(uint256 e3Id, E3 e3, IE3Program indexed e3Program)` — seed and params are inside the E3 struct, not separate parameters. | IEnclave.sol:82 | 03_E3_REQUEST | | 6 | `finalizeCommittee()` checks `>=` deadline, not `>`. | CiphernodeRegistryOwnable.sol | 03_E3_REQUEST | | 7 | `publishCommittee()` is `onlyOwner` restricted — centralized trust assumption acknowledged in contract TODOs. | CiphernodeRegistryOwnable.sol | 04_DKG | -| 8 | `CommitteePublished` event emits `(e3Id, nodes, publicKey)` — full PK bytes, not just pkHash. | CiphernodeRegistryOwnable.sol | 04_DKG | +| 8 | `CommitteePublished` event emits `(e3Id, nodes, publicKey, proof)` — full PK bytes and C5 proof, not just pkHash. | CiphernodeRegistryOwnable.sol | 04_DKG | | 9 | `_validateNodeEligibility` calls `bondingRegistry.getTicketBalanceAtBlock()` (not `ticketToken.getPastVotes()` directly). | CiphernodeRegistryOwnable.sol:668 | 03_E3_REQUEST | | 10 | Lane A slashing uses **attestation-based** verification (committee quorum votes), not direct ZK proof re-verification on-chain. `proposeSlash()` decodes voter addresses, agrees, data hashes, and ECDSA signatures — not ZK proofs. | SlashingManager.sol | 05_FAILURE | diff --git a/agent/flow-trace/04_DKG_AND_COMPUTATION.md b/agent/flow-trace/04_DKG_AND_COMPUTATION.md index 651107e2ac..c55cba459e 100644 --- a/agent/flow-trace/04_DKG_AND_COMPUTATION.md +++ b/agent/flow-trace/04_DKG_AND_COMPUTATION.md @@ -505,7 +505,7 @@ PublicKeyAggregator (AGGREGATOR) collects KeyshareCreated events │ │ │ │ Emit E3StageChanged(KeyPublished) │ │ │ │ │ │ } │ │ │ │ │ └──────────────────────────────────────┘ │ - │ │ 6. Emit CommitteePublished(e3Id, nodes, pk) │ + │ │ 6. Emit CommitteePublished(e3Id, nodes, pk, C5 proof) │ │ │ → Note: emits full pk bytes, NOT just pkHash │ │ │ } │ │ └─────────────────────────────────────────────────────┘ @@ -706,7 +706,7 @@ ThresholdPlaintextAggregator receives DecryptionshareCreated events │ │ │ │ registered operator │ │ │ │ │ │ 6. Emit RewardsDistributed │ │ │ │ │ └──────────────────────────────────────┘ │ - │ │ 7. Emit PlaintextOutputPublished(e3Id, output) │ + │ │ 7. Emit PlaintextOutputPublished(e3Id, output, C7 proof) │ │ │ 8. Emit E3StageChanged(Complete) │ │ │ } │ │ └─────────────────────────────────────────────────────┘ diff --git a/agent/flow-trace/06_DEACTIVATION_AND_COMPLETION.md b/agent/flow-trace/06_DEACTIVATION_AND_COMPLETION.md index ce1ccb5f96..477b460263 100644 --- a/agent/flow-trace/06_DEACTIVATION_AND_COMPLETION.md +++ b/agent/flow-trace/06_DEACTIVATION_AND_COMPLETION.md @@ -165,7 +165,7 @@ publishPlaintextOutput() succeeds │ │ │ remainder sent to protocol treasury │ │ │ → If no escrowed funds: no-op │ │ └─ Emit RewardsDistributed(e3Id) -│ └─ Emit PlaintextOutputPublished, E3StageChanged(Complete) +│ └─ Emit PlaintextOutputPublished(e3Id, plaintext, proof), E3StageChanged(Complete) │ └─ RUST-SIDE (cleanup via E3RequestComplete): │ diff --git a/crates/events/src/enclave_event/committee_published.rs b/crates/events/src/enclave_event/committee_published.rs index abb2e79dfa..b39afb7f2e 100644 --- a/crates/events/src/enclave_event/committee_published.rs +++ b/crates/events/src/enclave_event/committee_published.rs @@ -15,16 +15,18 @@ pub struct CommitteePublished { pub e3_id: E3id, pub nodes: Vec, pub public_key: Vec, + pub proof: Vec, } impl Display for CommitteePublished { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, - "e3_id: {}, nodes: {:?}, public_key_len: {}", + "e3_id: {}, nodes: {:?}, public_key_len: {}, proof_len: {}", self.e3_id, self.nodes, - self.public_key.len() + self.public_key.len(), + self.proof.len() ) } } diff --git a/crates/events/src/enclave_event/plaintext_output_published.rs b/crates/events/src/enclave_event/plaintext_output_published.rs index aa0c715afc..94a6b13541 100644 --- a/crates/events/src/enclave_event/plaintext_output_published.rs +++ b/crates/events/src/enclave_event/plaintext_output_published.rs @@ -14,15 +14,17 @@ use std::fmt::{self, Display}; pub struct PlaintextOutputPublished { pub e3_id: E3id, pub plaintext_output: Vec, + pub proof: Vec, } impl Display for PlaintextOutputPublished { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, - "e3_id: {}, plaintext_output_len: {}", + "e3_id: {}, plaintext_output_len: {}, proof_len: {}", self.e3_id, - self.plaintext_output.len() + self.plaintext_output.len(), + self.proof.len() ) } } diff --git a/crates/evm-helpers/src/events.rs b/crates/evm-helpers/src/events.rs index 1e3468ca04..b570fae253 100644 --- a/crates/evm-helpers/src/events.rs +++ b/crates/evm-helpers/src/events.rs @@ -58,10 +58,10 @@ sol! { event CiphertextOutputPublished(uint256 indexed e3Id, bytes ciphertextOutput); #[derive(Debug)] - event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput); + event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput, bytes proof); #[derive(Debug)] - event CommitteePublished(uint256 indexed e3Id, address[] nodes, bytes publicKey); + event CommitteePublished(uint256 indexed e3Id, address[] nodes, bytes publicKey, bytes proof); #[derive(Debug)] enum E3Stage { diff --git a/crates/evm-helpers/tests/fixtures/fake_enclave.sol b/crates/evm-helpers/tests/fixtures/fake_enclave.sol index 87c4004cf1..dbe7649fce 100644 --- a/crates/evm-helpers/tests/fixtures/fake_enclave.sol +++ b/crates/evm-helpers/tests/fixtures/fake_enclave.sol @@ -9,8 +9,8 @@ pragma solidity >=0.4.24; contract FakeEnclave { event InputPublished(uint256 indexed e3Id, bytes data, uint256 inputHash, uint256 index); event CiphertextOutputPublished(uint256 indexed e3Id, bytes ciphertextOutput); - event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput); - event CommitteePublished(uint256 indexed e3Id, address[] nodes, bytes publicKey); + event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput, bytes proof); + event CommitteePublished(uint256 indexed e3Id, address[] nodes, bytes publicKey, bytes proof); // Emit InputPublished event with passed test data function emitInputPublished(uint256 e3Id, bytes memory data, uint256 inputHash, uint256 index) public { @@ -23,14 +23,14 @@ contract FakeEnclave { } // Emit PlaintextOutputPublished event with passed test data - function emitPlaintextOutputPublished(uint256 e3Id, bytes memory plaintextOutput) public { - emit PlaintextOutputPublished(e3Id, plaintextOutput); + function emitPlaintextOutputPublished(uint256 e3Id, bytes memory plaintextOutput, bytes memory proof) public { + emit PlaintextOutputPublished(e3Id, plaintextOutput, proof); } // Emit CommitteePublished event with passed test data - function emitCommitteePublished(uint256 e3Id, bytes memory publicKey) public { + function emitCommitteePublished(uint256 e3Id, bytes memory publicKey, bytes memory proof) public { address[] memory nodes = new address[](1); - emit CommitteePublished(e3Id, nodes, publicKey); + emit CommitteePublished(e3Id, nodes, publicKey, proof); } function getE3(uint256 _e3Id) external view returns (E3 memory e3) { diff --git a/crates/indexer/src/indexer.rs b/crates/indexer/src/indexer.rs index c30e80e0ae..f1757eb40e 100644 --- a/crates/indexer/src/indexer.rs +++ b/crates/indexer/src/indexer.rs @@ -337,9 +337,10 @@ impl EnclaveIndexer { let e3_id = u64_try_from(e.e3Id)?; info!( - "CommitteePublished: id={}, public_key_len={}", + "CommitteePublished: id={}, public_key_len={}, proof_len={}", e.e3Id, - e.publicKey.len() + e.publicKey.len(), + e.proof.len() ); let e3 = contract.get_e3(e.e3Id).await?; @@ -403,9 +404,10 @@ impl EnclaveIndexer { self.add_event_handler(move |e: PlaintextOutputPublished, ctx| async move { let store = ctx.store(); info!( - "PlaintextOutputPublished: e3_id={}, output=0x{}...", + "PlaintextOutputPublished: e3_id={}, output=0x{}..., proof_len={}", e.e3Id, - hex::encode(&e.plaintextOutput[..8.min(e.plaintextOutput.len())]) + hex::encode(&e.plaintextOutput[..8.min(e.plaintextOutput.len())]), + e.proof.len() ); let e3_id = u64_try_from(e.e3Id)?; let mut repo = E3Repository::new(store, e3_id); diff --git a/crates/indexer/tests/fixtures/fake_enclave.sol b/crates/indexer/tests/fixtures/fake_enclave.sol index 925e7d3e95..2ae26dc98c 100644 --- a/crates/indexer/tests/fixtures/fake_enclave.sol +++ b/crates/indexer/tests/fixtures/fake_enclave.sol @@ -9,8 +9,8 @@ pragma solidity >=0.4.24; contract FakeEnclave { event InputPublished(uint256 indexed e3Id, bytes data, uint256 inputHash, uint256 index); event CiphertextOutputPublished(uint256 indexed e3Id, bytes ciphertextOutput); - event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput); - event CommitteePublished(uint256 indexed e3Id, address[] nodes, bytes publicKey); + event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput, bytes proof); + event CommitteePublished(uint256 indexed e3Id, address[] nodes, bytes publicKey, bytes proof); // Emit InputPublished event with passed test data function emitInputPublished(uint256 e3Id, bytes memory data, uint256 inputHash, uint256 index) public { @@ -23,14 +23,14 @@ contract FakeEnclave { } // Emit PlaintextOutputPublished event with passed test data - function emitPlaintextOutputPublished(uint256 e3Id, bytes memory plaintextOutput) public { - emit PlaintextOutputPublished(e3Id, plaintextOutput); + function emitPlaintextOutputPublished(uint256 e3Id, bytes memory plaintextOutput, bytes memory proof) public { + emit PlaintextOutputPublished(e3Id, plaintextOutput, proof); } // Emit CommitteePublished event with passed test data - function emitCommitteePublished(uint256 e3Id, bytes memory publicKey) public { + function emitCommitteePublished(uint256 e3Id, bytes memory publicKey, bytes memory proof) public { address[] memory nodes = new address[](1); - emit CommitteePublished(e3Id, nodes, publicKey); + emit CommitteePublished(e3Id, nodes, publicKey, proof); } function getE3(uint256 _e3Id) external view returns (E3 memory e3) { diff --git a/crates/indexer/tests/integration.rs b/crates/indexer/tests/integration.rs index 52f553ad21..fa32b6e142 100644 --- a/crates/indexer/tests/integration.rs +++ b/crates/indexer/tests/integration.rs @@ -113,7 +113,11 @@ async fn test_indexer() -> Result<()> { // first publish committee pk enclave_contract - .emitCommitteePublished(Uint::from(E3_ID), Bytes::from(pk.to_bytes())) + .emitCommitteePublished( + Uint::from(E3_ID), + Bytes::from(pk.to_bytes()), + Bytes::default(), + ) .send() .await? .watch() diff --git a/docs/pages/building-with-enclave.mdx b/docs/pages/building-with-enclave.mdx index 373484c8ea..a553e15410 100644 --- a/docs/pages/building-with-enclave.mdx +++ b/docs/pages/building-with-enclave.mdx @@ -223,7 +223,7 @@ event E3StageChanged(uint256 indexed e3Id, E3Stage previousStage, E3Stage newSta event CiphertextOutputPublished(uint256 indexed e3Id, bytes ciphertextOutput); -event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput); +event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput, bytes proof); event E3Failed(uint256 indexed e3Id, E3Stage failedAtStage, FailureReason reason); @@ -273,8 +273,8 @@ const e3Id = receipt.logs ### Monitoring Results ```javascript -enclaveContract.on('PlaintextOutputPublished', (e3Id, plaintext) => { - console.log(`Computation ${e3Id} completed with result:`, plaintext) +enclaveContract.on('PlaintextOutputPublished', (e3Id, plaintext, proof) => { + console.log(`Computation ${e3Id} completed with result:`, plaintext, proof) }) ``` diff --git a/docs/pages/computation-flow.mdx b/docs/pages/computation-flow.mdx index 1336535d5d..0e467994de 100644 --- a/docs/pages/computation-flow.mdx +++ b/docs/pages/computation-flow.mdx @@ -113,7 +113,7 @@ function getE3(uint256 e3Id) external view returns (E3 memory e3); or by listening to the `PlaintextOutputPublished` event. ```solidity -event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput); +event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput, bytes proof); ``` Upon successful decryption, rewards are distributed to the active committee members. diff --git a/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json b/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json index 9db1085ab1..b70940cb23 100644 --- a/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json +++ b/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json @@ -801,6 +801,12 @@ "internalType": "bytes", "name": "plaintextOutput", "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "proof", + "type": "bytes" } ], "name": "PlaintextOutputPublished", @@ -2150,11 +2156,11 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b614a13806100d65f395ff3fe608060405234801561000f575f5ffd5b50600436106102c3575f3560e01c806390173a4111610177578063cb649617116100d5578063ea71aa571161008f578063ea71aa5714610745578063f0691cba14610758578063f2fde38b1461076b578063f81b8ef61461077e578063fad8e11114610791578063fbdb3237146107a4578063fd2f3d01146107cc575f5ffd5b8063cb649617146106c1578063cbd16872146106ca578063cf0f34c4146106dd578063cfbdc98d146106f0578063da16fb2f1461071f578063e59e469514610732575f5ffd5b8063ac3d2f4211610131578063ac3d2f4214610618578063b27392d514610640578063b68fd1be14610653578063bb2d1b8214610666578063bff232c114610679578063c1ab0f1f1461068c578063c4ccafa21461069f575f5ffd5b806390173a41146105815780639117173c1461059657806392312386146105a9578063929a8faf146105bc57806399c6679d146105dd5780639c8570c814610605575f5ffd5b80634fc77264116102245780637c8c3b4d116101de5780637c8c3b4d146105085780637cfa9d741461051b57806381476ec21461052e57806385814243146105415780638da5cb5b146105545780638dcdd86b1461055c5780638e5ce3ad1461056e575f5ffd5b80634fc772641461049d57806364226409146104b0578063647846a5146104d15780636db5c8fd146104e4578063715018a6146104ed57806377868ae4146104f5575f5ffd5b80631ba72945116102805780631ba729451461039057806336c5d38a146103a35780634017daf0146103d2578063406ed35c146103ff5780634147a3601461041f578063459d92941461044c5780634e92ec631461048a575f5ffd5b806301d12f1c146102c757806302a3a9c9146102dc5780630ef81b2f146102ef57806310bc62811461032d57806311bd61d91461035557806315cce2241461037d575b5f5ffd5b6102da6102d5366004613b37565b6107df565b005b6102da6102ea366004613be7565b610945565b6103176102fd366004613c02565b5f908152600960205260409020546001600160a01b031690565b6040516103249190613c26565b60405180910390f35b61031761033b366004613c02565b60096020525f90815260409020546001600160a01b031681565b610368610363366004613c4d565b6109f1565b60405163ffffffff9091168152602001610324565b6102da61038b366004613be7565b610a2d565b6102da61039e366004613c75565b610ad2565b6103c56103b1366004613c02565b5f908152600f602052604090205460ff1690565b6040516103249190613cb7565b6103e56103e0366004613c02565b610ae6565b6040516103249e9d9c9b9a99989796959493929190613d03565b61041261040d366004613c02565b610d10565b6040516103249190613ef3565b61043e61042d366004613c02565b600c6020525f908152604090205481565b604051908152602001610324565b61047a61045a366004613f05565b8051602081830181018051600b8252928201919093012091525460ff1681565b6040519015158152602001610324565b6102da610498366004613c02565b61100d565b6102da6104ab366004613be7565b61109c565b6104c36104be366004613f3e565b61112f565b604051610324929190613f75565b600454610317906001600160a01b031681565b61043e60055481565b6102da61193b565b6102da610503366004613f8d565b61194e565b6102da610516366004613fbe565b6119e6565b6102da610529366004613c02565b611a6f565b6102da61053c366004613fec565b611b6d565b600154610317906001600160a01b031681565b610317611c60565b5f54610317906001600160a01b031681565b600354610317906001600160a01b031681565b610589611c8e565b604051610324919061400c565b6102da6105a4366004613c02565b611cd4565b6105896105b7366004613c02565b611e7c565b6105cf6105ca366004613c02565b611ed5565b60405161032492919061402d565b6103176105eb366004613c02565b5f908152601060205260409020546001600160a01b031690565b61047a610613366004614080565b611efc565b610317610626366004613c02565b5f908152600a60205260409020546001600160a01b031690565b61047a61064e3660046140f7565b612194565b6102da610661366004613f8d565b6123c0565b6102da61067436600461419c565b612457565b6102da610687366004613be7565b612542565b6102da61069a366004613fec565b6125e9565b61047a6106ad366004613be7565b60076020525f908152604090205460ff1681565b61043e60065481565b6102da6106d8366004613fbe565b6126cc565b6102da6106eb366004613c02565b61277f565b6107126106fe366004613c02565b5f908152600d602052604090205460ff1690565b60405161032491906141d4565b61043e61072d366004613f3e565b6127bc565b6102da610740366004613be7565b6127c6565b6102da6107533660046141e2565b612860565b600254610317906001600160a01b031681565b6102da610779366004613be7565b612973565b6103c561078c366004613c02565b6129ad565b6102da61079f366004613be7565b612b47565b6103176107b2366004613c02565b600a6020525f90815260409020546001600160a01b031681565b6102da6107da366004613be7565b612bdf565b5f6107e8612c6e565b805490915060ff600160401b82041615906001600160401b03165f8115801561080e5750825b90505f826001600160401b031660011480156108295750303b155b905081158015610837575080155b156108555760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561087f57845460ff60401b1916600160401b1785555b61088833612c98565b6108918861277f565b61089a8c612b47565b6108a38b6127c6565b6108ac8a610945565b6108b589610a2d565b6108be87612ca9565b6108c7866123c0565b6108cf611c60565b6001600160a01b03168d6001600160a01b0316146108f0576108f08d612973565b831561093657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b61094d612ddd565b6001600160a01b0381166109a85760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964204533526566756e644d616e6167657220616464726573730060448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f9557d04c1c0b16f93f13b69aed23b3b6ab935bff3c53ac81d17896d3583542ed905f90a250565b6012602052815f5260405f208160028110610a0a575f80fd5b60089182820401919006600402915091509054906101000a900463ffffffff1681565b610a35612ddd565b6001600160a01b03811615801590610a5b57506004546001600160a01b03828116911614155b8190610a7b5760405163eddf07f560e01b815260040161099f9190613c26565b50600480546001600160a01b0319166001600160a01b0383161790556040517f722ff84c1234b2482061def5c82c6b5080c117b3cbb69d686844a051e4b8e7f390610ac7908390613c26565b60405180910390a150565b610ada612ddd565b610ae381612ca9565b50565b60086020525f9081526040902080546001820154600283015460058401546006850154600786018054959660ff90951695939492936001600160a01b039092169291610b3190614219565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5d90614219565b8015610ba85780601f10610b7f57610100808354040283529160200191610ba8565b820191905f5260205f20905b815481529060010190602001808311610b8b57829003601f168201915b505050505090806008018054610bbd90614219565b80601f0160208091040260200160405190810160405280929190818152602001828054610be990614219565b8015610c345780601f10610c0b57610100808354040283529160200191610c34565b820191905f5260205f20905b815481529060010190602001808311610c1757829003601f168201915b5050506009840154600a850154600b860154600c870154600d8801805497986001600160a01b03958616989490951696509194509291610c7390614219565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9f90614219565b8015610cea5780601f10610cc157610100808354040283529160200191610cea565b820191905f5260205f20905b815481529060010190602001808311610ccd57829003601f168201915b505050600e90930154919250506001600160a01b0381169060ff600160a01b909104168e565b610d1861382c565b5f8281526008602090815260409182902082516101e08101909352805483526001810154909183019060ff166003811115610d5557610d55613c8f565b6003811115610d6657610d66613c8f565b8152600282810154602083015260408051808201808352919093019291600385019182845b815481526020019060010190808311610d8b5750505091835250506005820154602082015260068201546001600160a01b03166040820152600782018054606090920191610dd890614219565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0490614219565b8015610e4f5780601f10610e2657610100808354040283529160200191610e4f565b820191905f5260205f20905b815481529060010190602001808311610e3257829003601f168201915b50505050508152602001600882018054610e6890614219565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9490614219565b8015610edf5780601f10610eb657610100808354040283529160200191610edf565b820191905f5260205f20905b815481529060010190602001808311610ec257829003601f168201915b505050918352505060098201546001600160a01b039081166020830152600a830154166040820152600b8201546060820152600c8201546080820152600d8201805460a090920191610f3090614219565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5c90614219565b8015610fa75780601f10610f7e57610100808354040283529160200191610fa7565b820191905f5260205f20905b815481529060010190602001808311610f8a57829003601f168201915b5050509183525050600e91909101546001600160a01b038082166020840152600160a01b90910460ff16151560409092019190915260a08201519192508391166110075760405163cd6f4a4f60e01b815260040161099f91815260200190565b50919050565b611015612ddd565b5f8181526009602052604090205481906001600160a01b031661104e576040516381c4951960e01b815260040161099f91815260200190565b505f818152600960205260409081902080546001600160a01b0319169055517f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc90610ac79083815260200190565b6110a4612ddd565b6001600160a01b0381165f90815260076020526040902054819060ff166110df576040516321ac7c5f60e01b815260040161099f9190613c26565b506001600160a01b0381165f9081526007602052604090819020805460ff19169055517f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e790610ac7908390613c26565b5f61113861382c565b5f601281611149602087018761424b565b600381111561115a5761115a613c8f565b600381111561116b5761116b613c8f565b8152602081019190915260409081015f20815180830190925260028282826020028201915f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611192579050505050505090505f816001600281106111e9576111e9614264565b602002015163ffffffff1611845f016020810190611207919061424b565b906112265760405163286c068d60e11b815260040161099f9190614278565b5060208401354281101561125057604051630b99e87960e01b815260040161099f91815260200190565b506040840135602085013581101561127e5760405163174b5a0760e21b815260040161099f91815260200190565b506015546014545f919061129642604089013561429a565b6112a091906142ad565b6112aa91906142ad565b9050600554811081906112d3576040516313b783af60e21b815260040161099f91815260200190565b5060075f6112e76080880160608901613be7565b6001600160a01b0316815260208101919091526040015f205460ff166113136080870160608801613be7565b906113325760405163295a6a6f60e11b815260040161099f9190613c26565b505f61133d866127bc565b60068054965090915085905f611352836142c0565b9091555050604080514460208201529081018690525f9060600160408051808303601f1901815291815281516020928301205f898152600c84528281208690556004546011855283822080546001600160a01b039092166001600160a01b0319928316179055600d8552838220805460ff1916600117905560109094528290208054339416939093179092556014549192506113f191908901356142ad565b5f878152600e60209081526040909120600101919091558186526114179088018861424b565b8560200190600381111561142d5761142d613c8f565b9081600381111561144057611440613c8f565b905250436040808701919091528051808201825290602089019060029083908390808284375f9201919091525050506060808701919091526114889060808901908901613be7565b6001600160a01b031660a08601526114a360808801886142d8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505060c0808701919091526114eb908801886142d8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505060e080870191909152611538906101008901908901614327565b15156101c08601525f610140860181905261016086018190526040805160208101909152908152610180860152336101a08601819052600454611588916001600160a01b03909116903085612e0f565b5f6115996080890160608a01613be7565b6001600160a01b031663fefd9a8b88846115b660808d018d6142d8565b6115c360a08f018f6142d8565b8f8060c001906115d391906142d8565b6040518963ffffffff1660e01b81526004016115f698979695949392919061436a565b6020604051808303815f875af1158015611612573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163691906143c0565b5f818152600960205260409020549091506001600160a01b03168181611672576040516381c4951960e01b815260040161099f91815260200190565b505f828152600a60205260409020546001600160a01b031682816116ac576040516381c4951960e01b815260040161099f91815260200190565b50608088018390526001600160a01b038083166101008a015281166101208901525f8981526008602090815260409091208951815590890151600180830180548c94939260ff19919091169083600381111561170a5761170a613c8f565b0217905550604082015181600201556060820151816003019060026117309291906138a9565b506080820151600582015560a08201516006820180546001600160a01b0319166001600160a01b0390921691909117905560c082015160078201906117759082614436565b5060e0820151600882019061178a9082614436565b506101008201516009820180546001600160a01b039283166001600160a01b031991821617909155610120840151600a84018054919093169116179055610140820151600b820155610160820151600c820155610180820151600d8201906117f29082614436565b506101a0820151600e90910180546101c0909301511515600160a01b026001600160a81b03199093166001600160a01b0392831617929092179091555f5460405163291a691b60e01b815291169063291a691b90611858908c9088908c906004016144eb565b6020604051808303815f875af1158015611874573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118989190614530565b6118b557604051630d8dbe2560e01b815260040160405180910390fd5b6118c560808b0160608c01613be7565b6001600160a01b03167f5904e83d57e704fba4d92c5617f6b50ae993cd42d78babfcb239d0a6775f30708a8a6040516118ff929190613f75565b60405180910390a2885f5160206149e75f395f51905f525f600160405161192792919061454b565b60405180910390a250505050505050915091565b611943612ddd565b61194c5f612e7c565b565b611956612ddd565b80515f5b818110156119aa57600b83828151811061197657611976614264565b602002602001015160405161198b9190614566565b908152604051908190036020019020805460ff1916905560010161195a565b507fd1b46e030b48add7bc03225cc5a6f403970976b36983f99ec31d535d627fc7db826040516119da919061457c565b60405180910390a15050565b6119ee612ddd565b6001600160a01b03811615801590611a1f57505f828152600a60205260409020546001600160a01b03828116911614155b8290611a41576040516381c4951960e01b815260040161099f91815260200190565b505f918252600a602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f546001600160a01b03163314611a985760405162461bcd60e51b815260040161099f906145df565b5f818152600d602052604090205460ff166001816006811115611abd57611abd613c8f565b14611ae257816001826040516337e1404160e01b815260040161099f93929190614610565b5f828152600d60205260409020805460ff19166002179055601354611b0790426142ad565b5f838152600e602052604080822092909255905183917fc44405af9078047712501f519e1fb900c2896c62b488336f84529c72ae16e6f191a2815f5160206149e75f395f51905f5260016002604051611b6192919061454b565b60405180910390a25050565b5f546001600160a01b03163314611b965760405162461bcd60e51b815260040161099f906145df565b5f828152600860209081526040808320600d9092529091205460ff166002816006811115611bc657611bc6613c8f565b14611beb57836002826040516337e1404160e01b815260040161099f93929190614610565b5f848152600d6020526040808220805460ff19166003179055600b84018590555185917f11df18edb9bc9cd90a79068e0e208b630202148643d797d6150e7bacb733e63c91a2835f5160206149e75f395f51905f5260026003604051611c5292919061454b565b60405180910390a250505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b611caf60405180606001604052805f81526020015f81526020015f81525090565b5060408051606081018252601354815260145460208201526015549181019190915290565b5f818152600d602052604090205460ff166006816006811115611cf957611cf9613c8f565b14611d365760405162461bcd60e51b815260206004820152600d60248201526c114cc81b9bdd0819985a5b1959609a1b604482015260640161099f565b5f828152600c602052604090205480611d885760405162461bcd60e51b8152602060048201526014602482015273139bc81c185e5b595b9d081d1bc81c99599d5b9960621b604482015260640161099f565b5f838152600c60205260408120819055611da184612eec565b5f858152601160205260409020546002549192506001600160a01b0390811691611dce9183911685612fe0565b60025460405163da19b69760e01b81526001600160a01b039091169063da19b69790611e04908890879087908790600401614674565b5f604051808303815f87803b158015611e1b575f5ffd5b505af1158015611e2d573d5f5f3e3d5ffd5b50505050847f5297818f48a66292b8b3e2caab83eec531b669bb20807fd38cf006adb2a07317848451604051611e6d929190918252602082015260400190565b60405180910390a25050505050565b611e9d60405180606001604052805f81526020015f81526020015f81525090565b505f908152600e6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b5f818152600d6020526040812054819060ff16611ef2848261300b565b9250925050915091565b5f5f611f0787610d10565b5f888152600d602052604090205490915060ff166003816006811115611f2f57611f2f613c8f565b1488600383909192611f57576040516337e1404160e01b815260040161099f93929190614610565b5050505f888152600e6020908152604091829020825160608101845281548152600182015492810183905260029091015492810192909252899042811015611fbb576040516308f3034360e31b81526004810192909252602482015260440161099f565b5050606083015160200151899042811115611ff25760405163017e35e560e71b81526004810192909252602482015260440161099f565b505061016083015189901561201d57604051637eb9cea960e11b815260040161099f91815260200190565b505f888860405161202f9291906146ab565b60408051918290039091205f8c815260086020908152838220600c01839055600d905291909120805460ff1916600417905560155490915061207190426142ad565b5f8b8152600e6020526040908190206002019190915560a08501519051632f0e1bbf60e01b81526001600160a01b0390911690632f0e1bbf906120be908d9085908c908c906004016146ba565b6020604051808303815f875af11580156120da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120fe9190614530565b945088888661212257604051632f9f8ab960e01b815260040161099f9291906146d9565b5050897f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade0718a8a6040516121569291906146d9565b60405180910390a2895f5160206149e75f395f51905f526003600460405161217f92919061454b565b60405180910390a25050505095945050505050565b5f5f61219f89610d10565b5f8a8152600d602052604090205490915060ff1660048160068111156121c7576121c7613c8f565b148a6004839091926121ef576040516337e1404160e01b815260040161099f93929190614610565b5050505f8a8152600e602090815260409182902082516060810184528154815260018201549281019290925260020154918101829052908b9042811015612252576040516308f3034360e31b81526004810192909252602482015260440161099f565b50505f8b8152600860205260409020600d0161226f8a8c836146ec565b505f8b8152600d6020526040902080546005919060ff191660018302179055508261010001516001600160a01b0316635bf48e3a8b8b6040516122b39291906146ab565b6040519081900381206001600160e01b031960e084901b1682526122e1918c908c908c908c906004016147a0565b602060405180830381865afa1580156122fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123209190614530565b935089898561234457604051632f9f8ab960e01b815260040161099f9291906146d9565b505061234f8b613193565b8a7f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca1698b8b6040516123819291906146d9565b60405180910390a28a5f5160206149e75f395f51905f52600460056040516123aa92919061454b565b60405180910390a2505050979650505050505050565b6123c8612ddd565b80515f5b81811015612427576001600b8483815181106123ea576123ea614264565b60200260200101516040516123ff9190614566565b908152604051908190036020019020805491151560ff199092169190911790556001016123cc565b507f027b83cad653f54850fef6faa8c705f73a53e7f8de50a3a33ac1e0e3a5c0be81826040516119da919061457c565b5f546001600160a01b031633148061247957506003546001600160a01b031633145b6124c55760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c79205265676973747279206f7220536c617368696e674d677200000000604482015260640161099f565b5f8160ff161180156124db5750600d60ff821611155b6125205760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103330b4b63ab932903932b0b9b7b760511b604482015260640161099f565b61253e828260ff16600d81111561253957612539613c8f565b613542565b5050565b61254a612ddd565b6001600160a01b0381166125a05760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420536c617368696e674d616e61676572206164647265737300604482015260640161099f565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f4ccc8ed483c7c44c3602c3c38afc2c014a8f1d2dc210dfe58ebeeeead230f8e0905f90a250565b6003546001600160a01b0316331461263a5760405162461bcd60e51b815260206004820152601460248201527327b7363c9029b630b9b434b733a6b0b730b3b2b960611b604482015260640161099f565b60025460405163c1ab0f1f60e01b815260048101849052602481018390526001600160a01b039091169063c1ab0f1f906044015f604051808303815f87803b158015612684575f5ffd5b505af1158015612696573d5f5f3e3d5ffd5b50505050817f4f41a3b0a032ebcae925f2ace77d507435840ca4b2dbaffdd7723fa8d72ee54282604051611b6191815260200190565b6126d4612ddd565b6001600160a01b0381161580159061270557505f828152600960205260409020546001600160a01b03828116911614155b8290612727576040516381c4951960e01b815260040161099f91815260200190565b505f8281526009602090815260409182902080546001600160a01b0319166001600160a01b03851617905590518381527ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb6991016119da565b612787612ddd565b60058190556040518181527fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b52355290602001610ac7565b620f424080611007565b6127ce612ddd565b6001600160a01b038116158015906127f457506001546001600160a01b03828116911614155b8190612814576040516320252f0b60e01b815260040161099f9190613c26565b50600180546001600160a01b0319166001600160a01b0383161790556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a790610ac7908390613c26565b612868612ddd565b61287560208201826147eb565b63ffffffff1661288b60408301602084016147eb565b63ffffffff16101580156128b057505f6128a860208301836147eb565b63ffffffff16115b6128f05760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081d1a1c995cda1bdb19607a1b604482015260640161099f565b8060125f84600381111561290657612906613c8f565b600381111561291757612917613c8f565b815260208101919091526040015f206129319160026138e7565b5081600381111561294457612944613c8f565b7f8b56fae526eee054f0849759a99fc7d4ff3823824ebf097a56f7d78adb6b34fa82604051611b619190614804565b61297b612ddd565b6001600160a01b0381166129a4575f604051631e4fbdf760e01b815260040161099f9190613c26565b610ae381612e7c565b5f818152600d602052604081205460ff16818160068111156129d1576129d1613c8f565b036129f657826001826040516337e1404160e01b815260040161099f93929190614610565b6005816006811115612a0a57612a0a613c8f565b03612a2b5760405163462c7bed60e01b81526004810184905260240161099f565b6006816006811115612a3f57612a3f613c8f565b03612a6057604051633de16e3560e11b81526004810184905260240161099f565b5f612a6b848361300b565b9350905080612a9057604051639f65d93560e01b81526004810185905260240161099f565b5f848152600d6020526040902080546006919060ff191660018302179055505f848152600f60205260409020805484919060ff1916600183600d811115612ad957612ad9613c8f565b0217905550835f5160206149e75f395f51905f52836006604051612afe92919061454b565b60405180910390a2837fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb8385604051612b38929190614842565b60405180910390a25050919050565b612b4f612ddd565b6001600160a01b03811615801590612b7457505f546001600160a01b03828116911614155b8190612b94576040516375ac4eb760e11b815260040161099f9190613c26565b505f80546001600160a01b0319166001600160a01b0383161790556040517f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b690610ac7908390613c26565b6001600160a01b0381165f90815260076020526040902054819060ff1615612c1b5760405163b29d459560e01b815260040161099f9190613c26565b506001600160a01b0381165f9081526007602052604090819020805460ff19166001179055517fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46790610ac7908390613c26565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b612ca06136aa565b610ae3816136cf565b8035612cec5760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420444b472077696e646f7760701b604482015260640161099f565b5f816020013511612d385760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420636f6d707574652077696e646f7760501b604482015260640161099f565b5f816040013511612d875760405162461bcd60e51b8152602060048201526019602482015278496e76616c69642064656372797074696f6e2077696e646f7760381b604482015260640161099f565b80356013819055602080830135601481905560408085013560158190558151948552928401919091528201527f7e86ba16b805e2835af5c5b7aa5a942ced8bcc1fb95a05fbe42dae3862350a1690606001610ac7565b33612de6611c60565b6001600160a01b03161461194c573360405163118cdaa760e01b815260040161099f9190613c26565b6040516001600160a01b038481166024830152838116604483015260648201839052612e769186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506136d7565b50505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f818152600f602052604090205460609060ff16600181600d811115612f1457612f14613c8f565b1480612f315750600281600d811115612f2f57612f2f613c8f565b145b15612f69575f5b604051908082528060200260200182016040528015612f61578160200160208202803683370190505b509392505050565b5f5460405162beb08960e51b8152600481018590526001600160a01b03909116906317d61120906024015f60405180830381865afa925050508015612fcf57506040513d5f823e601f3d908101601f19168201604052612fcc919081019061485d565b60015b612fd9575f612f38565b9392505050565b61300683846001600160a01b031663a9059cbb8585604051602401612e449291906148ec565b505050565b5f828152600e60209081526040808320815160608101835281548152600182015493810193909352600201548282015282549051632800d82960e01b81526004810186905283929183916001600160a01b0390911690632800d82990602401602060405180830381865afa158015613085573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a991906143c0565b905060018560068111156130bf576130bf613c8f565b1480156130cb57508042115b156130de5760018093509350505061318c565b60028560068111156130f2576130f2613c8f565b1480156130ff5750815142115b15613113576001600393509350505061318c565b600385600681111561312757613127613c8f565b1480156131375750816020015142115b1561314b576001600693509350505061318c565b600485600681111561315f5761315f613c8f565b14801561316f5750816040015142115b15613183576001600a93509350505061318c565b5f5f9350935050505b9250929050565b5f805460405162beb08960e51b8152600481018490526001600160a01b03909116906317d61120906024015f60405180830381865afa1580156131d8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526131ff919081019061485d565b80515f848152600c60209081526040808320805490849055601190925282205493945091926001600160a01b03169082900361329d576002546040516341489f1560e01b81526001600160a01b03909116906341489f159061326990889088908690600401614905565b5f604051808303815f87803b158015613280575f5ffd5b505af1158015613292573d5f5f3e3d5ffd5b505050505050505050565b825f0361333e575f858152601060205260409020546001600160a01b031680156132d5576132d56001600160a01b0383168285612fe0565b6002546040516341489f1560e01b81526001600160a01b03909116906341489f159061330990899089908790600401614905565b5f604051808303815f87803b158015613320575f5ffd5b505af1158015613332573d5f5f3e3d5ffd5b50505050505050505050565b5f836001600160401b03811115613357576133576139d9565b604051908082528060200260200182016040528015613380578160200160208202803683370190505b5090505f61338e8585614935565b90505f805b868110156133cd57828482815181106133ae576133ae614264565b60209081029190910101526133c383836142ad565b9150600101613393565b505f6133d9828761429a565b905080156134165780846133ee60018a61429a565b815181106133fe576133fe614264565b6020026020010181815161341291906142ad565b9052505b600154613430906001600160a01b0387811691168861373a565b600154604051636ec640c760e11b81526001600160a01b039091169063dd8c818e906134649088908c908990600401614984565b5f604051808303815f87803b15801561347b575f5ffd5b505af115801561348d573d5f5f3e3d5ffd5b50506001546134ab92506001600160a01b038881169250165f61373a565b887fac9fe8ad7f55eac03284399116ecafc104f10459773f4cdf47063c46e5be335a89866040516134dd9291906149b9565b60405180910390a26002546040516341489f1560e01b81526001600160a01b03909116906341489f1590613519908c908c908a90600401614905565b5f604051808303815f87803b158015613530575f5ffd5b505af1158015610936573d5f5f3e3d5ffd5b5f828152600d602052604081205460ff169081600681111561356657613566613c8f565b0361358b57826001826040516337e1404160e01b815260040161099f93929190614610565b600581600681111561359f5761359f613c8f565b036135c05760405163462c7bed60e01b81526004810184905260240161099f565b60068160068111156135d4576135d4613c8f565b036135f557604051633de16e3560e11b81526004810184905260240161099f565b5f838152600d6020526040902080546006919060ff191660018302179055505f838152600f60205260409020805483919060ff1916600183600d81111561363e5761363e613c8f565b0217905550825f5160206149e75f395f51905f5282600660405161366392919061454b565b60405180910390a2827fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb828460405161369d929190614842565b60405180910390a2505050565b6136b26137ca565b61194c57604051631afcd79f60e31b815260040160405180910390fd5b61297b6136aa565b5f5f60205f8451602086015f885af1806136f6576040513d5f823e3d81fd5b50505f513d9150811561370d57806001141561371a565b6001600160a01b0384163b155b15612e765783604051635274afe760e01b815260040161099f9190613c26565b5f836001600160a01b031663095ea7b3848460405160240161375d9291906148ec565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061379684826137e3565b612e76576137c084856001600160a01b031663095ea7b3865f604051602401612e449291906148ec565b612e7684826136d7565b5f6137d3612c6e565b54600160401b900460ff16919050565b5f5f5f5f60205f8651602088015f8a5af192503d91505f519050828015613822575081156138145780600114613822565b5f866001600160a01b03163b115b9695505050505050565b604080516101e081019091525f808252602082019081526020015f8152602001613854613983565b81525f602082018190526040820181905260608083018190526080830181905260a0830182905260c0830182905260e08301829052610100830182905261012083015261014082018190526101609091015290565b82600281019282156138d7579160200282015b828111156138d75782518255916020019190600101906138bc565b506138e39291506139a1565b5090565b6001830191839082156138d7579160200282015f5b8382111561394657833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026138fc565b80156139765782816101000a81549063ffffffff0219169055600401602081600301049283019260010302613946565b50506138e39291506139a1565b60405180604001604052806002906020820280368337509192915050565b5b808211156138e3575f81556001016139a2565b6001600160a01b0381168114610ae3575f5ffd5b5f60608284031215611007575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613a1557613a156139d9565b604052919050565b5f6001600160401b03821115613a3557613a356139d9565b5060051b60200190565b5f82601f830112613a4e575f5ffd5b81356001600160401b03811115613a6757613a676139d9565b613a7a601f8201601f19166020016139ed565b818152846020838601011115613a8e575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613ab9575f5ffd5b8135613acc613ac782613a1d565b6139ed565b8082825260208201915060208360051b860101925085831115613aed575f5ffd5b602085015b83811015613b2d5780356001600160401b03811115613b0f575f5ffd5b613b1e886020838a0101613a3f565b84525060209283019201613af2565b5095945050505050565b5f5f5f5f5f5f5f5f610140898b031215613b4f575f5ffd5b8835613b5a816139b5565b97506020890135613b6a816139b5565b96506040890135613b7a816139b5565b95506060890135613b8a816139b5565b94506080890135613b9a816139b5565b935060a08901359250613bb08a60c08b016139c9565b91506101208901356001600160401b03811115613bcb575f5ffd5b613bd78b828c01613aaa565b9150509295985092959890939650565b5f60208284031215613bf7575f5ffd5b8135612fd9816139b5565b5f60208284031215613c12575f5ffd5b5035919050565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b803560048110613c48575f5ffd5b919050565b5f5f60408385031215613c5e575f5ffd5b613c6783613c3a565b946020939093013593505050565b5f60608284031215613c85575f5ffd5b612fd983836139c9565b634e487b7160e01b5f52602160045260245ffd5b600e8110613cb357613cb3613c8f565b9052565b60208101612c928284613ca3565b60048110613cb357613cb3613c8f565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8e8152613d13602082018f613cc5565b8c60408201528b6060820152613d2c608082018c613c19565b6101c060a08201525f613d436101c083018c613cd5565b82810360c0840152613d55818c613cd5565b9050613d6460e084018b613c19565b613d7261010084018a613c19565b8761012084015286610140840152828103610160840152613d938187613cd5565b915050613da4610180830185613c19565b8215156101a08301529f9e505050505050505050505050505050565b805f5b6002811015612e76578151845260209384019390910190600101613dc3565b805182525f6020820151613df96020850182613cc5565b50604082015160408401526060820151613e166060850182613dc0565b50608082015160a084015260a0820151613e3360c0850182613c19565b5060c082015161020060e0850152613e4f610200850182613cd5565b905060e0830151848203610100860152613e698282613cd5565b915050610100830151613e80610120860182613c19565b50610120830151613e95610140860182613c19565b506101408301516101608501526101608301516101808501526101808301518482036101a0860152613ec78282613cd5565b9150506101a0830151613ede6101c0860182613c19565b506101c08301518015156101e0860152612f61565b602081525f612fd96020830184613de2565b5f60208284031215613f15575f5ffd5b81356001600160401b03811115613f2a575f5ffd5b613f3684828501613a3f565b949350505050565b5f60208284031215613f4e575f5ffd5b81356001600160401b03811115613f63575f5ffd5b82016101008185031215612fd9575f5ffd5b828152604060208201525f613f366040830184613de2565b5f60208284031215613f9d575f5ffd5b81356001600160401b03811115613fb2575f5ffd5b613f3684828501613aaa565b5f5f60408385031215613fcf575f5ffd5b823591506020830135613fe1816139b5565b809150509250929050565b5f5f60408385031215613ffd575f5ffd5b50508035926020909101359150565b81518152602080830151908201526040808301519082015260608101612c92565b821515815260408101612fd96020830184613ca3565b5f5f83601f840112614053575f5ffd5b5081356001600160401b03811115614069575f5ffd5b60208301915083602082850101111561318c575f5ffd5b5f5f5f5f5f60608688031215614094575f5ffd5b8535945060208601356001600160401b038111156140b0575f5ffd5b6140bc88828901614043565b90955093505060408601356001600160401b038111156140da575f5ffd5b6140e688828901614043565b969995985093965092949392505050565b5f5f5f5f5f5f5f6080888a03121561410d575f5ffd5b8735965060208801356001600160401b03811115614129575f5ffd5b6141358a828b01614043565b90975095505060408801356001600160401b03811115614153575f5ffd5b61415f8a828b01614043565b90955093505060608801356001600160401b0381111561417d575f5ffd5b6141898a828b01614043565b989b979a50959850939692959293505050565b5f5f604083850312156141ad575f5ffd5b82359150602083013560ff81168114613fe1575f5ffd5b60078110613cb357613cb3613c8f565b60208101612c9282846141c4565b5f5f606083850312156141f3575f5ffd5b6141fc83613c3a565b91508360608401111561420d575f5ffd5b50926020919091019150565b600181811c9082168061422d57607f821691505b60208210810361100757634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561425b575f5ffd5b612fd982613c3a565b634e487b7160e01b5f52603260045260245ffd5b60208101612c928284613cc5565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612c9257612c92614286565b80820180821115612c9257612c92614286565b5f600182016142d1576142d1614286565b5060010190565b5f5f8335601e198436030181126142ed575f5ffd5b8301803591506001600160401b03821115614306575f5ffd5b60200191503681900382131561318c575f5ffd5b8015158114610ae3575f5ffd5b5f60208284031215614337575f5ffd5b8135612fd98161431a565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b88815287602082015260a060408201525f61438960a08301888a614342565b828103606084015261439c818789614342565b905082810360808401526143b1818587614342565b9b9a5050505050505050505050565b5f602082840312156143d0575f5ffd5b5051919050565b601f82111561300657805f5260205f20601f840160051c810160208510156143fc5750805b601f840160051c820191505b8181101561441b575f8155600101614408565b5050505050565b5f19600383901b1c191660019190911b1790565b81516001600160401b0381111561444f5761444f6139d9565b6144638161445d8454614219565b846143d7565b6020601f821160018114614490575f831561447e5750848201515b6144888482614422565b85555061441b565b5f84815260208120601f198516915b828110156144bf578785015182556020948501946001909201910161449f565b50848210156144dc57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b838152602081018390526080810160408201835f5b600281101561452557815163ffffffff16835260209283019290910190600101614500565b505050949350505050565b5f60208284031215614540575f5ffd5b8151612fd98161431a565b6040810161455982856141c4565b612fd960208301846141c4565b5f82518060208501845e5f920191825250919050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156145d357603f198786030184526145be858351613cd5565b945060209384019391909101906001016145a2565b50929695505050505050565b6020808252601790820152764f6e6c79204369706865726e6f6465526567697374727960481b604082015260600190565b8381526060810161462460208301856141c4565b613f3660408301846141c4565b5f8151808452602084019350602083015f5b8281101561466a5781516001600160a01b0316865260209586019590910190600101614643565b5093949350505050565b848152836020820152608060408201525f6146926080830185614631565b905060018060a01b038316606083015295945050505050565b818382375f9101908152919050565b848152836020820152606060408201525f613822606083018486614342565b602081525f613f36602083018486614342565b6001600160401b03831115614703576147036139d9565b614717836147118354614219565b836143d7565b5f601f841160018114614743575f85156147315750838201355b61473b8682614422565b84555061441b565b5f83815260208120601f198716915b828110156147725786850135825560209485019460019092019101614752565b508682101561478e575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b858152606060208201525f6147b9606083018688614342565b82810360408401526147cc818587614342565b98975050505050505050565b803563ffffffff81168114613c48575f5ffd5b5f602082840312156147fb575f5ffd5b612fd9826147d8565b6040810181835f5b60028110156148395763ffffffff614823836147d8565b168352602092830192919091019060010161480c565b50505092915050565b6040810161485082856141c4565b612fd96020830184613ca3565b5f6020828403121561486d575f5ffd5b81516001600160401b03811115614882575f5ffd5b8201601f81018413614892575f5ffd5b80516148a0613ac782613a1d565b8082825260208201915060208360051b8501019250868311156148c1575f5ffd5b6020840193505b828410156138225783516148db816139b5565b8252602093840193909101906148c8565b6001600160a01b03929092168252602082015260400190565b838152606060208201525f61491d6060830185614631565b905060018060a01b0383166040830152949350505050565b5f8261494f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f8151808452602084019350602083015f5b8281101561466a578151865260209586019590910190600101614966565b6001600160a01b03841681526060602082018190525f906149a790830185614631565b82810360408401526138228185614954565b604081525f6149cb6040830185614631565b82810360208401526149dd8185614954565b9594505050505056fe1b418a230a21d37a078bf8f16decbde8ccceacd77159371f62f0d4ea00d19967a164736f6c634300081c000a", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106102c3575f3560e01c806390173a4111610177578063cb649617116100d5578063ea71aa571161008f578063ea71aa5714610745578063f0691cba14610758578063f2fde38b1461076b578063f81b8ef61461077e578063fad8e11114610791578063fbdb3237146107a4578063fd2f3d01146107cc575f5ffd5b8063cb649617146106c1578063cbd16872146106ca578063cf0f34c4146106dd578063cfbdc98d146106f0578063da16fb2f1461071f578063e59e469514610732575f5ffd5b8063ac3d2f4211610131578063ac3d2f4214610618578063b27392d514610640578063b68fd1be14610653578063bb2d1b8214610666578063bff232c114610679578063c1ab0f1f1461068c578063c4ccafa21461069f575f5ffd5b806390173a41146105815780639117173c1461059657806392312386146105a9578063929a8faf146105bc57806399c6679d146105dd5780639c8570c814610605575f5ffd5b80634fc77264116102245780637c8c3b4d116101de5780637c8c3b4d146105085780637cfa9d741461051b57806381476ec21461052e57806385814243146105415780638da5cb5b146105545780638dcdd86b1461055c5780638e5ce3ad1461056e575f5ffd5b80634fc772641461049d57806364226409146104b0578063647846a5146104d15780636db5c8fd146104e4578063715018a6146104ed57806377868ae4146104f5575f5ffd5b80631ba72945116102805780631ba729451461039057806336c5d38a146103a35780634017daf0146103d2578063406ed35c146103ff5780634147a3601461041f578063459d92941461044c5780634e92ec631461048a575f5ffd5b806301d12f1c146102c757806302a3a9c9146102dc5780630ef81b2f146102ef57806310bc62811461032d57806311bd61d91461035557806315cce2241461037d575b5f5ffd5b6102da6102d5366004613b37565b6107df565b005b6102da6102ea366004613be7565b610945565b6103176102fd366004613c02565b5f908152600960205260409020546001600160a01b031690565b6040516103249190613c26565b60405180910390f35b61031761033b366004613c02565b60096020525f90815260409020546001600160a01b031681565b610368610363366004613c4d565b6109f1565b60405163ffffffff9091168152602001610324565b6102da61038b366004613be7565b610a2d565b6102da61039e366004613c75565b610ad2565b6103c56103b1366004613c02565b5f908152600f602052604090205460ff1690565b6040516103249190613cb7565b6103e56103e0366004613c02565b610ae6565b6040516103249e9d9c9b9a99989796959493929190613d03565b61041261040d366004613c02565b610d10565b6040516103249190613ef3565b61043e61042d366004613c02565b600c6020525f908152604090205481565b604051908152602001610324565b61047a61045a366004613f05565b8051602081830181018051600b8252928201919093012091525460ff1681565b6040519015158152602001610324565b6102da610498366004613c02565b61100d565b6102da6104ab366004613be7565b61109c565b6104c36104be366004613f3e565b61112f565b604051610324929190613f75565b600454610317906001600160a01b031681565b61043e60055481565b6102da61193b565b6102da610503366004613f8d565b61194e565b6102da610516366004613fbe565b6119e6565b6102da610529366004613c02565b611a6f565b6102da61053c366004613fec565b611b6d565b600154610317906001600160a01b031681565b610317611c60565b5f54610317906001600160a01b031681565b600354610317906001600160a01b031681565b610589611c8e565b604051610324919061400c565b6102da6105a4366004613c02565b611cd4565b6105896105b7366004613c02565b611e7c565b6105cf6105ca366004613c02565b611ed5565b60405161032492919061402d565b6103176105eb366004613c02565b5f908152601060205260409020546001600160a01b031690565b61047a610613366004614080565b611efc565b610317610626366004613c02565b5f908152600a60205260409020546001600160a01b031690565b61047a61064e3660046140f7565b612194565b6102da610661366004613f8d565b6123c0565b6102da61067436600461419c565b612457565b6102da610687366004613be7565b612542565b6102da61069a366004613fec565b6125e9565b61047a6106ad366004613be7565b60076020525f908152604090205460ff1681565b61043e60065481565b6102da6106d8366004613fbe565b6126cc565b6102da6106eb366004613c02565b61277f565b6107126106fe366004613c02565b5f908152600d602052604090205460ff1690565b60405161032491906141d4565b61043e61072d366004613f3e565b6127bc565b6102da610740366004613be7565b6127c6565b6102da6107533660046141e2565b612860565b600254610317906001600160a01b031681565b6102da610779366004613be7565b612973565b6103c561078c366004613c02565b6129ad565b6102da61079f366004613be7565b612b47565b6103176107b2366004613c02565b600a6020525f90815260409020546001600160a01b031681565b6102da6107da366004613be7565b612bdf565b5f6107e8612c6e565b805490915060ff600160401b82041615906001600160401b03165f8115801561080e5750825b90505f826001600160401b031660011480156108295750303b155b905081158015610837575080155b156108555760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561087f57845460ff60401b1916600160401b1785555b61088833612c98565b6108918861277f565b61089a8c612b47565b6108a38b6127c6565b6108ac8a610945565b6108b589610a2d565b6108be87612ca9565b6108c7866123c0565b6108cf611c60565b6001600160a01b03168d6001600160a01b0316146108f0576108f08d612973565b831561093657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b61094d612ddd565b6001600160a01b0381166109a85760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964204533526566756e644d616e6167657220616464726573730060448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f9557d04c1c0b16f93f13b69aed23b3b6ab935bff3c53ac81d17896d3583542ed905f90a250565b6012602052815f5260405f208160028110610a0a575f80fd5b60089182820401919006600402915091509054906101000a900463ffffffff1681565b610a35612ddd565b6001600160a01b03811615801590610a5b57506004546001600160a01b03828116911614155b8190610a7b5760405163eddf07f560e01b815260040161099f9190613c26565b50600480546001600160a01b0319166001600160a01b0383161790556040517f722ff84c1234b2482061def5c82c6b5080c117b3cbb69d686844a051e4b8e7f390610ac7908390613c26565b60405180910390a150565b610ada612ddd565b610ae381612ca9565b50565b60086020525f9081526040902080546001820154600283015460058401546006850154600786018054959660ff90951695939492936001600160a01b039092169291610b3190614219565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5d90614219565b8015610ba85780601f10610b7f57610100808354040283529160200191610ba8565b820191905f5260205f20905b815481529060010190602001808311610b8b57829003601f168201915b505050505090806008018054610bbd90614219565b80601f0160208091040260200160405190810160405280929190818152602001828054610be990614219565b8015610c345780601f10610c0b57610100808354040283529160200191610c34565b820191905f5260205f20905b815481529060010190602001808311610c1757829003601f168201915b5050506009840154600a850154600b860154600c870154600d8801805497986001600160a01b03958616989490951696509194509291610c7390614219565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9f90614219565b8015610cea5780601f10610cc157610100808354040283529160200191610cea565b820191905f5260205f20905b815481529060010190602001808311610ccd57829003601f168201915b505050600e90930154919250506001600160a01b0381169060ff600160a01b909104168e565b610d1861382c565b5f8281526008602090815260409182902082516101e08101909352805483526001810154909183019060ff166003811115610d5557610d55613c8f565b6003811115610d6657610d66613c8f565b8152600282810154602083015260408051808201808352919093019291600385019182845b815481526020019060010190808311610d8b5750505091835250506005820154602082015260068201546001600160a01b03166040820152600782018054606090920191610dd890614219565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0490614219565b8015610e4f5780601f10610e2657610100808354040283529160200191610e4f565b820191905f5260205f20905b815481529060010190602001808311610e3257829003601f168201915b50505050508152602001600882018054610e6890614219565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9490614219565b8015610edf5780601f10610eb657610100808354040283529160200191610edf565b820191905f5260205f20905b815481529060010190602001808311610ec257829003601f168201915b505050918352505060098201546001600160a01b039081166020830152600a830154166040820152600b8201546060820152600c8201546080820152600d8201805460a090920191610f3090614219565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5c90614219565b8015610fa75780601f10610f7e57610100808354040283529160200191610fa7565b820191905f5260205f20905b815481529060010190602001808311610f8a57829003601f168201915b5050509183525050600e91909101546001600160a01b038082166020840152600160a01b90910460ff16151560409092019190915260a08201519192508391166110075760405163cd6f4a4f60e01b815260040161099f91815260200190565b50919050565b611015612ddd565b5f8181526009602052604090205481906001600160a01b031661104e576040516381c4951960e01b815260040161099f91815260200190565b505f818152600960205260409081902080546001600160a01b0319169055517f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc90610ac79083815260200190565b6110a4612ddd565b6001600160a01b0381165f90815260076020526040902054819060ff166110df576040516321ac7c5f60e01b815260040161099f9190613c26565b506001600160a01b0381165f9081526007602052604090819020805460ff19169055517f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e790610ac7908390613c26565b5f61113861382c565b5f601281611149602087018761424b565b600381111561115a5761115a613c8f565b600381111561116b5761116b613c8f565b8152602081019190915260409081015f20815180830190925260028282826020028201915f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611192579050505050505090505f816001600281106111e9576111e9614264565b602002015163ffffffff1611845f016020810190611207919061424b565b906112265760405163286c068d60e11b815260040161099f9190614278565b5060208401354281101561125057604051630b99e87960e01b815260040161099f91815260200190565b506040840135602085013581101561127e5760405163174b5a0760e21b815260040161099f91815260200190565b506015546014545f919061129642604089013561429a565b6112a091906142ad565b6112aa91906142ad565b9050600554811081906112d3576040516313b783af60e21b815260040161099f91815260200190565b5060075f6112e76080880160608901613be7565b6001600160a01b0316815260208101919091526040015f205460ff166113136080870160608801613be7565b906113325760405163295a6a6f60e11b815260040161099f9190613c26565b505f61133d866127bc565b60068054965090915085905f611352836142c0565b9091555050604080514460208201529081018690525f9060600160408051808303601f1901815291815281516020928301205f898152600c84528281208690556004546011855283822080546001600160a01b039092166001600160a01b0319928316179055600d8552838220805460ff1916600117905560109094528290208054339416939093179092556014549192506113f191908901356142ad565b5f878152600e60209081526040909120600101919091558186526114179088018861424b565b8560200190600381111561142d5761142d613c8f565b9081600381111561144057611440613c8f565b905250436040808701919091528051808201825290602089019060029083908390808284375f9201919091525050506060808701919091526114889060808901908901613be7565b6001600160a01b031660a08601526114a360808801886142d8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505060c0808701919091526114eb908801886142d8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505060e080870191909152611538906101008901908901614327565b15156101c08601525f610140860181905261016086018190526040805160208101909152908152610180860152336101a08601819052600454611588916001600160a01b03909116903085612e0f565b5f6115996080890160608a01613be7565b6001600160a01b031663fefd9a8b88846115b660808d018d6142d8565b6115c360a08f018f6142d8565b8f8060c001906115d391906142d8565b6040518963ffffffff1660e01b81526004016115f698979695949392919061436a565b6020604051808303815f875af1158015611612573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163691906143c0565b5f818152600960205260409020549091506001600160a01b03168181611672576040516381c4951960e01b815260040161099f91815260200190565b505f828152600a60205260409020546001600160a01b031682816116ac576040516381c4951960e01b815260040161099f91815260200190565b50608088018390526001600160a01b038083166101008a015281166101208901525f8981526008602090815260409091208951815590890151600180830180548c94939260ff19919091169083600381111561170a5761170a613c8f565b0217905550604082015181600201556060820151816003019060026117309291906138a9565b506080820151600582015560a08201516006820180546001600160a01b0319166001600160a01b0390921691909117905560c082015160078201906117759082614436565b5060e0820151600882019061178a9082614436565b506101008201516009820180546001600160a01b039283166001600160a01b031991821617909155610120840151600a84018054919093169116179055610140820151600b820155610160820151600c820155610180820151600d8201906117f29082614436565b506101a0820151600e90910180546101c0909301511515600160a01b026001600160a81b03199093166001600160a01b0392831617929092179091555f5460405163291a691b60e01b815291169063291a691b90611858908c9088908c906004016144eb565b6020604051808303815f875af1158015611874573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118989190614530565b6118b557604051630d8dbe2560e01b815260040160405180910390fd5b6118c560808b0160608c01613be7565b6001600160a01b03167f5904e83d57e704fba4d92c5617f6b50ae993cd42d78babfcb239d0a6775f30708a8a6040516118ff929190613f75565b60405180910390a2885f5160206149e75f395f51905f525f600160405161192792919061454b565b60405180910390a250505050505050915091565b611943612ddd565b61194c5f612e7c565b565b611956612ddd565b80515f5b818110156119aa57600b83828151811061197657611976614264565b602002602001015160405161198b9190614566565b908152604051908190036020019020805460ff1916905560010161195a565b507fd1b46e030b48add7bc03225cc5a6f403970976b36983f99ec31d535d627fc7db826040516119da919061457c565b60405180910390a15050565b6119ee612ddd565b6001600160a01b03811615801590611a1f57505f828152600a60205260409020546001600160a01b03828116911614155b8290611a41576040516381c4951960e01b815260040161099f91815260200190565b505f918252600a602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f546001600160a01b03163314611a985760405162461bcd60e51b815260040161099f906145df565b5f818152600d602052604090205460ff166001816006811115611abd57611abd613c8f565b14611ae257816001826040516337e1404160e01b815260040161099f93929190614610565b5f828152600d60205260409020805460ff19166002179055601354611b0790426142ad565b5f838152600e602052604080822092909255905183917fc44405af9078047712501f519e1fb900c2896c62b488336f84529c72ae16e6f191a2815f5160206149e75f395f51905f5260016002604051611b6192919061454b565b60405180910390a25050565b5f546001600160a01b03163314611b965760405162461bcd60e51b815260040161099f906145df565b5f828152600860209081526040808320600d9092529091205460ff166002816006811115611bc657611bc6613c8f565b14611beb57836002826040516337e1404160e01b815260040161099f93929190614610565b5f848152600d6020526040808220805460ff19166003179055600b84018590555185917f11df18edb9bc9cd90a79068e0e208b630202148643d797d6150e7bacb733e63c91a2835f5160206149e75f395f51905f5260026003604051611c5292919061454b565b60405180910390a250505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b611caf60405180606001604052805f81526020015f81526020015f81525090565b5060408051606081018252601354815260145460208201526015549181019190915290565b5f818152600d602052604090205460ff166006816006811115611cf957611cf9613c8f565b14611d365760405162461bcd60e51b815260206004820152600d60248201526c114cc81b9bdd0819985a5b1959609a1b604482015260640161099f565b5f828152600c602052604090205480611d885760405162461bcd60e51b8152602060048201526014602482015273139bc81c185e5b595b9d081d1bc81c99599d5b9960621b604482015260640161099f565b5f838152600c60205260408120819055611da184612eec565b5f858152601160205260409020546002549192506001600160a01b0390811691611dce9183911685612fe0565b60025460405163da19b69760e01b81526001600160a01b039091169063da19b69790611e04908890879087908790600401614674565b5f604051808303815f87803b158015611e1b575f5ffd5b505af1158015611e2d573d5f5f3e3d5ffd5b50505050847f5297818f48a66292b8b3e2caab83eec531b669bb20807fd38cf006adb2a07317848451604051611e6d929190918252602082015260400190565b60405180910390a25050505050565b611e9d60405180606001604052805f81526020015f81526020015f81525090565b505f908152600e6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b5f818152600d6020526040812054819060ff16611ef2848261300b565b9250925050915091565b5f5f611f0787610d10565b5f888152600d602052604090205490915060ff166003816006811115611f2f57611f2f613c8f565b1488600383909192611f57576040516337e1404160e01b815260040161099f93929190614610565b5050505f888152600e6020908152604091829020825160608101845281548152600182015492810183905260029091015492810192909252899042811015611fbb576040516308f3034360e31b81526004810192909252602482015260440161099f565b5050606083015160200151899042811115611ff25760405163017e35e560e71b81526004810192909252602482015260440161099f565b505061016083015189901561201d57604051637eb9cea960e11b815260040161099f91815260200190565b505f888860405161202f9291906146ab565b60408051918290039091205f8c815260086020908152838220600c01839055600d905291909120805460ff1916600417905560155490915061207190426142ad565b5f8b8152600e6020526040908190206002019190915560a08501519051632f0e1bbf60e01b81526001600160a01b0390911690632f0e1bbf906120be908d9085908c908c906004016146ba565b6020604051808303815f875af11580156120da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120fe9190614530565b945088888661212257604051632f9f8ab960e01b815260040161099f9291906146d9565b5050897f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade0718a8a6040516121569291906146d9565b60405180910390a2895f5160206149e75f395f51905f526003600460405161217f92919061454b565b60405180910390a25050505095945050505050565b5f5f61219f89610d10565b5f8a8152600d602052604090205490915060ff1660048160068111156121c7576121c7613c8f565b148a6004839091926121ef576040516337e1404160e01b815260040161099f93929190614610565b5050505f8a8152600e602090815260409182902082516060810184528154815260018201549281019290925260020154918101829052908b9042811015612252576040516308f3034360e31b81526004810192909252602482015260440161099f565b50505f8b8152600860205260409020600d0161226f8a8c836146ec565b505f8b8152600d6020526040902080546005919060ff191660018302179055508261010001516001600160a01b0316635bf48e3a8b8b6040516122b39291906146ab565b6040519081900381206001600160e01b031960e084901b1682526122e1918c908c908c908c906004016147a0565b602060405180830381865afa1580156122fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123209190614530565b935089898561234457604051632f9f8ab960e01b815260040161099f9291906146d9565b505061234f8b613193565b8a7f02a24c3402076671e129905ba4579d884b1f94ded1c07fc03d26d11b60bca1698b8b6040516123819291906146d9565b60405180910390a28a5f5160206149e75f395f51905f52600460056040516123aa92919061454b565b60405180910390a2505050979650505050505050565b6123c8612ddd565b80515f5b81811015612427576001600b8483815181106123ea576123ea614264565b60200260200101516040516123ff9190614566565b908152604051908190036020019020805491151560ff199092169190911790556001016123cc565b507f027b83cad653f54850fef6faa8c705f73a53e7f8de50a3a33ac1e0e3a5c0be81826040516119da919061457c565b5f546001600160a01b031633148061247957506003546001600160a01b031633145b6124c55760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c79205265676973747279206f7220536c617368696e674d677200000000604482015260640161099f565b5f8160ff161180156124db5750600d60ff821611155b6125205760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103330b4b63ab932903932b0b9b7b760511b604482015260640161099f565b61253e828260ff16600d81111561253957612539613c8f565b613542565b5050565b61254a612ddd565b6001600160a01b0381166125a05760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420536c617368696e674d616e61676572206164647265737300604482015260640161099f565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f4ccc8ed483c7c44c3602c3c38afc2c014a8f1d2dc210dfe58ebeeeead230f8e0905f90a250565b6003546001600160a01b0316331461263a5760405162461bcd60e51b815260206004820152601460248201527327b7363c9029b630b9b434b733a6b0b730b3b2b960611b604482015260640161099f565b60025460405163c1ab0f1f60e01b815260048101849052602481018390526001600160a01b039091169063c1ab0f1f906044015f604051808303815f87803b158015612684575f5ffd5b505af1158015612696573d5f5f3e3d5ffd5b50505050817f4f41a3b0a032ebcae925f2ace77d507435840ca4b2dbaffdd7723fa8d72ee54282604051611b6191815260200190565b6126d4612ddd565b6001600160a01b0381161580159061270557505f828152600960205260409020546001600160a01b03828116911614155b8290612727576040516381c4951960e01b815260040161099f91815260200190565b505f8281526009602090815260409182902080546001600160a01b0319166001600160a01b03851617905590518381527ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb6991016119da565b612787612ddd565b60058190556040518181527fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b52355290602001610ac7565b620f424080611007565b6127ce612ddd565b6001600160a01b038116158015906127f457506001546001600160a01b03828116911614155b8190612814576040516320252f0b60e01b815260040161099f9190613c26565b50600180546001600160a01b0319166001600160a01b0383161790556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a790610ac7908390613c26565b612868612ddd565b61287560208201826147eb565b63ffffffff1661288b60408301602084016147eb565b63ffffffff16101580156128b057505f6128a860208301836147eb565b63ffffffff16115b6128f05760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081d1a1c995cda1bdb19607a1b604482015260640161099f565b8060125f84600381111561290657612906613c8f565b600381111561291757612917613c8f565b815260208101919091526040015f206129319160026138e7565b5081600381111561294457612944613c8f565b7f8b56fae526eee054f0849759a99fc7d4ff3823824ebf097a56f7d78adb6b34fa82604051611b619190614804565b61297b612ddd565b6001600160a01b0381166129a4575f604051631e4fbdf760e01b815260040161099f9190613c26565b610ae381612e7c565b5f818152600d602052604081205460ff16818160068111156129d1576129d1613c8f565b036129f657826001826040516337e1404160e01b815260040161099f93929190614610565b6005816006811115612a0a57612a0a613c8f565b03612a2b5760405163462c7bed60e01b81526004810184905260240161099f565b6006816006811115612a3f57612a3f613c8f565b03612a6057604051633de16e3560e11b81526004810184905260240161099f565b5f612a6b848361300b565b9350905080612a9057604051639f65d93560e01b81526004810185905260240161099f565b5f848152600d6020526040902080546006919060ff191660018302179055505f848152600f60205260409020805484919060ff1916600183600d811115612ad957612ad9613c8f565b0217905550835f5160206149e75f395f51905f52836006604051612afe92919061454b565b60405180910390a2837fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb8385604051612b38929190614842565b60405180910390a25050919050565b612b4f612ddd565b6001600160a01b03811615801590612b7457505f546001600160a01b03828116911614155b8190612b94576040516375ac4eb760e11b815260040161099f9190613c26565b505f80546001600160a01b0319166001600160a01b0383161790556040517f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b690610ac7908390613c26565b6001600160a01b0381165f90815260076020526040902054819060ff1615612c1b5760405163b29d459560e01b815260040161099f9190613c26565b506001600160a01b0381165f9081526007602052604090819020805460ff19166001179055517fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46790610ac7908390613c26565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b612ca06136aa565b610ae3816136cf565b8035612cec5760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420444b472077696e646f7760701b604482015260640161099f565b5f816020013511612d385760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420636f6d707574652077696e646f7760501b604482015260640161099f565b5f816040013511612d875760405162461bcd60e51b8152602060048201526019602482015278496e76616c69642064656372797074696f6e2077696e646f7760381b604482015260640161099f565b80356013819055602080830135601481905560408085013560158190558151948552928401919091528201527f7e86ba16b805e2835af5c5b7aa5a942ced8bcc1fb95a05fbe42dae3862350a1690606001610ac7565b33612de6611c60565b6001600160a01b03161461194c573360405163118cdaa760e01b815260040161099f9190613c26565b6040516001600160a01b038481166024830152838116604483015260648201839052612e769186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506136d7565b50505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f818152600f602052604090205460609060ff16600181600d811115612f1457612f14613c8f565b1480612f315750600281600d811115612f2f57612f2f613c8f565b145b15612f69575f5b604051908082528060200260200182016040528015612f61578160200160208202803683370190505b509392505050565b5f5460405162beb08960e51b8152600481018590526001600160a01b03909116906317d61120906024015f60405180830381865afa925050508015612fcf57506040513d5f823e601f3d908101601f19168201604052612fcc919081019061485d565b60015b612fd9575f612f38565b9392505050565b61300683846001600160a01b031663a9059cbb8585604051602401612e449291906148ec565b505050565b5f828152600e60209081526040808320815160608101835281548152600182015493810193909352600201548282015282549051632800d82960e01b81526004810186905283929183916001600160a01b0390911690632800d82990602401602060405180830381865afa158015613085573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a991906143c0565b905060018560068111156130bf576130bf613c8f565b1480156130cb57508042115b156130de5760018093509350505061318c565b60028560068111156130f2576130f2613c8f565b1480156130ff5750815142115b15613113576001600393509350505061318c565b600385600681111561312757613127613c8f565b1480156131375750816020015142115b1561314b576001600693509350505061318c565b600485600681111561315f5761315f613c8f565b14801561316f5750816040015142115b15613183576001600a93509350505061318c565b5f5f9350935050505b9250929050565b5f805460405162beb08960e51b8152600481018490526001600160a01b03909116906317d61120906024015f60405180830381865afa1580156131d8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526131ff919081019061485d565b80515f848152600c60209081526040808320805490849055601190925282205493945091926001600160a01b03169082900361329d576002546040516341489f1560e01b81526001600160a01b03909116906341489f159061326990889088908690600401614905565b5f604051808303815f87803b158015613280575f5ffd5b505af1158015613292573d5f5f3e3d5ffd5b505050505050505050565b825f0361333e575f858152601060205260409020546001600160a01b031680156132d5576132d56001600160a01b0383168285612fe0565b6002546040516341489f1560e01b81526001600160a01b03909116906341489f159061330990899089908790600401614905565b5f604051808303815f87803b158015613320575f5ffd5b505af1158015613332573d5f5f3e3d5ffd5b50505050505050505050565b5f836001600160401b03811115613357576133576139d9565b604051908082528060200260200182016040528015613380578160200160208202803683370190505b5090505f61338e8585614935565b90505f805b868110156133cd57828482815181106133ae576133ae614264565b60209081029190910101526133c383836142ad565b9150600101613393565b505f6133d9828761429a565b905080156134165780846133ee60018a61429a565b815181106133fe576133fe614264565b6020026020010181815161341291906142ad565b9052505b600154613430906001600160a01b0387811691168861373a565b600154604051636ec640c760e11b81526001600160a01b039091169063dd8c818e906134649088908c908990600401614984565b5f604051808303815f87803b15801561347b575f5ffd5b505af115801561348d573d5f5f3e3d5ffd5b50506001546134ab92506001600160a01b038881169250165f61373a565b887fac9fe8ad7f55eac03284399116ecafc104f10459773f4cdf47063c46e5be335a89866040516134dd9291906149b9565b60405180910390a26002546040516341489f1560e01b81526001600160a01b03909116906341489f1590613519908c908c908a90600401614905565b5f604051808303815f87803b158015613530575f5ffd5b505af1158015610936573d5f5f3e3d5ffd5b5f828152600d602052604081205460ff169081600681111561356657613566613c8f565b0361358b57826001826040516337e1404160e01b815260040161099f93929190614610565b600581600681111561359f5761359f613c8f565b036135c05760405163462c7bed60e01b81526004810184905260240161099f565b60068160068111156135d4576135d4613c8f565b036135f557604051633de16e3560e11b81526004810184905260240161099f565b5f838152600d6020526040902080546006919060ff191660018302179055505f838152600f60205260409020805483919060ff1916600183600d81111561363e5761363e613c8f565b0217905550825f5160206149e75f395f51905f5282600660405161366392919061454b565b60405180910390a2827fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb828460405161369d929190614842565b60405180910390a2505050565b6136b26137ca565b61194c57604051631afcd79f60e31b815260040160405180910390fd5b61297b6136aa565b5f5f60205f8451602086015f885af1806136f6576040513d5f823e3d81fd5b50505f513d9150811561370d57806001141561371a565b6001600160a01b0384163b155b15612e765783604051635274afe760e01b815260040161099f9190613c26565b5f836001600160a01b031663095ea7b3848460405160240161375d9291906148ec565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061379684826137e3565b612e76576137c084856001600160a01b031663095ea7b3865f604051602401612e449291906148ec565b612e7684826136d7565b5f6137d3612c6e565b54600160401b900460ff16919050565b5f5f5f5f60205f8651602088015f8a5af192503d91505f519050828015613822575081156138145780600114613822565b5f866001600160a01b03163b115b9695505050505050565b604080516101e081019091525f808252602082019081526020015f8152602001613854613983565b81525f602082018190526040820181905260608083018190526080830181905260a0830182905260c0830182905260e08301829052610100830182905261012083015261014082018190526101609091015290565b82600281019282156138d7579160200282015b828111156138d75782518255916020019190600101906138bc565b506138e39291506139a1565b5090565b6001830191839082156138d7579160200282015f5b8382111561394657833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026138fc565b80156139765782816101000a81549063ffffffff0219169055600401602081600301049283019260010302613946565b50506138e39291506139a1565b60405180604001604052806002906020820280368337509192915050565b5b808211156138e3575f81556001016139a2565b6001600160a01b0381168114610ae3575f5ffd5b5f60608284031215611007575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613a1557613a156139d9565b604052919050565b5f6001600160401b03821115613a3557613a356139d9565b5060051b60200190565b5f82601f830112613a4e575f5ffd5b81356001600160401b03811115613a6757613a676139d9565b613a7a601f8201601f19166020016139ed565b818152846020838601011115613a8e575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613ab9575f5ffd5b8135613acc613ac782613a1d565b6139ed565b8082825260208201915060208360051b860101925085831115613aed575f5ffd5b602085015b83811015613b2d5780356001600160401b03811115613b0f575f5ffd5b613b1e886020838a0101613a3f565b84525060209283019201613af2565b5095945050505050565b5f5f5f5f5f5f5f5f610140898b031215613b4f575f5ffd5b8835613b5a816139b5565b97506020890135613b6a816139b5565b96506040890135613b7a816139b5565b95506060890135613b8a816139b5565b94506080890135613b9a816139b5565b935060a08901359250613bb08a60c08b016139c9565b91506101208901356001600160401b03811115613bcb575f5ffd5b613bd78b828c01613aaa565b9150509295985092959890939650565b5f60208284031215613bf7575f5ffd5b8135612fd9816139b5565b5f60208284031215613c12575f5ffd5b5035919050565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b803560048110613c48575f5ffd5b919050565b5f5f60408385031215613c5e575f5ffd5b613c6783613c3a565b946020939093013593505050565b5f60608284031215613c85575f5ffd5b612fd983836139c9565b634e487b7160e01b5f52602160045260245ffd5b600e8110613cb357613cb3613c8f565b9052565b60208101612c928284613ca3565b60048110613cb357613cb3613c8f565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8e8152613d13602082018f613cc5565b8c60408201528b6060820152613d2c608082018c613c19565b6101c060a08201525f613d436101c083018c613cd5565b82810360c0840152613d55818c613cd5565b9050613d6460e084018b613c19565b613d7261010084018a613c19565b8761012084015286610140840152828103610160840152613d938187613cd5565b915050613da4610180830185613c19565b8215156101a08301529f9e505050505050505050505050505050565b805f5b6002811015612e76578151845260209384019390910190600101613dc3565b805182525f6020820151613df96020850182613cc5565b50604082015160408401526060820151613e166060850182613dc0565b50608082015160a084015260a0820151613e3360c0850182613c19565b5060c082015161020060e0850152613e4f610200850182613cd5565b905060e0830151848203610100860152613e698282613cd5565b915050610100830151613e80610120860182613c19565b50610120830151613e95610140860182613c19565b506101408301516101608501526101608301516101808501526101808301518482036101a0860152613ec78282613cd5565b9150506101a0830151613ede6101c0860182613c19565b506101c08301518015156101e0860152612f61565b602081525f612fd96020830184613de2565b5f60208284031215613f15575f5ffd5b81356001600160401b03811115613f2a575f5ffd5b613f3684828501613a3f565b949350505050565b5f60208284031215613f4e575f5ffd5b81356001600160401b03811115613f63575f5ffd5b82016101008185031215612fd9575f5ffd5b828152604060208201525f613f366040830184613de2565b5f60208284031215613f9d575f5ffd5b81356001600160401b03811115613fb2575f5ffd5b613f3684828501613aaa565b5f5f60408385031215613fcf575f5ffd5b823591506020830135613fe1816139b5565b809150509250929050565b5f5f60408385031215613ffd575f5ffd5b50508035926020909101359150565b81518152602080830151908201526040808301519082015260608101612c92565b821515815260408101612fd96020830184613ca3565b5f5f83601f840112614053575f5ffd5b5081356001600160401b03811115614069575f5ffd5b60208301915083602082850101111561318c575f5ffd5b5f5f5f5f5f60608688031215614094575f5ffd5b8535945060208601356001600160401b038111156140b0575f5ffd5b6140bc88828901614043565b90955093505060408601356001600160401b038111156140da575f5ffd5b6140e688828901614043565b969995985093965092949392505050565b5f5f5f5f5f5f5f6080888a03121561410d575f5ffd5b8735965060208801356001600160401b03811115614129575f5ffd5b6141358a828b01614043565b90975095505060408801356001600160401b03811115614153575f5ffd5b61415f8a828b01614043565b90955093505060608801356001600160401b0381111561417d575f5ffd5b6141898a828b01614043565b989b979a50959850939692959293505050565b5f5f604083850312156141ad575f5ffd5b82359150602083013560ff81168114613fe1575f5ffd5b60078110613cb357613cb3613c8f565b60208101612c9282846141c4565b5f5f606083850312156141f3575f5ffd5b6141fc83613c3a565b91508360608401111561420d575f5ffd5b50926020919091019150565b600181811c9082168061422d57607f821691505b60208210810361100757634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561425b575f5ffd5b612fd982613c3a565b634e487b7160e01b5f52603260045260245ffd5b60208101612c928284613cc5565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612c9257612c92614286565b80820180821115612c9257612c92614286565b5f600182016142d1576142d1614286565b5060010190565b5f5f8335601e198436030181126142ed575f5ffd5b8301803591506001600160401b03821115614306575f5ffd5b60200191503681900382131561318c575f5ffd5b8015158114610ae3575f5ffd5b5f60208284031215614337575f5ffd5b8135612fd98161431a565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b88815287602082015260a060408201525f61438960a08301888a614342565b828103606084015261439c818789614342565b905082810360808401526143b1818587614342565b9b9a5050505050505050505050565b5f602082840312156143d0575f5ffd5b5051919050565b601f82111561300657805f5260205f20601f840160051c810160208510156143fc5750805b601f840160051c820191505b8181101561441b575f8155600101614408565b5050505050565b5f19600383901b1c191660019190911b1790565b81516001600160401b0381111561444f5761444f6139d9565b6144638161445d8454614219565b846143d7565b6020601f821160018114614490575f831561447e5750848201515b6144888482614422565b85555061441b565b5f84815260208120601f198516915b828110156144bf578785015182556020948501946001909201910161449f565b50848210156144dc57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b838152602081018390526080810160408201835f5b600281101561452557815163ffffffff16835260209283019290910190600101614500565b505050949350505050565b5f60208284031215614540575f5ffd5b8151612fd98161431a565b6040810161455982856141c4565b612fd960208301846141c4565b5f82518060208501845e5f920191825250919050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156145d357603f198786030184526145be858351613cd5565b945060209384019391909101906001016145a2565b50929695505050505050565b6020808252601790820152764f6e6c79204369706865726e6f6465526567697374727960481b604082015260600190565b8381526060810161462460208301856141c4565b613f3660408301846141c4565b5f8151808452602084019350602083015f5b8281101561466a5781516001600160a01b0316865260209586019590910190600101614643565b5093949350505050565b848152836020820152608060408201525f6146926080830185614631565b905060018060a01b038316606083015295945050505050565b818382375f9101908152919050565b848152836020820152606060408201525f613822606083018486614342565b602081525f613f36602083018486614342565b6001600160401b03831115614703576147036139d9565b614717836147118354614219565b836143d7565b5f601f841160018114614743575f85156147315750838201355b61473b8682614422565b84555061441b565b5f83815260208120601f198716915b828110156147725786850135825560209485019460019092019101614752565b508682101561478e575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b858152606060208201525f6147b9606083018688614342565b82810360408401526147cc818587614342565b98975050505050505050565b803563ffffffff81168114613c48575f5ffd5b5f602082840312156147fb575f5ffd5b612fd9826147d8565b6040810181835f5b60028110156148395763ffffffff614823836147d8565b168352602092830192919091019060010161480c565b50505092915050565b6040810161485082856141c4565b612fd96020830184613ca3565b5f6020828403121561486d575f5ffd5b81516001600160401b03811115614882575f5ffd5b8201601f81018413614892575f5ffd5b80516148a0613ac782613a1d565b8082825260208201915060208360051b8501019250868311156148c1575f5ffd5b6020840193505b828410156138225783516148db816139b5565b8252602093840193909101906148c8565b6001600160a01b03929092168252602082015260400190565b838152606060208201525f61491d6060830185614631565b905060018060a01b0383166040830152949350505050565b5f8261494f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f8151808452602084019350602083015f5b8281101561466a578151865260209586019590910190600101614966565b6001600160a01b03841681526060602082018190525f906149a790830185614631565b82810360408401526138228185614954565b604081525f6149cb6040830185614631565b82810360208401526149dd8185614954565b9594505050505056fe1b418a230a21d37a078bf8f16decbde8ccceacd77159371f62f0d4ea00d19967a164736f6c634300081c000a", + "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b614a48806100d65f395ff3fe608060405234801561000f575f5ffd5b50600436106102c3575f3560e01c806390173a4111610177578063cb649617116100d5578063ea71aa571161008f578063ea71aa5714610745578063f0691cba14610758578063f2fde38b1461076b578063f81b8ef61461077e578063fad8e11114610791578063fbdb3237146107a4578063fd2f3d01146107cc575f5ffd5b8063cb649617146106c1578063cbd16872146106ca578063cf0f34c4146106dd578063cfbdc98d146106f0578063da16fb2f1461071f578063e59e469514610732575f5ffd5b8063ac3d2f4211610131578063ac3d2f4214610618578063b27392d514610640578063b68fd1be14610653578063bb2d1b8214610666578063bff232c114610679578063c1ab0f1f1461068c578063c4ccafa21461069f575f5ffd5b806390173a41146105815780639117173c1461059657806392312386146105a9578063929a8faf146105bc57806399c6679d146105dd5780639c8570c814610605575f5ffd5b80634fc77264116102245780637c8c3b4d116101de5780637c8c3b4d146105085780637cfa9d741461051b57806381476ec21461052e57806385814243146105415780638da5cb5b146105545780638dcdd86b1461055c5780638e5ce3ad1461056e575f5ffd5b80634fc772641461049d57806364226409146104b0578063647846a5146104d15780636db5c8fd146104e4578063715018a6146104ed57806377868ae4146104f5575f5ffd5b80631ba72945116102805780631ba729451461039057806336c5d38a146103a35780634017daf0146103d2578063406ed35c146103ff5780634147a3601461041f578063459d92941461044c5780634e92ec631461048a575f5ffd5b806301d12f1c146102c757806302a3a9c9146102dc5780630ef81b2f146102ef57806310bc62811461032d57806311bd61d91461035557806315cce2241461037d575b5f5ffd5b6102da6102d5366004613b3b565b6107df565b005b6102da6102ea366004613beb565b610945565b6103176102fd366004613c06565b5f908152600960205260409020546001600160a01b031690565b6040516103249190613c2a565b60405180910390f35b61031761033b366004613c06565b60096020525f90815260409020546001600160a01b031681565b610368610363366004613c51565b6109f1565b60405163ffffffff9091168152602001610324565b6102da61038b366004613beb565b610a2d565b6102da61039e366004613c79565b610ad2565b6103c56103b1366004613c06565b5f908152600f602052604090205460ff1690565b6040516103249190613cbb565b6103e56103e0366004613c06565b610ae6565b6040516103249e9d9c9b9a99989796959493929190613d07565b61041261040d366004613c06565b610d10565b6040516103249190613ef7565b61043e61042d366004613c06565b600c6020525f908152604090205481565b604051908152602001610324565b61047a61045a366004613f09565b8051602081830181018051600b8252928201919093012091525460ff1681565b6040519015158152602001610324565b6102da610498366004613c06565b61100d565b6102da6104ab366004613beb565b61109c565b6104c36104be366004613f42565b61112f565b604051610324929190613f79565b600454610317906001600160a01b031681565b61043e60055481565b6102da61193b565b6102da610503366004613f91565b61194e565b6102da610516366004613fc2565b6119e6565b6102da610529366004613c06565b611a6f565b6102da61053c366004613ff0565b611b6d565b600154610317906001600160a01b031681565b610317611c60565b5f54610317906001600160a01b031681565b600354610317906001600160a01b031681565b610589611c8e565b6040516103249190614010565b6102da6105a4366004613c06565b611cd4565b6105896105b7366004613c06565b611e7c565b6105cf6105ca366004613c06565b611ed5565b604051610324929190614031565b6103176105eb366004613c06565b5f908152601060205260409020546001600160a01b031690565b61047a610613366004614084565b611efc565b610317610626366004613c06565b5f908152600a60205260409020546001600160a01b031690565b61047a61064e3660046140fb565b612194565b6102da610661366004613f91565b6123c4565b6102da6106743660046141a0565b61245b565b6102da610687366004613beb565b612546565b6102da61069a366004613ff0565b6125ed565b61047a6106ad366004613beb565b60076020525f908152604090205460ff1681565b61043e60065481565b6102da6106d8366004613fc2565b6126d0565b6102da6106eb366004613c06565b612783565b6107126106fe366004613c06565b5f908152600d602052604090205460ff1690565b60405161032491906141d8565b61043e61072d366004613f42565b6127c0565b6102da610740366004613beb565b6127ca565b6102da6107533660046141e6565b612864565b600254610317906001600160a01b031681565b6102da610779366004613beb565b612977565b6103c561078c366004613c06565b6129b1565b6102da61079f366004613beb565b612b4b565b6103176107b2366004613c06565b600a6020525f90815260409020546001600160a01b031681565b6102da6107da366004613beb565b612be3565b5f6107e8612c72565b805490915060ff600160401b82041615906001600160401b03165f8115801561080e5750825b90505f826001600160401b031660011480156108295750303b155b905081158015610837575080155b156108555760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561087f57845460ff60401b1916600160401b1785555b61088833612c9c565b61089188612783565b61089a8c612b4b565b6108a38b6127ca565b6108ac8a610945565b6108b589610a2d565b6108be87612cad565b6108c7866123c4565b6108cf611c60565b6001600160a01b03168d6001600160a01b0316146108f0576108f08d612977565b831561093657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b61094d612de1565b6001600160a01b0381166109a85760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964204533526566756e644d616e6167657220616464726573730060448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f9557d04c1c0b16f93f13b69aed23b3b6ab935bff3c53ac81d17896d3583542ed905f90a250565b6012602052815f5260405f208160028110610a0a575f80fd5b60089182820401919006600402915091509054906101000a900463ffffffff1681565b610a35612de1565b6001600160a01b03811615801590610a5b57506004546001600160a01b03828116911614155b8190610a7b5760405163eddf07f560e01b815260040161099f9190613c2a565b50600480546001600160a01b0319166001600160a01b0383161790556040517f722ff84c1234b2482061def5c82c6b5080c117b3cbb69d686844a051e4b8e7f390610ac7908390613c2a565b60405180910390a150565b610ada612de1565b610ae381612cad565b50565b60086020525f9081526040902080546001820154600283015460058401546006850154600786018054959660ff90951695939492936001600160a01b039092169291610b319061421d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5d9061421d565b8015610ba85780601f10610b7f57610100808354040283529160200191610ba8565b820191905f5260205f20905b815481529060010190602001808311610b8b57829003601f168201915b505050505090806008018054610bbd9061421d565b80601f0160208091040260200160405190810160405280929190818152602001828054610be99061421d565b8015610c345780601f10610c0b57610100808354040283529160200191610c34565b820191905f5260205f20905b815481529060010190602001808311610c1757829003601f168201915b5050506009840154600a850154600b860154600c870154600d8801805497986001600160a01b03958616989490951696509194509291610c739061421d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9f9061421d565b8015610cea5780601f10610cc157610100808354040283529160200191610cea565b820191905f5260205f20905b815481529060010190602001808311610ccd57829003601f168201915b505050600e90930154919250506001600160a01b0381169060ff600160a01b909104168e565b610d18613830565b5f8281526008602090815260409182902082516101e08101909352805483526001810154909183019060ff166003811115610d5557610d55613c93565b6003811115610d6657610d66613c93565b8152600282810154602083015260408051808201808352919093019291600385019182845b815481526020019060010190808311610d8b5750505091835250506005820154602082015260068201546001600160a01b03166040820152600782018054606090920191610dd89061421d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e049061421d565b8015610e4f5780601f10610e2657610100808354040283529160200191610e4f565b820191905f5260205f20905b815481529060010190602001808311610e3257829003601f168201915b50505050508152602001600882018054610e689061421d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e949061421d565b8015610edf5780601f10610eb657610100808354040283529160200191610edf565b820191905f5260205f20905b815481529060010190602001808311610ec257829003601f168201915b505050918352505060098201546001600160a01b039081166020830152600a830154166040820152600b8201546060820152600c8201546080820152600d8201805460a090920191610f309061421d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5c9061421d565b8015610fa75780601f10610f7e57610100808354040283529160200191610fa7565b820191905f5260205f20905b815481529060010190602001808311610f8a57829003601f168201915b5050509183525050600e91909101546001600160a01b038082166020840152600160a01b90910460ff16151560409092019190915260a08201519192508391166110075760405163cd6f4a4f60e01b815260040161099f91815260200190565b50919050565b611015612de1565b5f8181526009602052604090205481906001600160a01b031661104e576040516381c4951960e01b815260040161099f91815260200190565b505f818152600960205260409081902080546001600160a01b0319169055517f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc90610ac79083815260200190565b6110a4612de1565b6001600160a01b0381165f90815260076020526040902054819060ff166110df576040516321ac7c5f60e01b815260040161099f9190613c2a565b506001600160a01b0381165f9081526007602052604090819020805460ff19169055517f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e790610ac7908390613c2a565b5f611138613830565b5f601281611149602087018761424f565b600381111561115a5761115a613c93565b600381111561116b5761116b613c93565b8152602081019190915260409081015f20815180830190925260028282826020028201915f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611192579050505050505090505f816001600281106111e9576111e9614268565b602002015163ffffffff1611845f016020810190611207919061424f565b906112265760405163286c068d60e11b815260040161099f919061427c565b5060208401354281101561125057604051630b99e87960e01b815260040161099f91815260200190565b506040840135602085013581101561127e5760405163174b5a0760e21b815260040161099f91815260200190565b506015546014545f919061129642604089013561429e565b6112a091906142b1565b6112aa91906142b1565b9050600554811081906112d3576040516313b783af60e21b815260040161099f91815260200190565b5060075f6112e76080880160608901613beb565b6001600160a01b0316815260208101919091526040015f205460ff166113136080870160608801613beb565b906113325760405163295a6a6f60e11b815260040161099f9190613c2a565b505f61133d866127c0565b60068054965090915085905f611352836142c4565b9091555050604080514460208201529081018690525f9060600160408051808303601f1901815291815281516020928301205f898152600c84528281208690556004546011855283822080546001600160a01b039092166001600160a01b0319928316179055600d8552838220805460ff1916600117905560109094528290208054339416939093179092556014549192506113f191908901356142b1565b5f878152600e60209081526040909120600101919091558186526114179088018861424f565b8560200190600381111561142d5761142d613c93565b9081600381111561144057611440613c93565b905250436040808701919091528051808201825290602089019060029083908390808284375f9201919091525050506060808701919091526114889060808901908901613beb565b6001600160a01b031660a08601526114a360808801886142dc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505060c0808701919091526114eb908801886142dc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505060e08087019190915261153890610100890190890161432b565b15156101c08601525f610140860181905261016086018190526040805160208101909152908152610180860152336101a08601819052600454611588916001600160a01b03909116903085612e13565b5f6115996080890160608a01613beb565b6001600160a01b031663fefd9a8b88846115b660808d018d6142dc565b6115c360a08f018f6142dc565b8f8060c001906115d391906142dc565b6040518963ffffffff1660e01b81526004016115f698979695949392919061436e565b6020604051808303815f875af1158015611612573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163691906143c4565b5f818152600960205260409020549091506001600160a01b03168181611672576040516381c4951960e01b815260040161099f91815260200190565b505f828152600a60205260409020546001600160a01b031682816116ac576040516381c4951960e01b815260040161099f91815260200190565b50608088018390526001600160a01b038083166101008a015281166101208901525f8981526008602090815260409091208951815590890151600180830180548c94939260ff19919091169083600381111561170a5761170a613c93565b0217905550604082015181600201556060820151816003019060026117309291906138ad565b506080820151600582015560a08201516006820180546001600160a01b0319166001600160a01b0390921691909117905560c08201516007820190611775908261443a565b5060e0820151600882019061178a908261443a565b506101008201516009820180546001600160a01b039283166001600160a01b031991821617909155610120840151600a84018054919093169116179055610140820151600b820155610160820151600c820155610180820151600d8201906117f2908261443a565b506101a0820151600e90910180546101c0909301511515600160a01b026001600160a81b03199093166001600160a01b0392831617929092179091555f5460405163291a691b60e01b815291169063291a691b90611858908c9088908c906004016144ef565b6020604051808303815f875af1158015611874573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118989190614534565b6118b557604051630d8dbe2560e01b815260040160405180910390fd5b6118c560808b0160608c01613beb565b6001600160a01b03167f5904e83d57e704fba4d92c5617f6b50ae993cd42d78babfcb239d0a6775f30708a8a6040516118ff929190613f79565b60405180910390a2885f516020614a1c5f395f51905f525f600160405161192792919061454f565b60405180910390a250505050505050915091565b611943612de1565b61194c5f612e80565b565b611956612de1565b80515f5b818110156119aa57600b83828151811061197657611976614268565b602002602001015160405161198b919061456a565b908152604051908190036020019020805460ff1916905560010161195a565b507fd1b46e030b48add7bc03225cc5a6f403970976b36983f99ec31d535d627fc7db826040516119da9190614580565b60405180910390a15050565b6119ee612de1565b6001600160a01b03811615801590611a1f57505f828152600a60205260409020546001600160a01b03828116911614155b8290611a41576040516381c4951960e01b815260040161099f91815260200190565b505f918252600a602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f546001600160a01b03163314611a985760405162461bcd60e51b815260040161099f906145e3565b5f818152600d602052604090205460ff166001816006811115611abd57611abd613c93565b14611ae257816001826040516337e1404160e01b815260040161099f93929190614614565b5f828152600d60205260409020805460ff19166002179055601354611b0790426142b1565b5f838152600e602052604080822092909255905183917fc44405af9078047712501f519e1fb900c2896c62b488336f84529c72ae16e6f191a2815f516020614a1c5f395f51905f5260016002604051611b6192919061454f565b60405180910390a25050565b5f546001600160a01b03163314611b965760405162461bcd60e51b815260040161099f906145e3565b5f828152600860209081526040808320600d9092529091205460ff166002816006811115611bc657611bc6613c93565b14611beb57836002826040516337e1404160e01b815260040161099f93929190614614565b5f848152600d6020526040808220805460ff19166003179055600b84018590555185917f11df18edb9bc9cd90a79068e0e208b630202148643d797d6150e7bacb733e63c91a2835f516020614a1c5f395f51905f5260026003604051611c5292919061454f565b60405180910390a250505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b611caf60405180606001604052805f81526020015f81526020015f81525090565b5060408051606081018252601354815260145460208201526015549181019190915290565b5f818152600d602052604090205460ff166006816006811115611cf957611cf9613c93565b14611d365760405162461bcd60e51b815260206004820152600d60248201526c114cc81b9bdd0819985a5b1959609a1b604482015260640161099f565b5f828152600c602052604090205480611d885760405162461bcd60e51b8152602060048201526014602482015273139bc81c185e5b595b9d081d1bc81c99599d5b9960621b604482015260640161099f565b5f838152600c60205260408120819055611da184612ef0565b5f858152601160205260409020546002549192506001600160a01b0390811691611dce9183911685612fe4565b60025460405163da19b69760e01b81526001600160a01b039091169063da19b69790611e04908890879087908790600401614678565b5f604051808303815f87803b158015611e1b575f5ffd5b505af1158015611e2d573d5f5f3e3d5ffd5b50505050847f5297818f48a66292b8b3e2caab83eec531b669bb20807fd38cf006adb2a07317848451604051611e6d929190918252602082015260400190565b60405180910390a25050505050565b611e9d60405180606001604052805f81526020015f81526020015f81525090565b505f908152600e6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b5f818152600d6020526040812054819060ff16611ef2848261300f565b9250925050915091565b5f5f611f0787610d10565b5f888152600d602052604090205490915060ff166003816006811115611f2f57611f2f613c93565b1488600383909192611f57576040516337e1404160e01b815260040161099f93929190614614565b5050505f888152600e6020908152604091829020825160608101845281548152600182015492810183905260029091015492810192909252899042811015611fbb576040516308f3034360e31b81526004810192909252602482015260440161099f565b5050606083015160200151899042811115611ff25760405163017e35e560e71b81526004810192909252602482015260440161099f565b505061016083015189901561201d57604051637eb9cea960e11b815260040161099f91815260200190565b505f888860405161202f9291906146af565b60408051918290039091205f8c815260086020908152838220600c01839055600d905291909120805460ff1916600417905560155490915061207190426142b1565b5f8b8152600e6020526040908190206002019190915560a08501519051632f0e1bbf60e01b81526001600160a01b0390911690632f0e1bbf906120be908d9085908c908c906004016146be565b6020604051808303815f875af11580156120da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120fe9190614534565b945088888661212257604051632f9f8ab960e01b815260040161099f9291906146dd565b5050897f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade0718a8a6040516121569291906146dd565b60405180910390a2895f516020614a1c5f395f51905f526003600460405161217f92919061454f565b60405180910390a25050505095945050505050565b5f5f61219f89610d10565b5f8a8152600d602052604090205490915060ff1660048160068111156121c7576121c7613c93565b148a6004839091926121ef576040516337e1404160e01b815260040161099f93929190614614565b5050505f8a8152600e602090815260409182902082516060810184528154815260018201549281019290925260020154918101829052908b9042811015612252576040516308f3034360e31b81526004810192909252602482015260440161099f565b50505f8b8152600860205260409020600d0161226f8a8c836146f0565b505f8b8152600d6020526040902080546005919060ff191660018302179055508261010001516001600160a01b0316635bf48e3a8b8b6040516122b39291906146af565b6040519081900381206001600160e01b031960e084901b1682526122e1918c908c908c908c906004016147a4565b602060405180830381865afa1580156122fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123209190614534565b935089898561234457604051632f9f8ab960e01b815260040161099f9291906146dd565b505061234f8b613197565b8a7f3a140076c461ebc41d74833ae0ee8bbc8079a135a63392098cd381e84350b69b8b8b8b8b60405161238594939291906147dc565b60405180910390a28a5f516020614a1c5f395f51905f52600460056040516123ae92919061454f565b60405180910390a2505050979650505050505050565b6123cc612de1565b80515f5b8181101561242b576001600b8483815181106123ee576123ee614268565b6020026020010151604051612403919061456a565b908152604051908190036020019020805491151560ff199092169190911790556001016123d0565b507f027b83cad653f54850fef6faa8c705f73a53e7f8de50a3a33ac1e0e3a5c0be81826040516119da9190614580565b5f546001600160a01b031633148061247d57506003546001600160a01b031633145b6124c95760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c79205265676973747279206f7220536c617368696e674d677200000000604482015260640161099f565b5f8160ff161180156124df5750600d60ff821611155b6125245760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103330b4b63ab932903932b0b9b7b760511b604482015260640161099f565b612542828260ff16600d81111561253d5761253d613c93565b613546565b5050565b61254e612de1565b6001600160a01b0381166125a45760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420536c617368696e674d616e61676572206164647265737300604482015260640161099f565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f4ccc8ed483c7c44c3602c3c38afc2c014a8f1d2dc210dfe58ebeeeead230f8e0905f90a250565b6003546001600160a01b0316331461263e5760405162461bcd60e51b815260206004820152601460248201527327b7363c9029b630b9b434b733a6b0b730b3b2b960611b604482015260640161099f565b60025460405163c1ab0f1f60e01b815260048101849052602481018390526001600160a01b039091169063c1ab0f1f906044015f604051808303815f87803b158015612688575f5ffd5b505af115801561269a573d5f5f3e3d5ffd5b50505050817f4f41a3b0a032ebcae925f2ace77d507435840ca4b2dbaffdd7723fa8d72ee54282604051611b6191815260200190565b6126d8612de1565b6001600160a01b0381161580159061270957505f828152600960205260409020546001600160a01b03828116911614155b829061272b576040516381c4951960e01b815260040161099f91815260200190565b505f8281526009602090815260409182902080546001600160a01b0319166001600160a01b03851617905590518381527ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb6991016119da565b61278b612de1565b60058190556040518181527fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b52355290602001610ac7565b620f424080611007565b6127d2612de1565b6001600160a01b038116158015906127f857506001546001600160a01b03828116911614155b8190612818576040516320252f0b60e01b815260040161099f9190613c2a565b50600180546001600160a01b0319166001600160a01b0383161790556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a790610ac7908390613c2a565b61286c612de1565b6128796020820182614820565b63ffffffff1661288f6040830160208401614820565b63ffffffff16101580156128b457505f6128ac6020830183614820565b63ffffffff16115b6128f45760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081d1a1c995cda1bdb19607a1b604482015260640161099f565b8060125f84600381111561290a5761290a613c93565b600381111561291b5761291b613c93565b815260208101919091526040015f206129359160026138eb565b5081600381111561294857612948613c93565b7f8b56fae526eee054f0849759a99fc7d4ff3823824ebf097a56f7d78adb6b34fa82604051611b619190614839565b61297f612de1565b6001600160a01b0381166129a8575f604051631e4fbdf760e01b815260040161099f9190613c2a565b610ae381612e80565b5f818152600d602052604081205460ff16818160068111156129d5576129d5613c93565b036129fa57826001826040516337e1404160e01b815260040161099f93929190614614565b6005816006811115612a0e57612a0e613c93565b03612a2f5760405163462c7bed60e01b81526004810184905260240161099f565b6006816006811115612a4357612a43613c93565b03612a6457604051633de16e3560e11b81526004810184905260240161099f565b5f612a6f848361300f565b9350905080612a9457604051639f65d93560e01b81526004810185905260240161099f565b5f848152600d6020526040902080546006919060ff191660018302179055505f848152600f60205260409020805484919060ff1916600183600d811115612add57612add613c93565b0217905550835f516020614a1c5f395f51905f52836006604051612b0292919061454f565b60405180910390a2837fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb8385604051612b3c929190614877565b60405180910390a25050919050565b612b53612de1565b6001600160a01b03811615801590612b7857505f546001600160a01b03828116911614155b8190612b98576040516375ac4eb760e11b815260040161099f9190613c2a565b505f80546001600160a01b0319166001600160a01b0383161790556040517f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b690610ac7908390613c2a565b6001600160a01b0381165f90815260076020526040902054819060ff1615612c1f5760405163b29d459560e01b815260040161099f9190613c2a565b506001600160a01b0381165f9081526007602052604090819020805460ff19166001179055517fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46790610ac7908390613c2a565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b612ca46136ae565b610ae3816136d3565b8035612cf05760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420444b472077696e646f7760701b604482015260640161099f565b5f816020013511612d3c5760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420636f6d707574652077696e646f7760501b604482015260640161099f565b5f816040013511612d8b5760405162461bcd60e51b8152602060048201526019602482015278496e76616c69642064656372797074696f6e2077696e646f7760381b604482015260640161099f565b80356013819055602080830135601481905560408085013560158190558151948552928401919091528201527f7e86ba16b805e2835af5c5b7aa5a942ced8bcc1fb95a05fbe42dae3862350a1690606001610ac7565b33612dea611c60565b6001600160a01b03161461194c573360405163118cdaa760e01b815260040161099f9190613c2a565b6040516001600160a01b038481166024830152838116604483015260648201839052612e7a9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506136db565b50505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f818152600f602052604090205460609060ff16600181600d811115612f1857612f18613c93565b1480612f355750600281600d811115612f3357612f33613c93565b145b15612f6d575f5b604051908082528060200260200182016040528015612f65578160200160208202803683370190505b509392505050565b5f5460405162beb08960e51b8152600481018590526001600160a01b03909116906317d61120906024015f60405180830381865afa925050508015612fd357506040513d5f823e601f3d908101601f19168201604052612fd09190810190614892565b60015b612fdd575f612f3c565b9392505050565b61300a83846001600160a01b031663a9059cbb8585604051602401612e48929190614921565b505050565b5f828152600e60209081526040808320815160608101835281548152600182015493810193909352600201548282015282549051632800d82960e01b81526004810186905283929183916001600160a01b0390911690632800d82990602401602060405180830381865afa158015613089573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ad91906143c4565b905060018560068111156130c3576130c3613c93565b1480156130cf57508042115b156130e257600180935093505050613190565b60028560068111156130f6576130f6613c93565b1480156131035750815142115b156131175760016003935093505050613190565b600385600681111561312b5761312b613c93565b14801561313b5750816020015142115b1561314f5760016006935093505050613190565b600485600681111561316357613163613c93565b1480156131735750816040015142115b15613187576001600a935093505050613190565b5f5f9350935050505b9250929050565b5f805460405162beb08960e51b8152600481018490526001600160a01b03909116906317d61120906024015f60405180830381865afa1580156131dc573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526132039190810190614892565b80515f848152600c60209081526040808320805490849055601190925282205493945091926001600160a01b0316908290036132a1576002546040516341489f1560e01b81526001600160a01b03909116906341489f159061326d9088908890869060040161493a565b5f604051808303815f87803b158015613284575f5ffd5b505af1158015613296573d5f5f3e3d5ffd5b505050505050505050565b825f03613342575f858152601060205260409020546001600160a01b031680156132d9576132d96001600160a01b0383168285612fe4565b6002546040516341489f1560e01b81526001600160a01b03909116906341489f159061330d9089908990879060040161493a565b5f604051808303815f87803b158015613324575f5ffd5b505af1158015613336573d5f5f3e3d5ffd5b50505050505050505050565b5f836001600160401b0381111561335b5761335b6139dd565b604051908082528060200260200182016040528015613384578160200160208202803683370190505b5090505f613392858561496a565b90505f805b868110156133d157828482815181106133b2576133b2614268565b60209081029190910101526133c783836142b1565b9150600101613397565b505f6133dd828761429e565b9050801561341a5780846133f260018a61429e565b8151811061340257613402614268565b6020026020010181815161341691906142b1565b9052505b600154613434906001600160a01b0387811691168861373e565b600154604051636ec640c760e11b81526001600160a01b039091169063dd8c818e906134689088908c9089906004016149b9565b5f604051808303815f87803b15801561347f575f5ffd5b505af1158015613491573d5f5f3e3d5ffd5b50506001546134af92506001600160a01b038881169250165f61373e565b887fac9fe8ad7f55eac03284399116ecafc104f10459773f4cdf47063c46e5be335a89866040516134e19291906149ee565b60405180910390a26002546040516341489f1560e01b81526001600160a01b03909116906341489f159061351d908c908c908a9060040161493a565b5f604051808303815f87803b158015613534575f5ffd5b505af1158015610936573d5f5f3e3d5ffd5b5f828152600d602052604081205460ff169081600681111561356a5761356a613c93565b0361358f57826001826040516337e1404160e01b815260040161099f93929190614614565b60058160068111156135a3576135a3613c93565b036135c45760405163462c7bed60e01b81526004810184905260240161099f565b60068160068111156135d8576135d8613c93565b036135f957604051633de16e3560e11b81526004810184905260240161099f565b5f838152600d6020526040902080546006919060ff191660018302179055505f838152600f60205260409020805483919060ff1916600183600d81111561364257613642613c93565b0217905550825f516020614a1c5f395f51905f5282600660405161366792919061454f565b60405180910390a2827fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb82846040516136a1929190614877565b60405180910390a2505050565b6136b66137ce565b61194c57604051631afcd79f60e31b815260040160405180910390fd5b61297f6136ae565b5f5f60205f8451602086015f885af1806136fa576040513d5f823e3d81fd5b50505f513d9150811561371157806001141561371e565b6001600160a01b0384163b155b15612e7a5783604051635274afe760e01b815260040161099f9190613c2a565b5f836001600160a01b031663095ea7b38484604051602401613761929190614921565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061379a84826137e7565b612e7a576137c484856001600160a01b031663095ea7b3865f604051602401612e48929190614921565b612e7a84826136db565b5f6137d7612c72565b54600160401b900460ff16919050565b5f5f5f5f60205f8651602088015f8a5af192503d91505f519050828015613826575081156138185780600114613826565b5f866001600160a01b03163b115b9695505050505050565b604080516101e081019091525f808252602082019081526020015f8152602001613858613987565b81525f602082018190526040820181905260608083018190526080830181905260a0830182905260c0830182905260e08301829052610100830182905261012083015261014082018190526101609091015290565b82600281019282156138db579160200282015b828111156138db5782518255916020019190600101906138c0565b506138e79291506139a5565b5090565b6001830191839082156138db579160200282015f5b8382111561394a57833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302613900565b801561397a5782816101000a81549063ffffffff021916905560040160208160030104928301926001030261394a565b50506138e79291506139a5565b60405180604001604052806002906020820280368337509192915050565b5b808211156138e7575f81556001016139a6565b6001600160a01b0381168114610ae3575f5ffd5b5f60608284031215611007575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613a1957613a196139dd565b604052919050565b5f6001600160401b03821115613a3957613a396139dd565b5060051b60200190565b5f82601f830112613a52575f5ffd5b81356001600160401b03811115613a6b57613a6b6139dd565b613a7e601f8201601f19166020016139f1565b818152846020838601011115613a92575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613abd575f5ffd5b8135613ad0613acb82613a21565b6139f1565b8082825260208201915060208360051b860101925085831115613af1575f5ffd5b602085015b83811015613b315780356001600160401b03811115613b13575f5ffd5b613b22886020838a0101613a43565b84525060209283019201613af6565b5095945050505050565b5f5f5f5f5f5f5f5f610140898b031215613b53575f5ffd5b8835613b5e816139b9565b97506020890135613b6e816139b9565b96506040890135613b7e816139b9565b95506060890135613b8e816139b9565b94506080890135613b9e816139b9565b935060a08901359250613bb48a60c08b016139cd565b91506101208901356001600160401b03811115613bcf575f5ffd5b613bdb8b828c01613aae565b9150509295985092959890939650565b5f60208284031215613bfb575f5ffd5b8135612fdd816139b9565b5f60208284031215613c16575f5ffd5b5035919050565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b803560048110613c4c575f5ffd5b919050565b5f5f60408385031215613c62575f5ffd5b613c6b83613c3e565b946020939093013593505050565b5f60608284031215613c89575f5ffd5b612fdd83836139cd565b634e487b7160e01b5f52602160045260245ffd5b600e8110613cb757613cb7613c93565b9052565b60208101612c968284613ca7565b60048110613cb757613cb7613c93565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8e8152613d17602082018f613cc9565b8c60408201528b6060820152613d30608082018c613c1d565b6101c060a08201525f613d476101c083018c613cd9565b82810360c0840152613d59818c613cd9565b9050613d6860e084018b613c1d565b613d7661010084018a613c1d565b8761012084015286610140840152828103610160840152613d978187613cd9565b915050613da8610180830185613c1d565b8215156101a08301529f9e505050505050505050505050505050565b805f5b6002811015612e7a578151845260209384019390910190600101613dc7565b805182525f6020820151613dfd6020850182613cc9565b50604082015160408401526060820151613e1a6060850182613dc4565b50608082015160a084015260a0820151613e3760c0850182613c1d565b5060c082015161020060e0850152613e53610200850182613cd9565b905060e0830151848203610100860152613e6d8282613cd9565b915050610100830151613e84610120860182613c1d565b50610120830151613e99610140860182613c1d565b506101408301516101608501526101608301516101808501526101808301518482036101a0860152613ecb8282613cd9565b9150506101a0830151613ee26101c0860182613c1d565b506101c08301518015156101e0860152612f65565b602081525f612fdd6020830184613de6565b5f60208284031215613f19575f5ffd5b81356001600160401b03811115613f2e575f5ffd5b613f3a84828501613a43565b949350505050565b5f60208284031215613f52575f5ffd5b81356001600160401b03811115613f67575f5ffd5b82016101008185031215612fdd575f5ffd5b828152604060208201525f613f3a6040830184613de6565b5f60208284031215613fa1575f5ffd5b81356001600160401b03811115613fb6575f5ffd5b613f3a84828501613aae565b5f5f60408385031215613fd3575f5ffd5b823591506020830135613fe5816139b9565b809150509250929050565b5f5f60408385031215614001575f5ffd5b50508035926020909101359150565b81518152602080830151908201526040808301519082015260608101612c96565b821515815260408101612fdd6020830184613ca7565b5f5f83601f840112614057575f5ffd5b5081356001600160401b0381111561406d575f5ffd5b602083019150836020828501011115613190575f5ffd5b5f5f5f5f5f60608688031215614098575f5ffd5b8535945060208601356001600160401b038111156140b4575f5ffd5b6140c088828901614047565b90955093505060408601356001600160401b038111156140de575f5ffd5b6140ea88828901614047565b969995985093965092949392505050565b5f5f5f5f5f5f5f6080888a031215614111575f5ffd5b8735965060208801356001600160401b0381111561412d575f5ffd5b6141398a828b01614047565b90975095505060408801356001600160401b03811115614157575f5ffd5b6141638a828b01614047565b90955093505060608801356001600160401b03811115614181575f5ffd5b61418d8a828b01614047565b989b979a50959850939692959293505050565b5f5f604083850312156141b1575f5ffd5b82359150602083013560ff81168114613fe5575f5ffd5b60078110613cb757613cb7613c93565b60208101612c9682846141c8565b5f5f606083850312156141f7575f5ffd5b61420083613c3e565b915083606084011115614211575f5ffd5b50926020919091019150565b600181811c9082168061423157607f821691505b60208210810361100757634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561425f575f5ffd5b612fdd82613c3e565b634e487b7160e01b5f52603260045260245ffd5b60208101612c968284613cc9565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612c9657612c9661428a565b80820180821115612c9657612c9661428a565b5f600182016142d5576142d561428a565b5060010190565b5f5f8335601e198436030181126142f1575f5ffd5b8301803591506001600160401b0382111561430a575f5ffd5b602001915036819003821315613190575f5ffd5b8015158114610ae3575f5ffd5b5f6020828403121561433b575f5ffd5b8135612fdd8161431e565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b88815287602082015260a060408201525f61438d60a08301888a614346565b82810360608401526143a0818789614346565b905082810360808401526143b5818587614346565b9b9a5050505050505050505050565b5f602082840312156143d4575f5ffd5b5051919050565b601f82111561300a57805f5260205f20601f840160051c810160208510156144005750805b601f840160051c820191505b8181101561441f575f815560010161440c565b5050505050565b5f19600383901b1c191660019190911b1790565b81516001600160401b03811115614453576144536139dd565b61446781614461845461421d565b846143db565b6020601f821160018114614494575f83156144825750848201515b61448c8482614426565b85555061441f565b5f84815260208120601f198516915b828110156144c357878501518255602094850194600190920191016144a3565b50848210156144e057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b838152602081018390526080810160408201835f5b600281101561452957815163ffffffff16835260209283019290910190600101614504565b505050949350505050565b5f60208284031215614544575f5ffd5b8151612fdd8161431e565b6040810161455d82856141c8565b612fdd60208301846141c8565b5f82518060208501845e5f920191825250919050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156145d757603f198786030184526145c2858351613cd9565b945060209384019391909101906001016145a6565b50929695505050505050565b6020808252601790820152764f6e6c79204369706865726e6f6465526567697374727960481b604082015260600190565b8381526060810161462860208301856141c8565b613f3a60408301846141c8565b5f8151808452602084019350602083015f5b8281101561466e5781516001600160a01b0316865260209586019590910190600101614647565b5093949350505050565b848152836020820152608060408201525f6146966080830185614635565b905060018060a01b038316606083015295945050505050565b818382375f9101908152919050565b848152836020820152606060408201525f613826606083018486614346565b602081525f613f3a602083018486614346565b6001600160401b03831115614707576147076139dd565b61471b83614715835461421d565b836143db565b5f601f841160018114614747575f85156147355750838201355b61473f8682614426565b84555061441f565b5f83815260208120601f198716915b828110156147765786850135825560209485019460019092019101614756565b5086821015614792575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b858152606060208201525f6147bd606083018688614346565b82810360408401526147d0818587614346565b98975050505050505050565b604081525f6147ef604083018688614346565b8281036020840152614802818587614346565b979650505050505050565b803563ffffffff81168114613c4c575f5ffd5b5f60208284031215614830575f5ffd5b612fdd8261480d565b6040810181835f5b600281101561486e5763ffffffff6148588361480d565b1683526020928301929190910190600101614841565b50505092915050565b6040810161488582856141c8565b612fdd6020830184613ca7565b5f602082840312156148a2575f5ffd5b81516001600160401b038111156148b7575f5ffd5b8201601f810184136148c7575f5ffd5b80516148d5613acb82613a21565b8082825260208201915060208360051b8501019250868311156148f6575f5ffd5b6020840193505b82841015613826578351614910816139b9565b8252602093840193909101906148fd565b6001600160a01b03929092168252602082015260400190565b838152606060208201525f6149526060830185614635565b905060018060a01b0383166040830152949350505050565b5f8261498457634e487b7160e01b5f52601260045260245ffd5b500490565b5f8151808452602084019350602083015f5b8281101561466e57815186526020958601959091019060010161499b565b6001600160a01b03841681526060602082018190525f906149dc90830185614635565b82810360408401526138268185614989565b604081525f614a006040830185614635565b8281036020840152614a128185614989565b9594505050505056fe1b418a230a21d37a078bf8f16decbde8ccceacd77159371f62f0d4ea00d19967a164736f6c634300081c000a", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106102c3575f3560e01c806390173a4111610177578063cb649617116100d5578063ea71aa571161008f578063ea71aa5714610745578063f0691cba14610758578063f2fde38b1461076b578063f81b8ef61461077e578063fad8e11114610791578063fbdb3237146107a4578063fd2f3d01146107cc575f5ffd5b8063cb649617146106c1578063cbd16872146106ca578063cf0f34c4146106dd578063cfbdc98d146106f0578063da16fb2f1461071f578063e59e469514610732575f5ffd5b8063ac3d2f4211610131578063ac3d2f4214610618578063b27392d514610640578063b68fd1be14610653578063bb2d1b8214610666578063bff232c114610679578063c1ab0f1f1461068c578063c4ccafa21461069f575f5ffd5b806390173a41146105815780639117173c1461059657806392312386146105a9578063929a8faf146105bc57806399c6679d146105dd5780639c8570c814610605575f5ffd5b80634fc77264116102245780637c8c3b4d116101de5780637c8c3b4d146105085780637cfa9d741461051b57806381476ec21461052e57806385814243146105415780638da5cb5b146105545780638dcdd86b1461055c5780638e5ce3ad1461056e575f5ffd5b80634fc772641461049d57806364226409146104b0578063647846a5146104d15780636db5c8fd146104e4578063715018a6146104ed57806377868ae4146104f5575f5ffd5b80631ba72945116102805780631ba729451461039057806336c5d38a146103a35780634017daf0146103d2578063406ed35c146103ff5780634147a3601461041f578063459d92941461044c5780634e92ec631461048a575f5ffd5b806301d12f1c146102c757806302a3a9c9146102dc5780630ef81b2f146102ef57806310bc62811461032d57806311bd61d91461035557806315cce2241461037d575b5f5ffd5b6102da6102d5366004613b3b565b6107df565b005b6102da6102ea366004613beb565b610945565b6103176102fd366004613c06565b5f908152600960205260409020546001600160a01b031690565b6040516103249190613c2a565b60405180910390f35b61031761033b366004613c06565b60096020525f90815260409020546001600160a01b031681565b610368610363366004613c51565b6109f1565b60405163ffffffff9091168152602001610324565b6102da61038b366004613beb565b610a2d565b6102da61039e366004613c79565b610ad2565b6103c56103b1366004613c06565b5f908152600f602052604090205460ff1690565b6040516103249190613cbb565b6103e56103e0366004613c06565b610ae6565b6040516103249e9d9c9b9a99989796959493929190613d07565b61041261040d366004613c06565b610d10565b6040516103249190613ef7565b61043e61042d366004613c06565b600c6020525f908152604090205481565b604051908152602001610324565b61047a61045a366004613f09565b8051602081830181018051600b8252928201919093012091525460ff1681565b6040519015158152602001610324565b6102da610498366004613c06565b61100d565b6102da6104ab366004613beb565b61109c565b6104c36104be366004613f42565b61112f565b604051610324929190613f79565b600454610317906001600160a01b031681565b61043e60055481565b6102da61193b565b6102da610503366004613f91565b61194e565b6102da610516366004613fc2565b6119e6565b6102da610529366004613c06565b611a6f565b6102da61053c366004613ff0565b611b6d565b600154610317906001600160a01b031681565b610317611c60565b5f54610317906001600160a01b031681565b600354610317906001600160a01b031681565b610589611c8e565b6040516103249190614010565b6102da6105a4366004613c06565b611cd4565b6105896105b7366004613c06565b611e7c565b6105cf6105ca366004613c06565b611ed5565b604051610324929190614031565b6103176105eb366004613c06565b5f908152601060205260409020546001600160a01b031690565b61047a610613366004614084565b611efc565b610317610626366004613c06565b5f908152600a60205260409020546001600160a01b031690565b61047a61064e3660046140fb565b612194565b6102da610661366004613f91565b6123c4565b6102da6106743660046141a0565b61245b565b6102da610687366004613beb565b612546565b6102da61069a366004613ff0565b6125ed565b61047a6106ad366004613beb565b60076020525f908152604090205460ff1681565b61043e60065481565b6102da6106d8366004613fc2565b6126d0565b6102da6106eb366004613c06565b612783565b6107126106fe366004613c06565b5f908152600d602052604090205460ff1690565b60405161032491906141d8565b61043e61072d366004613f42565b6127c0565b6102da610740366004613beb565b6127ca565b6102da6107533660046141e6565b612864565b600254610317906001600160a01b031681565b6102da610779366004613beb565b612977565b6103c561078c366004613c06565b6129b1565b6102da61079f366004613beb565b612b4b565b6103176107b2366004613c06565b600a6020525f90815260409020546001600160a01b031681565b6102da6107da366004613beb565b612be3565b5f6107e8612c72565b805490915060ff600160401b82041615906001600160401b03165f8115801561080e5750825b90505f826001600160401b031660011480156108295750303b155b905081158015610837575080155b156108555760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561087f57845460ff60401b1916600160401b1785555b61088833612c9c565b61089188612783565b61089a8c612b4b565b6108a38b6127ca565b6108ac8a610945565b6108b589610a2d565b6108be87612cad565b6108c7866123c4565b6108cf611c60565b6001600160a01b03168d6001600160a01b0316146108f0576108f08d612977565b831561093657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b61094d612de1565b6001600160a01b0381166109a85760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964204533526566756e644d616e6167657220616464726573730060448201526064015b60405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f9557d04c1c0b16f93f13b69aed23b3b6ab935bff3c53ac81d17896d3583542ed905f90a250565b6012602052815f5260405f208160028110610a0a575f80fd5b60089182820401919006600402915091509054906101000a900463ffffffff1681565b610a35612de1565b6001600160a01b03811615801590610a5b57506004546001600160a01b03828116911614155b8190610a7b5760405163eddf07f560e01b815260040161099f9190613c2a565b50600480546001600160a01b0319166001600160a01b0383161790556040517f722ff84c1234b2482061def5c82c6b5080c117b3cbb69d686844a051e4b8e7f390610ac7908390613c2a565b60405180910390a150565b610ada612de1565b610ae381612cad565b50565b60086020525f9081526040902080546001820154600283015460058401546006850154600786018054959660ff90951695939492936001600160a01b039092169291610b319061421d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5d9061421d565b8015610ba85780601f10610b7f57610100808354040283529160200191610ba8565b820191905f5260205f20905b815481529060010190602001808311610b8b57829003601f168201915b505050505090806008018054610bbd9061421d565b80601f0160208091040260200160405190810160405280929190818152602001828054610be99061421d565b8015610c345780601f10610c0b57610100808354040283529160200191610c34565b820191905f5260205f20905b815481529060010190602001808311610c1757829003601f168201915b5050506009840154600a850154600b860154600c870154600d8801805497986001600160a01b03958616989490951696509194509291610c739061421d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9f9061421d565b8015610cea5780601f10610cc157610100808354040283529160200191610cea565b820191905f5260205f20905b815481529060010190602001808311610ccd57829003601f168201915b505050600e90930154919250506001600160a01b0381169060ff600160a01b909104168e565b610d18613830565b5f8281526008602090815260409182902082516101e08101909352805483526001810154909183019060ff166003811115610d5557610d55613c93565b6003811115610d6657610d66613c93565b8152600282810154602083015260408051808201808352919093019291600385019182845b815481526020019060010190808311610d8b5750505091835250506005820154602082015260068201546001600160a01b03166040820152600782018054606090920191610dd89061421d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e049061421d565b8015610e4f5780601f10610e2657610100808354040283529160200191610e4f565b820191905f5260205f20905b815481529060010190602001808311610e3257829003601f168201915b50505050508152602001600882018054610e689061421d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e949061421d565b8015610edf5780601f10610eb657610100808354040283529160200191610edf565b820191905f5260205f20905b815481529060010190602001808311610ec257829003601f168201915b505050918352505060098201546001600160a01b039081166020830152600a830154166040820152600b8201546060820152600c8201546080820152600d8201805460a090920191610f309061421d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5c9061421d565b8015610fa75780601f10610f7e57610100808354040283529160200191610fa7565b820191905f5260205f20905b815481529060010190602001808311610f8a57829003601f168201915b5050509183525050600e91909101546001600160a01b038082166020840152600160a01b90910460ff16151560409092019190915260a08201519192508391166110075760405163cd6f4a4f60e01b815260040161099f91815260200190565b50919050565b611015612de1565b5f8181526009602052604090205481906001600160a01b031661104e576040516381c4951960e01b815260040161099f91815260200190565b505f818152600960205260409081902080546001600160a01b0319169055517f104eb329a192aef26eddea07c2af5ad2587792e62b37ed4045b6ba59bc5540fc90610ac79083815260200190565b6110a4612de1565b6001600160a01b0381165f90815260076020526040902054819060ff166110df576040516321ac7c5f60e01b815260040161099f9190613c2a565b506001600160a01b0381165f9081526007602052604090819020805460ff19169055517f56070b80bd617fcd2f7a284861edb488830a38f9dedcd77b2cb2f4eac17743e790610ac7908390613c2a565b5f611138613830565b5f601281611149602087018761424f565b600381111561115a5761115a613c93565b600381111561116b5761116b613c93565b8152602081019190915260409081015f20815180830190925260028282826020028201915f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611192579050505050505090505f816001600281106111e9576111e9614268565b602002015163ffffffff1611845f016020810190611207919061424f565b906112265760405163286c068d60e11b815260040161099f919061427c565b5060208401354281101561125057604051630b99e87960e01b815260040161099f91815260200190565b506040840135602085013581101561127e5760405163174b5a0760e21b815260040161099f91815260200190565b506015546014545f919061129642604089013561429e565b6112a091906142b1565b6112aa91906142b1565b9050600554811081906112d3576040516313b783af60e21b815260040161099f91815260200190565b5060075f6112e76080880160608901613beb565b6001600160a01b0316815260208101919091526040015f205460ff166113136080870160608801613beb565b906113325760405163295a6a6f60e11b815260040161099f9190613c2a565b505f61133d866127c0565b60068054965090915085905f611352836142c4565b9091555050604080514460208201529081018690525f9060600160408051808303601f1901815291815281516020928301205f898152600c84528281208690556004546011855283822080546001600160a01b039092166001600160a01b0319928316179055600d8552838220805460ff1916600117905560109094528290208054339416939093179092556014549192506113f191908901356142b1565b5f878152600e60209081526040909120600101919091558186526114179088018861424f565b8560200190600381111561142d5761142d613c93565b9081600381111561144057611440613c93565b905250436040808701919091528051808201825290602089019060029083908390808284375f9201919091525050506060808701919091526114889060808901908901613beb565b6001600160a01b031660a08601526114a360808801886142dc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505060c0808701919091526114eb908801886142dc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505060e08087019190915261153890610100890190890161432b565b15156101c08601525f610140860181905261016086018190526040805160208101909152908152610180860152336101a08601819052600454611588916001600160a01b03909116903085612e13565b5f6115996080890160608a01613beb565b6001600160a01b031663fefd9a8b88846115b660808d018d6142dc565b6115c360a08f018f6142dc565b8f8060c001906115d391906142dc565b6040518963ffffffff1660e01b81526004016115f698979695949392919061436e565b6020604051808303815f875af1158015611612573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163691906143c4565b5f818152600960205260409020549091506001600160a01b03168181611672576040516381c4951960e01b815260040161099f91815260200190565b505f828152600a60205260409020546001600160a01b031682816116ac576040516381c4951960e01b815260040161099f91815260200190565b50608088018390526001600160a01b038083166101008a015281166101208901525f8981526008602090815260409091208951815590890151600180830180548c94939260ff19919091169083600381111561170a5761170a613c93565b0217905550604082015181600201556060820151816003019060026117309291906138ad565b506080820151600582015560a08201516006820180546001600160a01b0319166001600160a01b0390921691909117905560c08201516007820190611775908261443a565b5060e0820151600882019061178a908261443a565b506101008201516009820180546001600160a01b039283166001600160a01b031991821617909155610120840151600a84018054919093169116179055610140820151600b820155610160820151600c820155610180820151600d8201906117f2908261443a565b506101a0820151600e90910180546101c0909301511515600160a01b026001600160a81b03199093166001600160a01b0392831617929092179091555f5460405163291a691b60e01b815291169063291a691b90611858908c9088908c906004016144ef565b6020604051808303815f875af1158015611874573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118989190614534565b6118b557604051630d8dbe2560e01b815260040160405180910390fd5b6118c560808b0160608c01613beb565b6001600160a01b03167f5904e83d57e704fba4d92c5617f6b50ae993cd42d78babfcb239d0a6775f30708a8a6040516118ff929190613f79565b60405180910390a2885f516020614a1c5f395f51905f525f600160405161192792919061454f565b60405180910390a250505050505050915091565b611943612de1565b61194c5f612e80565b565b611956612de1565b80515f5b818110156119aa57600b83828151811061197657611976614268565b602002602001015160405161198b919061456a565b908152604051908190036020019020805460ff1916905560010161195a565b507fd1b46e030b48add7bc03225cc5a6f403970976b36983f99ec31d535d627fc7db826040516119da9190614580565b60405180910390a15050565b6119ee612de1565b6001600160a01b03811615801590611a1f57505f828152600a60205260409020546001600160a01b03828116911614155b8290611a41576040516381c4951960e01b815260040161099f91815260200190565b505f918252600a602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f546001600160a01b03163314611a985760405162461bcd60e51b815260040161099f906145e3565b5f818152600d602052604090205460ff166001816006811115611abd57611abd613c93565b14611ae257816001826040516337e1404160e01b815260040161099f93929190614614565b5f828152600d60205260409020805460ff19166002179055601354611b0790426142b1565b5f838152600e602052604080822092909255905183917fc44405af9078047712501f519e1fb900c2896c62b488336f84529c72ae16e6f191a2815f516020614a1c5f395f51905f5260016002604051611b6192919061454f565b60405180910390a25050565b5f546001600160a01b03163314611b965760405162461bcd60e51b815260040161099f906145e3565b5f828152600860209081526040808320600d9092529091205460ff166002816006811115611bc657611bc6613c93565b14611beb57836002826040516337e1404160e01b815260040161099f93929190614614565b5f848152600d6020526040808220805460ff19166003179055600b84018590555185917f11df18edb9bc9cd90a79068e0e208b630202148643d797d6150e7bacb733e63c91a2835f516020614a1c5f395f51905f5260026003604051611c5292919061454f565b60405180910390a250505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b611caf60405180606001604052805f81526020015f81526020015f81525090565b5060408051606081018252601354815260145460208201526015549181019190915290565b5f818152600d602052604090205460ff166006816006811115611cf957611cf9613c93565b14611d365760405162461bcd60e51b815260206004820152600d60248201526c114cc81b9bdd0819985a5b1959609a1b604482015260640161099f565b5f828152600c602052604090205480611d885760405162461bcd60e51b8152602060048201526014602482015273139bc81c185e5b595b9d081d1bc81c99599d5b9960621b604482015260640161099f565b5f838152600c60205260408120819055611da184612ef0565b5f858152601160205260409020546002549192506001600160a01b0390811691611dce9183911685612fe4565b60025460405163da19b69760e01b81526001600160a01b039091169063da19b69790611e04908890879087908790600401614678565b5f604051808303815f87803b158015611e1b575f5ffd5b505af1158015611e2d573d5f5f3e3d5ffd5b50505050847f5297818f48a66292b8b3e2caab83eec531b669bb20807fd38cf006adb2a07317848451604051611e6d929190918252602082015260400190565b60405180910390a25050505050565b611e9d60405180606001604052805f81526020015f81526020015f81525090565b505f908152600e6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b5f818152600d6020526040812054819060ff16611ef2848261300f565b9250925050915091565b5f5f611f0787610d10565b5f888152600d602052604090205490915060ff166003816006811115611f2f57611f2f613c93565b1488600383909192611f57576040516337e1404160e01b815260040161099f93929190614614565b5050505f888152600e6020908152604091829020825160608101845281548152600182015492810183905260029091015492810192909252899042811015611fbb576040516308f3034360e31b81526004810192909252602482015260440161099f565b5050606083015160200151899042811115611ff25760405163017e35e560e71b81526004810192909252602482015260440161099f565b505061016083015189901561201d57604051637eb9cea960e11b815260040161099f91815260200190565b505f888860405161202f9291906146af565b60408051918290039091205f8c815260086020908152838220600c01839055600d905291909120805460ff1916600417905560155490915061207190426142b1565b5f8b8152600e6020526040908190206002019190915560a08501519051632f0e1bbf60e01b81526001600160a01b0390911690632f0e1bbf906120be908d9085908c908c906004016146be565b6020604051808303815f875af11580156120da573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120fe9190614534565b945088888661212257604051632f9f8ab960e01b815260040161099f9291906146dd565b5050897f7cc27e4a5626cbc4f8ba1a927b0448de55e6a114bc87660331270c5109ade0718a8a6040516121569291906146dd565b60405180910390a2895f516020614a1c5f395f51905f526003600460405161217f92919061454f565b60405180910390a25050505095945050505050565b5f5f61219f89610d10565b5f8a8152600d602052604090205490915060ff1660048160068111156121c7576121c7613c93565b148a6004839091926121ef576040516337e1404160e01b815260040161099f93929190614614565b5050505f8a8152600e602090815260409182902082516060810184528154815260018201549281019290925260020154918101829052908b9042811015612252576040516308f3034360e31b81526004810192909252602482015260440161099f565b50505f8b8152600860205260409020600d0161226f8a8c836146f0565b505f8b8152600d6020526040902080546005919060ff191660018302179055508261010001516001600160a01b0316635bf48e3a8b8b6040516122b39291906146af565b6040519081900381206001600160e01b031960e084901b1682526122e1918c908c908c908c906004016147a4565b602060405180830381865afa1580156122fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123209190614534565b935089898561234457604051632f9f8ab960e01b815260040161099f9291906146dd565b505061234f8b613197565b8a7f3a140076c461ebc41d74833ae0ee8bbc8079a135a63392098cd381e84350b69b8b8b8b8b60405161238594939291906147dc565b60405180910390a28a5f516020614a1c5f395f51905f52600460056040516123ae92919061454f565b60405180910390a2505050979650505050505050565b6123cc612de1565b80515f5b8181101561242b576001600b8483815181106123ee576123ee614268565b6020026020010151604051612403919061456a565b908152604051908190036020019020805491151560ff199092169190911790556001016123d0565b507f027b83cad653f54850fef6faa8c705f73a53e7f8de50a3a33ac1e0e3a5c0be81826040516119da9190614580565b5f546001600160a01b031633148061247d57506003546001600160a01b031633145b6124c95760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c79205265676973747279206f7220536c617368696e674d677200000000604482015260640161099f565b5f8160ff161180156124df5750600d60ff821611155b6125245760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103330b4b63ab932903932b0b9b7b760511b604482015260640161099f565b612542828260ff16600d81111561253d5761253d613c93565b613546565b5050565b61254e612de1565b6001600160a01b0381166125a45760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420536c617368696e674d616e61676572206164647265737300604482015260640161099f565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f4ccc8ed483c7c44c3602c3c38afc2c014a8f1d2dc210dfe58ebeeeead230f8e0905f90a250565b6003546001600160a01b0316331461263e5760405162461bcd60e51b815260206004820152601460248201527327b7363c9029b630b9b434b733a6b0b730b3b2b960611b604482015260640161099f565b60025460405163c1ab0f1f60e01b815260048101849052602481018390526001600160a01b039091169063c1ab0f1f906044015f604051808303815f87803b158015612688575f5ffd5b505af115801561269a573d5f5f3e3d5ffd5b50505050817f4f41a3b0a032ebcae925f2ace77d507435840ca4b2dbaffdd7723fa8d72ee54282604051611b6191815260200190565b6126d8612de1565b6001600160a01b0381161580159061270957505f828152600960205260409020546001600160a01b03828116911614155b829061272b576040516381c4951960e01b815260040161099f91815260200190565b505f8281526009602090815260409182902080546001600160a01b0319166001600160a01b03851617905590518381527ff4041a3f914dac3bc9bf5f003ba41f28dbb84abe42f4e07c76266f5c8ceecb6991016119da565b61278b612de1565b60058190556040518181527fba0716ba1ee2ea8ecc4c64119b4537cdb42a99d82acf92af5b87607b8b52355290602001610ac7565b620f424080611007565b6127d2612de1565b6001600160a01b038116158015906127f857506001546001600160a01b03828116911614155b8190612818576040516320252f0b60e01b815260040161099f9190613c2a565b50600180546001600160a01b0319166001600160a01b0383161790556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a790610ac7908390613c2a565b61286c612de1565b6128796020820182614820565b63ffffffff1661288f6040830160208401614820565b63ffffffff16101580156128b457505f6128ac6020830183614820565b63ffffffff16115b6128f45760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081d1a1c995cda1bdb19607a1b604482015260640161099f565b8060125f84600381111561290a5761290a613c93565b600381111561291b5761291b613c93565b815260208101919091526040015f206129359160026138eb565b5081600381111561294857612948613c93565b7f8b56fae526eee054f0849759a99fc7d4ff3823824ebf097a56f7d78adb6b34fa82604051611b619190614839565b61297f612de1565b6001600160a01b0381166129a8575f604051631e4fbdf760e01b815260040161099f9190613c2a565b610ae381612e80565b5f818152600d602052604081205460ff16818160068111156129d5576129d5613c93565b036129fa57826001826040516337e1404160e01b815260040161099f93929190614614565b6005816006811115612a0e57612a0e613c93565b03612a2f5760405163462c7bed60e01b81526004810184905260240161099f565b6006816006811115612a4357612a43613c93565b03612a6457604051633de16e3560e11b81526004810184905260240161099f565b5f612a6f848361300f565b9350905080612a9457604051639f65d93560e01b81526004810185905260240161099f565b5f848152600d6020526040902080546006919060ff191660018302179055505f848152600f60205260409020805484919060ff1916600183600d811115612add57612add613c93565b0217905550835f516020614a1c5f395f51905f52836006604051612b0292919061454f565b60405180910390a2837fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb8385604051612b3c929190614877565b60405180910390a25050919050565b612b53612de1565b6001600160a01b03811615801590612b7857505f546001600160a01b03828116911614155b8190612b98576040516375ac4eb760e11b815260040161099f9190613c2a565b505f80546001600160a01b0319166001600160a01b0383161790556040517f80052b810d39120cf6c976cca504a21703f585521dc7a41c6d241090e6c579b690610ac7908390613c2a565b6001600160a01b0381165f90815260076020526040902054819060ff1615612c1f5760405163b29d459560e01b815260040161099f9190613c2a565b506001600160a01b0381165f9081526007602052604090819020805460ff19166001179055517fb8d368517268f297fff00825d67d098763117d061360d31027be5b2e1a59d46790610ac7908390613c2a565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005b92915050565b612ca46136ae565b610ae3816136d3565b8035612cf05760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420444b472077696e646f7760701b604482015260640161099f565b5f816020013511612d3c5760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420636f6d707574652077696e646f7760501b604482015260640161099f565b5f816040013511612d8b5760405162461bcd60e51b8152602060048201526019602482015278496e76616c69642064656372797074696f6e2077696e646f7760381b604482015260640161099f565b80356013819055602080830135601481905560408085013560158190558151948552928401919091528201527f7e86ba16b805e2835af5c5b7aa5a942ced8bcc1fb95a05fbe42dae3862350a1690606001610ac7565b33612dea611c60565b6001600160a01b03161461194c573360405163118cdaa760e01b815260040161099f9190613c2a565b6040516001600160a01b038481166024830152838116604483015260648201839052612e7a9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506136db565b50505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f818152600f602052604090205460609060ff16600181600d811115612f1857612f18613c93565b1480612f355750600281600d811115612f3357612f33613c93565b145b15612f6d575f5b604051908082528060200260200182016040528015612f65578160200160208202803683370190505b509392505050565b5f5460405162beb08960e51b8152600481018590526001600160a01b03909116906317d61120906024015f60405180830381865afa925050508015612fd357506040513d5f823e601f3d908101601f19168201604052612fd09190810190614892565b60015b612fdd575f612f3c565b9392505050565b61300a83846001600160a01b031663a9059cbb8585604051602401612e48929190614921565b505050565b5f828152600e60209081526040808320815160608101835281548152600182015493810193909352600201548282015282549051632800d82960e01b81526004810186905283929183916001600160a01b0390911690632800d82990602401602060405180830381865afa158015613089573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ad91906143c4565b905060018560068111156130c3576130c3613c93565b1480156130cf57508042115b156130e257600180935093505050613190565b60028560068111156130f6576130f6613c93565b1480156131035750815142115b156131175760016003935093505050613190565b600385600681111561312b5761312b613c93565b14801561313b5750816020015142115b1561314f5760016006935093505050613190565b600485600681111561316357613163613c93565b1480156131735750816040015142115b15613187576001600a935093505050613190565b5f5f9350935050505b9250929050565b5f805460405162beb08960e51b8152600481018490526001600160a01b03909116906317d61120906024015f60405180830381865afa1580156131dc573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526132039190810190614892565b80515f848152600c60209081526040808320805490849055601190925282205493945091926001600160a01b0316908290036132a1576002546040516341489f1560e01b81526001600160a01b03909116906341489f159061326d9088908890869060040161493a565b5f604051808303815f87803b158015613284575f5ffd5b505af1158015613296573d5f5f3e3d5ffd5b505050505050505050565b825f03613342575f858152601060205260409020546001600160a01b031680156132d9576132d96001600160a01b0383168285612fe4565b6002546040516341489f1560e01b81526001600160a01b03909116906341489f159061330d9089908990879060040161493a565b5f604051808303815f87803b158015613324575f5ffd5b505af1158015613336573d5f5f3e3d5ffd5b50505050505050505050565b5f836001600160401b0381111561335b5761335b6139dd565b604051908082528060200260200182016040528015613384578160200160208202803683370190505b5090505f613392858561496a565b90505f805b868110156133d157828482815181106133b2576133b2614268565b60209081029190910101526133c783836142b1565b9150600101613397565b505f6133dd828761429e565b9050801561341a5780846133f260018a61429e565b8151811061340257613402614268565b6020026020010181815161341691906142b1565b9052505b600154613434906001600160a01b0387811691168861373e565b600154604051636ec640c760e11b81526001600160a01b039091169063dd8c818e906134689088908c9089906004016149b9565b5f604051808303815f87803b15801561347f575f5ffd5b505af1158015613491573d5f5f3e3d5ffd5b50506001546134af92506001600160a01b038881169250165f61373e565b887fac9fe8ad7f55eac03284399116ecafc104f10459773f4cdf47063c46e5be335a89866040516134e19291906149ee565b60405180910390a26002546040516341489f1560e01b81526001600160a01b03909116906341489f159061351d908c908c908a9060040161493a565b5f604051808303815f87803b158015613534575f5ffd5b505af1158015610936573d5f5f3e3d5ffd5b5f828152600d602052604081205460ff169081600681111561356a5761356a613c93565b0361358f57826001826040516337e1404160e01b815260040161099f93929190614614565b60058160068111156135a3576135a3613c93565b036135c45760405163462c7bed60e01b81526004810184905260240161099f565b60068160068111156135d8576135d8613c93565b036135f957604051633de16e3560e11b81526004810184905260240161099f565b5f838152600d6020526040902080546006919060ff191660018302179055505f838152600f60205260409020805483919060ff1916600183600d81111561364257613642613c93565b0217905550825f516020614a1c5f395f51905f5282600660405161366792919061454f565b60405180910390a2827fe20209be7caae6e76291267cfa711353981274bf127e94f16eb9ec44b68582bb82846040516136a1929190614877565b60405180910390a2505050565b6136b66137ce565b61194c57604051631afcd79f60e31b815260040160405180910390fd5b61297f6136ae565b5f5f60205f8451602086015f885af1806136fa576040513d5f823e3d81fd5b50505f513d9150811561371157806001141561371e565b6001600160a01b0384163b155b15612e7a5783604051635274afe760e01b815260040161099f9190613c2a565b5f836001600160a01b031663095ea7b38484604051602401613761929190614921565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061379a84826137e7565b612e7a576137c484856001600160a01b031663095ea7b3865f604051602401612e48929190614921565b612e7a84826136db565b5f6137d7612c72565b54600160401b900460ff16919050565b5f5f5f5f60205f8651602088015f8a5af192503d91505f519050828015613826575081156138185780600114613826565b5f866001600160a01b03163b115b9695505050505050565b604080516101e081019091525f808252602082019081526020015f8152602001613858613987565b81525f602082018190526040820181905260608083018190526080830181905260a0830182905260c0830182905260e08301829052610100830182905261012083015261014082018190526101609091015290565b82600281019282156138db579160200282015b828111156138db5782518255916020019190600101906138c0565b506138e79291506139a5565b5090565b6001830191839082156138db579160200282015f5b8382111561394a57833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302613900565b801561397a5782816101000a81549063ffffffff021916905560040160208160030104928301926001030261394a565b50506138e79291506139a5565b60405180604001604052806002906020820280368337509192915050565b5b808211156138e7575f81556001016139a6565b6001600160a01b0381168114610ae3575f5ffd5b5f60608284031215611007575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613a1957613a196139dd565b604052919050565b5f6001600160401b03821115613a3957613a396139dd565b5060051b60200190565b5f82601f830112613a52575f5ffd5b81356001600160401b03811115613a6b57613a6b6139dd565b613a7e601f8201601f19166020016139f1565b818152846020838601011115613a92575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f82601f830112613abd575f5ffd5b8135613ad0613acb82613a21565b6139f1565b8082825260208201915060208360051b860101925085831115613af1575f5ffd5b602085015b83811015613b315780356001600160401b03811115613b13575f5ffd5b613b22886020838a0101613a43565b84525060209283019201613af6565b5095945050505050565b5f5f5f5f5f5f5f5f610140898b031215613b53575f5ffd5b8835613b5e816139b9565b97506020890135613b6e816139b9565b96506040890135613b7e816139b9565b95506060890135613b8e816139b9565b94506080890135613b9e816139b9565b935060a08901359250613bb48a60c08b016139cd565b91506101208901356001600160401b03811115613bcf575f5ffd5b613bdb8b828c01613aae565b9150509295985092959890939650565b5f60208284031215613bfb575f5ffd5b8135612fdd816139b9565b5f60208284031215613c16575f5ffd5b5035919050565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b803560048110613c4c575f5ffd5b919050565b5f5f60408385031215613c62575f5ffd5b613c6b83613c3e565b946020939093013593505050565b5f60608284031215613c89575f5ffd5b612fdd83836139cd565b634e487b7160e01b5f52602160045260245ffd5b600e8110613cb757613cb7613c93565b9052565b60208101612c968284613ca7565b60048110613cb757613cb7613c93565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8e8152613d17602082018f613cc9565b8c60408201528b6060820152613d30608082018c613c1d565b6101c060a08201525f613d476101c083018c613cd9565b82810360c0840152613d59818c613cd9565b9050613d6860e084018b613c1d565b613d7661010084018a613c1d565b8761012084015286610140840152828103610160840152613d978187613cd9565b915050613da8610180830185613c1d565b8215156101a08301529f9e505050505050505050505050505050565b805f5b6002811015612e7a578151845260209384019390910190600101613dc7565b805182525f6020820151613dfd6020850182613cc9565b50604082015160408401526060820151613e1a6060850182613dc4565b50608082015160a084015260a0820151613e3760c0850182613c1d565b5060c082015161020060e0850152613e53610200850182613cd9565b905060e0830151848203610100860152613e6d8282613cd9565b915050610100830151613e84610120860182613c1d565b50610120830151613e99610140860182613c1d565b506101408301516101608501526101608301516101808501526101808301518482036101a0860152613ecb8282613cd9565b9150506101a0830151613ee26101c0860182613c1d565b506101c08301518015156101e0860152612f65565b602081525f612fdd6020830184613de6565b5f60208284031215613f19575f5ffd5b81356001600160401b03811115613f2e575f5ffd5b613f3a84828501613a43565b949350505050565b5f60208284031215613f52575f5ffd5b81356001600160401b03811115613f67575f5ffd5b82016101008185031215612fdd575f5ffd5b828152604060208201525f613f3a6040830184613de6565b5f60208284031215613fa1575f5ffd5b81356001600160401b03811115613fb6575f5ffd5b613f3a84828501613aae565b5f5f60408385031215613fd3575f5ffd5b823591506020830135613fe5816139b9565b809150509250929050565b5f5f60408385031215614001575f5ffd5b50508035926020909101359150565b81518152602080830151908201526040808301519082015260608101612c96565b821515815260408101612fdd6020830184613ca7565b5f5f83601f840112614057575f5ffd5b5081356001600160401b0381111561406d575f5ffd5b602083019150836020828501011115613190575f5ffd5b5f5f5f5f5f60608688031215614098575f5ffd5b8535945060208601356001600160401b038111156140b4575f5ffd5b6140c088828901614047565b90955093505060408601356001600160401b038111156140de575f5ffd5b6140ea88828901614047565b969995985093965092949392505050565b5f5f5f5f5f5f5f6080888a031215614111575f5ffd5b8735965060208801356001600160401b0381111561412d575f5ffd5b6141398a828b01614047565b90975095505060408801356001600160401b03811115614157575f5ffd5b6141638a828b01614047565b90955093505060608801356001600160401b03811115614181575f5ffd5b61418d8a828b01614047565b989b979a50959850939692959293505050565b5f5f604083850312156141b1575f5ffd5b82359150602083013560ff81168114613fe5575f5ffd5b60078110613cb757613cb7613c93565b60208101612c9682846141c8565b5f5f606083850312156141f7575f5ffd5b61420083613c3e565b915083606084011115614211575f5ffd5b50926020919091019150565b600181811c9082168061423157607f821691505b60208210810361100757634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561425f575f5ffd5b612fdd82613c3e565b634e487b7160e01b5f52603260045260245ffd5b60208101612c968284613cc9565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612c9657612c9661428a565b80820180821115612c9657612c9661428a565b5f600182016142d5576142d561428a565b5060010190565b5f5f8335601e198436030181126142f1575f5ffd5b8301803591506001600160401b0382111561430a575f5ffd5b602001915036819003821315613190575f5ffd5b8015158114610ae3575f5ffd5b5f6020828403121561433b575f5ffd5b8135612fdd8161431e565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b88815287602082015260a060408201525f61438d60a08301888a614346565b82810360608401526143a0818789614346565b905082810360808401526143b5818587614346565b9b9a5050505050505050505050565b5f602082840312156143d4575f5ffd5b5051919050565b601f82111561300a57805f5260205f20601f840160051c810160208510156144005750805b601f840160051c820191505b8181101561441f575f815560010161440c565b5050505050565b5f19600383901b1c191660019190911b1790565b81516001600160401b03811115614453576144536139dd565b61446781614461845461421d565b846143db565b6020601f821160018114614494575f83156144825750848201515b61448c8482614426565b85555061441f565b5f84815260208120601f198516915b828110156144c357878501518255602094850194600190920191016144a3565b50848210156144e057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b838152602081018390526080810160408201835f5b600281101561452957815163ffffffff16835260209283019290910190600101614504565b505050949350505050565b5f60208284031215614544575f5ffd5b8151612fdd8161431e565b6040810161455d82856141c8565b612fdd60208301846141c8565b5f82518060208501845e5f920191825250919050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156145d757603f198786030184526145c2858351613cd9565b945060209384019391909101906001016145a6565b50929695505050505050565b6020808252601790820152764f6e6c79204369706865726e6f6465526567697374727960481b604082015260600190565b8381526060810161462860208301856141c8565b613f3a60408301846141c8565b5f8151808452602084019350602083015f5b8281101561466e5781516001600160a01b0316865260209586019590910190600101614647565b5093949350505050565b848152836020820152608060408201525f6146966080830185614635565b905060018060a01b038316606083015295945050505050565b818382375f9101908152919050565b848152836020820152606060408201525f613826606083018486614346565b602081525f613f3a602083018486614346565b6001600160401b03831115614707576147076139dd565b61471b83614715835461421d565b836143db565b5f601f841160018114614747575f85156147355750838201355b61473f8682614426565b84555061441f565b5f83815260208120601f198716915b828110156147765786850135825560209485019460019092019101614756565b5086821015614792575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b858152606060208201525f6147bd606083018688614346565b82810360408401526147d0818587614346565b98975050505050505050565b604081525f6147ef604083018688614346565b8281036020840152614802818587614346565b979650505050505050565b803563ffffffff81168114613c4c575f5ffd5b5f60208284031215614830575f5ffd5b612fdd8261480d565b6040810181835f5b600281101561486e5763ffffffff6148588361480d565b1683526020928301929190910190600101614841565b50505092915050565b6040810161488582856141c8565b612fdd6020830184613ca7565b5f602082840312156148a2575f5ffd5b81516001600160401b038111156148b7575f5ffd5b8201601f810184136148c7575f5ffd5b80516148d5613acb82613a21565b8082825260208201915060208360051b8501019250868311156148f6575f5ffd5b6020840193505b82841015613826578351614910816139b9565b8252602093840193909101906148fd565b6001600160a01b03929092168252602082015260400190565b838152606060208201525f6149526060830185614635565b905060018060a01b0383166040830152949350505050565b5f8261498457634e487b7160e01b5f52601260045260245ffd5b500490565b5f8151808452602084019350602083015f5b8281101561466e57815186526020958601959091019060010161499b565b6001600160a01b03841681526060602082018190525f906149dc90830185614635565b82810360408401526138268185614989565b604081525f614a006040830185614635565b8281036020840152614a128185614989565b9594505050505056fe1b418a230a21d37a078bf8f16decbde8ccceacd77159371f62f0d4ea00d19967a164736f6c634300081c000a", "linkReferences": {}, "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/Enclave.sol", - "buildInfoId": "solc-0_8_28-561f4408bcfee777a1360e3f4f4b4e2d1bea7249" + "buildInfoId": "solc-0_8_28-4e1d4326aa586bce7ef3b38a9e93aeff5ca3ac8f" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json b/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json index b362a1f358..00f3df517f 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json @@ -940,5 +940,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/IBondingRegistry.sol", - "buildInfoId": "solc-0_8_28-561f4408bcfee777a1360e3f4f4b4e2d1bea7249" + "buildInfoId": "solc-0_8_28-4e1d4326aa586bce7ef3b38a9e93aeff5ca3ac8f" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json b/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json index b55bf1b40f..cb5d780f9f 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json @@ -179,6 +179,12 @@ "internalType": "bytes", "name": "publicKey", "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "proof", + "type": "bytes" } ], "name": "CommitteePublished", @@ -787,5 +793,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/ICiphernodeRegistry.sol", - "buildInfoId": "solc-0_8_28-561f4408bcfee777a1360e3f4f4b4e2d1bea7249" + "buildInfoId": "solc-0_8_28-4e1d4326aa586bce7ef3b38a9e93aeff5ca3ac8f" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json b/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json index fb3cfe677d..262e25c88b 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json @@ -432,6 +432,12 @@ "internalType": "bytes", "name": "plaintextOutput", "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "proof", + "type": "bytes" } ], "name": "PlaintextOutputPublished", @@ -1395,5 +1401,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/IEnclave.sol", - "buildInfoId": "solc-0_8_28-561f4408bcfee777a1360e3f4f4b4e2d1bea7249" + "buildInfoId": "solc-0_8_28-4e1d4326aa586bce7ef3b38a9e93aeff5ca3ac8f" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json b/packages/enclave-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json index 7f8749fef3..399e4b928b 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json @@ -954,5 +954,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/ISlashingManager.sol", - "buildInfoId": "solc-0_8_28-561f4408bcfee777a1360e3f4f4b4e2d1bea7249" + "buildInfoId": "solc-0_8_28-4e1d4326aa586bce7ef3b38a9e93aeff5ca3ac8f" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json b/packages/enclave-contracts/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json index 8e6b18cc2f..c3e535bd60 100644 --- a/packages/enclave-contracts/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json +++ b/packages/enclave-contracts/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json @@ -377,6 +377,12 @@ "internalType": "bytes", "name": "publicKey", "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "proof", + "type": "bytes" } ], "name": "CommitteePublished", @@ -1247,30 +1253,30 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613d22806100d65f395ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80639f0f874a11610135578063e59e4695116100b4578063f26ef74e11610079578063f26ef74e14610571578063f2fde38b14610584578063f379b0df14610597578063f52fd803146105d1578063f6fc05d514610643575f5ffd5b8063e59e469514610516578063e6745e1314610529578063e82f3b701461053c578063ebf0c7171461054f578063f165053614610557575f5ffd5b8063c3a0ec30116100fa578063c3a0ec30146104ae578063ca2869a0146104bf578063cd6dc687146104de578063da881e5a146104f1578063dbb06c9314610504575f5ffd5b80639f0f874a1461044d578063a016493014610456578063a8a4d69b14610469578063bff232c11461047c578063c2b40ae41461048f575f5ffd5b8063715018a6116101c15780638d1ddfb1116101865780638d1ddfb1146103cd5780638da5cb5b146103e35780638e5ce3ad146103eb5780639015d371146103fe5780639a7a2ffc14610411575f5ffd5b8063715018a6146103465780637c92f5241461034e578063858142431461037b5780638a78bb151461039b5780638cb89ecb146103ae575f5ffd5b80632e7b716d116102075780632e7b716d146102d85780634d6861a6146102eb57806350e6d94c146102fe5780635d5047761461032057806370e36bbe14610333575f5ffd5b8063096b810a146102435780630f3e34121461025857806317d611201461026b5780632800d82914610294578063291a691b146102b5575b5f5ffd5b610256610251366004613191565b61064c565b005b6102566102663660046131ac565b610798565b61027e6102793660046131ac565b6107db565b60405161028b91906131c3565b60405180910390f35b6102a76102a23660046131ac565b61091d565b60405190815260200161028b565b6102c86102c336600461320e565b610969565b604051901515815260200161028b565b6102c86102e6366004613191565b610b43565b6102c86102f93660046131ac565b610bf6565b6102c861030c366004613191565b60066020525f908152604090205460ff1681565b6102c861032e366004613247565b610c35565b610256610341366004613191565b610c79565b610256610cef565b61036161035c366004613275565b610d02565b6040805192835263ffffffff90911660208301520161028b565b60015461038e906001600160a01b031681565b60405161028b91906132aa565b6102566103a9366004613191565b610ea9565b6102a76103bc3660046131ac565b60096020525f908152604090205481565b600454600160281b900464ffffffffff166102a7565b61038e610fe7565b600b5461038e906001600160a01b031681565b6102c861040c366004613191565b611015565b61043761041f366004613191565b60076020525f908152604090205464ffffffffff1681565b60405164ffffffffff909116815260200161028b565b6102a760035481565b61027e6104643660046131ac565b611032565b6102c8610477366004613247565b6110c8565b61025661048a366004613191565b61110c565b6102a761049d3660046131ac565b60086020525f908152604090205481565b6001546001600160a01b031661038e565b6102a76104cd3660046131ac565b5f9081526008602052604090205490565b6102566104ec3660046132be565b61115d565b6102c86104ff3660046131ac565b6112ba565b5f5461038e906001600160a01b031681565b610256610524366004613191565b6114ed565b6102566105373660046132e8565b611565565b6102a761054a3660046131ac565b611728565b6102a7611759565b61055f601481565b60405160ff909116815260200161028b565b61025661057f36600461334c565b61176b565b610256610592366004613191565b611a61565b6004546105b39064ffffffffff80821691600160281b90041682565b6040805164ffffffffff93841681529290911660208301520161028b565b6106146105df3660046131ac565b5f908152600a6020819052604090912090810154600590910154909163ffffffff80831692600160201b900416908284101590565b60405161028b949392919093845263ffffffff9283166020850152911660408301521515606082015260800190565b6102a760025481565b610654610fe7565b6001600160a01b0316336001600160a01b0316148061067d57506001546001600160a01b031633145b61069a57604051632864c4e160e01b815260040160405180910390fd5b6106a381611015565b81906106cc576040516381e5828960e01b81526004016106c391906132aa565b60405180910390fd5b506001600160a01b0381165f9081526007602052604081205464ffffffffff16906106fa9060049083611a9b565b6001600160a01b0382165f908152600660205260408120805460ff19169055600280549161072783613466565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d5906060015b60405180910390a25050565b6107a0611d3d565b60038190556040518181527fbe772dc189863d512fa01e489c8eac204975aef1a8662d8b5a333804b5207ab79060200160405180910390a150565b5f818152600a602081905260408220600681015491810154606093919291816001600160401b038111156108115761081161347b565b60405190808252806020026020018201604052801561083a578160200160208202803683370190505b5090505f805b84811015610911576001866009015f886006018481548110610864576108646134a3565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205460ff16600281111561089c5761089c61348f565b03610909578560060181815481106108b6576108b66134a3565b905f5260205f20015f9054906101000a90046001600160a01b03168383815181106108e3576108e36134a3565b6001600160a01b039092166020928302919091019091015281610905816134b7565b9250505b600101610840565b50909695505050505050565b5f818152600a6020526040812081815460ff1660038111156109415761094161348f565b0361095f57604051630d4c1d9760e41b815260040160405180910390fd5b6003015492915050565b5f80546001600160a01b031633146109945760405163e4c2a7eb60e01b815260040160405180910390fd5b5f848152600a6020526040812090815460ff1660038111156109b8576109b861348f565b146109d6576040516374ff462560e11b815260040160405180910390fd5b60015460408051630cc37d8f60e11b815290515f926001600160a01b031691631986fb1e9160048083019260209291908290030181865afa158015610a1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4191906134cf565b905080610a5460408601602087016134f9565b63ffffffff161115610a6c60408601602087016134f9565b829091610a9a576040516344ec930f60e01b815263ffffffff909216600483015260248201526044016106c3565b5050815460ff1916600190811783558201859055436002830155600354610ac19042613512565b6003830155610ad5600583018560026130c8565b50610ade611759565b5f87815260086020526040908190209190915560028301546003840154915188927f381d281d32f95ef8fe4e5f3b263ea6a32d03d331e1a141ae1da996dc02a7a17092610b2f928a928a9291613525565b60405180910390a250600195945050505050565b5f610b4d82611015565b610b5857505f919050565b6001546001600160a01b0316610b81576040516350ca893360e01b815260040160405180910390fd5b600154604051639f8a13d760e01b81526001600160a01b0390911690639f8a13d790610bb19085906004016132aa565b602060405180830381865afa158015610bcc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf09190613584565b92915050565b5f818152600a602052604081206001815460ff166003811115610c1b57610c1b61348f565b14610c2857505f92915050565b6003015442111592915050565b5f60015f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff166002811115610c7157610c7161348f565b149392505050565b610c81611d3d565b6001600160a01b038116610ca85760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b038316908117825560405190917f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c991a250565b610cf7611d3d565b610d005f611d6f565b565b600b545f9081906001600160a01b03163314610d315760405163fcef374960e01b815260040160405180910390fd5b5f858152600a602052604090206002815460ff166003811115610d5657610d5661348f565b14610d7457604051634f4b461f60e11b815260040160405180910390fd5b60058101546001600160a01b0386165f90815260098301602052604090205463ffffffff909116925060019060ff166002811115610db457610db461348f565b14610dc457600a01549150610ea1565b6001600160a01b0385165f9081526009820160205260408120805460ff19166002179055600a8201805491610df883613466565b919050555080600a01549250846001600160a01b0316867f6c783b92374361b4d6efaf29673b89437ee969bb3c9d2d5d86b143ad5447b8498686604051610e49929190918252602082015260400190565b60405180910390a36040805184815263ffffffff84166020820181905285101591810182905287907f119cb11dd0a68c257d6dc9b06dcb37dd422ce276eb8bf3cd0b7079a116b8e2989060600160405180910390a250505b935093915050565b610eb1610fe7565b6001600160a01b0316336001600160a01b03161480610eda57506001546001600160a01b031633145b610ef757604051632864c4e160e01b815260040160405180910390fd5b610f0081611015565b610fe45760048054600160281b900464ffffffffff1690610f2a906001600160a01b038416611ddf565b6001600160a01b0382165f908152600660209081526040808320805460ff1916600117905560079091528120805464ffffffffff841664ffffffffff199091161790556002805491610f7b836134b7565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db539060600161078c565b50565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081526006602052604090205460ff1690565b5f818152600a60205260409020600481015460609190611065576040516322e679e360e11b815260040160405180910390fd5b806006018054806020026020016040519081016040528092919081815260200182805480156110bb57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161109d575b5050505050915050919050565b5f805f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff1660028111156111035761110361348f565b14159392505050565b611114611d3d565b6001600160a01b03811661113b5760405163d92e233d60e01b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f611166611fb5565b805490915060ff600160401b82041615906001600160401b03165f8115801561118c5750825b90505f826001600160401b031660011480156111a75750303b155b9050811580156111b5575080155b156111d35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111fd57845460ff60401b1916600160401b1785555b6001600160a01b0387166112245760405163d92e233d60e01b815260040160405180910390fd5b61122d33611fdd565b61123960046014611fee565b61124286610798565b61124a610fe7565b6001600160a01b0316876001600160a01b03161461126b5761126b87611a61565b83156112b157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f818152600a6020526040812081815460ff1660038111156112de576112de61348f565b036112fc57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156113145761131461348f565b1461133257604051631860f69960e31b815260040160405180910390fd5b8060030154421161135657604051632f021e8d60e11b815260040160405180910390fd5b60058101546006820154600160201b90910463ffffffff1611158061143b578154600360ff199091161782556006820154600583015460408051928352600160201b90910463ffffffff16602083015285917fecc4a9fb7e28d074cba7f5b227e9b5827823c850a385539b9a2f98a08f8c203d910160405180910390a25f54604051635d968dc160e11b815260048101869052600260248201526001600160a01b039091169063bb2d1b82906044015f604051808303815f87803b15801561141c575f5ffd5b505af115801561142e573d5f5f3e3d5ffd5b505f979650505050505050565b815460ff191660021782556006820154600a8301555f54604051631f3ea75d60e21b8152600481018690526001600160a01b0390911690637cfa9d74906024015f604051808303815f87803b158015611492575f5ffd5b505af11580156114a4573d5f5f3e3d5ffd5b50505050837fed38c6266ebed7c01d311349a7fa67e0ef0f1d2f4760d60dbb34ca4799a2e132836006016040516114db919061359d565b60405180910390a25060019392505050565b6114f5611d3d565b6001600160a01b03811661151c5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a7905f90a250565b5f828152600a6020526040812090815460ff1660038111156115895761158961348f565b036115a757604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156115bf576115bf61348f565b146115dd57604051631860f69960e31b815260040160405180910390fd5b806003015442111561160257604051639a19114d60e01b815260040160405180910390fd5b335f90815260078201602052604090205460ff16156116345760405163257309f160e11b815260040160405180910390fd5b61163d33610b43565b61165a5760405163149fbcfd60e11b815260040160405180910390fd5b61166533838561206d565b6001810154604080516bffffffffffffffffffffffff193360601b16602080830191909152603482018690526054820187905260748083019490945282518083039094018452609490910190915281519101205f90335f8181526007850160205260409020805460ff191660011790559091506116e49083908361223e565b506040805184815260208101839052339186917f52999628fb1cb05707e842278833b22e511f11746202cecdf221968b0b89e8bd910160405180910390a350505050565b5f8181526009602052604090205480611754576040516322e679e360e11b815260040160405180910390fd5b919050565b5f6117666004601461243f565b905090565b611773611d3d565b5f898152600a602052604090206002815460ff1660038111156117985761179861348f565b146117b657604051634f4b461f60e11b815260040160405180910390fd5b6004810154156117d95760405163632a22bb60e01b815260040160405180910390fd5b600681015488146118225760405162461bcd60e51b815260206004820152601360248201527209cdec8ca40c6deeadce840dad2e6dac2e8c6d606b1b60448201526064016106c3565b5f61182f858701876136de565b9150505f8151116118795760405162461bcd60e51b815260206004820152601460248201527343353a206e6f207075626c696320696e7075747360601b60448201526064016106c3565b5f81600183516118899190613781565b81518110611899576118996134a3565b602002602001015190505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663406ed35c8e6040518263ffffffff1660e01b81526004016118e591815260200190565b5f60405180830381865afa1580156118ff573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119269190810190613866565b610120810151604051637bf41d7760e11b81529192506001600160a01b03169063f7e83aee90611960908b908b908b908b90600401613a05565b602060405180830381865afa15801561197b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061199f91906134cf565b5060048085018390555f8e815260096020526040808220859055905490516340a3b76160e11b81529182018f9052602482018490526001600160a01b0316906381476ec2906044015f604051808303815f87803b1580156119fe575f5ffd5b505af1158015611a10573d5f5f3e3d5ffd5b505050508c7ff7472ea3a028fe8a86ab1c9a3e2176b284c8c3a22675c101e0fa21c140b6678d8d8d8d8d604051611a4a9493929190613a36565b60405180910390a250505050505050505050505050565b611a69611d3d565b6001600160a01b038116611a92575f604051631e4fbdf760e01b81526004016106c391906132aa565b610fe481611d6f565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611ada5760405162461bcd60e51b81526004016106c390613a98565b825464ffffffffff600160281b90910481169082168111611b385760405162461bcd60e51b815260206004820152601860248201527713185e9e5253550e881b195859881b5d5cdd08195e1a5cdd60421b60448201526064016106c3565b825f5b81866001015f611b4b8488612538565b64ffffffffff1681526020019081526020015f20819055505f816001611b719190613ae2565b60ff168464ffffffffff16901c64ffffffffff16905060018564ffffffffff16901c64ffffffffff168111611ba65750611d35565b600185165f03611c6d575f611bc583611bc0886001613afb565b612538565b60408051808201825286815264ffffffffff83165f90815260018c0160209081529083902054908201529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611c2691600401613b18565b602060405180830381865af4158015611c41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6591906134cf565b935050611d21565b5f611c7d83611bc0600189613b48565b60408051808201825264ffffffffff83165f90815260018c0160209081529083902054825281018790529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611cde91600401613b18565b602060405180830381865af4158015611cf9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1d91906134cf565b9350505b50647fffffffff600194851c169301611b3b565b505050505050565b33611d46610fe7565b6001600160a01b031614610d00573360405163118cdaa760e01b81526004016106c391906132aa565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b8154600160281b900464ffffffffff167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611e2e5760405162461bcd60e51b81526004016106c390613a98565b825464ffffffffff90811690821610611e815760405162461bcd60e51b815260206004820152601560248201527413185e9e5253550e881d1c9959481a5cc8199d5b1b605a1b60448201526064016106c3565b611e8c816001613afb565b835464ffffffffff91909116600160281b0269ffffffffff000000000019909116178355815f5b81856001015f611ec38487612538565b64ffffffffff16815260208101919091526040015f20556001831615611fae575f611ef382611bc0600187613b48565b60408051808201825264ffffffffff83165f90815260018a0160209081529083902054825281018690529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611f5491600401613b18565b602060405180830381865af4158015611f6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9391906134cf565b647fffffffff600195861c1694909350919091019050611eb3565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610bf0565b611fe5612555565b610fe48161257a565b602060ff8216111561203c5760405162461bcd60e51b81526020600482015260176024820152764c617a79494d543a205472656520746f6f206c6172676560481b60448201526064016106c3565b61204d600160ff831681901b613781565b825469ffffffffffffffffffff191664ffffffffff919091161790915550565b5f821161208d5760405163aeaddff160e01b815260040160405180910390fd5b6001546001600160a01b03166120b6576040516350ca893360e01b815260040160405180910390fd5b5f818152600a602052604081206001805460028301549293926001600160a01b039091169163bb03bd719188916120ec91613781565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612133573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215791906134cf565b90505f60015f9054906101000a90046001600160a01b03166001600160a01b0316631209b1f66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121aa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121ce91906134cf565b90505f81116121f05760405163aeaddff160e01b815260040160405180910390fd5b5f6121fb8284613b65565b90505f811161221d5760405163149fbcfd60e11b815260040160405180910390fd5b808611156112b15760405163aeaddff160e01b815260040160405180910390fd5b60058301546006840180545f92600160201b900463ffffffff16908111156122bc57508054600180820183555f928352602080842090920180546001600160a01b0319166001600160a01b03881690811790915583526008870182526040808420869055600988019092529120805460ff1916821790559050612438565b5f5f90505f876008015f855f815481106122d8576122d86134a3565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905060015b8454811015612360575f896008015f878481548110612322576123226134a3565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905082811115612357578092508193505b50600101612301565b50808610612374575f945050505050612438565b5f886009015f86858154811061238c5761238c6134a3565b5f9182526020808320909101546001600160a01b031683528201929092526040019020805460ff191660018360028111156123c9576123c961348f565b0217905550868483815481106123e1576123e16134a3565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918916815260088a018252604080822089905560098b0190925220805460ff191660019081179091559450505050505b9392505050565b5f5f8260ff16116124925760405162461bcd60e51b815260206004820152601a60248201527f4c617a79494d543a206465707468206d757374206265203e203000000000000060448201526064016106c3565b602060ff831611156124b65760405162461bcd60e51b81526004016106c390613b84565b8254600160281b900464ffffffffff16806124d560ff85166002613cd5565b64ffffffffff1610156125255760405162461bcd60e51b8152602060048201526018602482015277098c2f4f2929aa87440c2dac4d2ceeadeeae640c8cae0e8d60431b60448201526064016106c3565b612530848285612582565b949350505050565b5f8161254b60ff851663ffffffff613cee565b6124389190613afb565b61255d61264a565b610d0057604051631afcd79f60e31b815260040160405180910390fd5b611a69612555565b5f602060ff831611156125a75760405162461bcd60e51b81526004016106c390613b84565b8264ffffffffff165f036125c5576125be82612663565b9050612438565b5f6125d1836001613ae2565b60ff166001600160401b038111156125eb576125eb61347b565b604051908082528060200260200182016040528015612614578160200160208202803683370190505b50905061262385858584612cfd565b808360ff1681518110612638576126386134a3565b60200260200101519150509392505050565b5f612653611fb5565b54600160401b900460ff16919050565b5f8160ff165f0361267557505f919050565b8160ff166001036126a757507f2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864919050565b8160ff166002036126d957507f1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1919050565b8160ff1660030361270b57507f18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238919050565b8160ff1660040361273d57507f07f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a919050565b8160ff1660050361276f57507f2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55919050565b8160ff166006036127a157507f2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78919050565b8160ff166007036127d357507f078295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d919050565b8160ff1660080361280557507f2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61919050565b8160ff1660090361283757507f0e884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747919050565b8160ff16600a0361286957507f1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2919050565b8160ff16600b0361289b57507f1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636919050565b8160ff16600c036128cd57507f2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a919050565b8160ff16600d036128ff57507f14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0919050565b8160ff16600e0361293157507f190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c919050565b8160ff16600f0361296357507f22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92919050565b8160ff1660100361299557507f2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323919050565b8160ff166011036129c757507f2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992919050565b8160ff166012036129f957507f0f57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f919050565b8160ff16601303612a2b57507f1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca919050565b8160ff16601403612a5d57507f2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e919050565b8160ff16601503612a8f57507f19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1919050565b8160ff16601603612ac157507f18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b919050565b8160ff16601703612af357507f2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d919050565b8160ff16601803612b2557507f27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540919050565b8160ff16601903612b5757507f2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21919050565b8160ff16601a03612b8957507f120c58f143d491e95902f7f5277778a2e0ad5168f6add75669932630ce611518919050565b8160ff16601b03612bbb57507f1f21feb70d3f21b07bf853d5e5db03071ec495a0a565a21da2d665d279483795919050565b8160ff16601c03612bed57507f24be905fa71335e14c638cc0f66a8623a826e768068a9e968bb1a1dde18a72d2919050565b8160ff16601d03612c1f57507f0f8666b62ed17491c50ceadead57d4cd597ef3821d65c328744c74e553dac26d919050565b8160ff16601e03612c5157507f0918d46bf52d98b034413f4a1a1c41594e7a7a3f6ae08cb43d1a2a230e1959ef919050565b8160ff16601f03612c8357507f1bbeb01b4c479ecde76917645e404dfa2e26f90d0afc5a65128513ad375c5ff2919050565b8160ff16602003612cb557507f2f68a1c58e257e42a17a6c61dff5551ed560b9922ab119d5ac8e184c9734ead9919050565b60405162461bcd60e51b815260206004820152601e60248201527f4c617a79494d543a2064656661756c745a65726f2062616420696e646578000060448201526064016106c3565b602060ff83161115612d215760405162461bcd60e51b81526004016106c390613b84565b5f8364ffffffffff1611612d855760405162461bcd60e51b815260206004820152602560248201527f4c617a79494d543a206e756d626572206f66206c6561766573206d7573742062604482015264065203e20360dc1b60648201526084016106c3565b5f612d91600185613b48565b9050600181165f03612de457846001015f612dac5f84612538565b64ffffffffff1681526020019081526020015f2054825f81518110612dd357612dd36134a3565b602002602001018181525050612e0c565b612ded5f612663565b825f81518110612dff57612dff6134a3565b6020026020010181815250505b5f5b8360ff168160ff161015611d3557600182165f03612f045773__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280868560ff1681518110612e6057612e606134a3565b60200260200101518152602001612e7685612663565b8152506040518263ffffffff1660e01b8152600401612e959190613b18565b602060405180830381865af4158015612eb0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed491906134cf565b83612ee0836001613ae2565b60ff1681518110612ef357612ef36134a3565b6020026020010181815250506130b5565b5f612f10826001613ae2565b60ff168664ffffffffff16901c64ffffffffff16905060018364ffffffffff16901c64ffffffffff16811115612fb2575f876001015f612f67856001612f569190613ae2565b60018864ffffffffff16901c612538565b64ffffffffff1681526020019081526020015f205490508085846001612f8d9190613ae2565b60ff1681518110612fa057612fa06134a3565b602002602001018181525050506130b3565b5f876001015f612fc985600188611bc09190613b48565b64ffffffffff1681526020019081526020015f2054905073__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280848152602001888760ff1681518110613020576130206134a3565b60200260200101518152506040518263ffffffff1660e01b81526004016130479190613b18565b602060405180830381865af4158015613062573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061308691906134cf565b85613092856001613ae2565b60ff16815181106130a5576130a56134a3565b602002602001018181525050505b505b647fffffffff600192831c169101612e0e565b600183019183908215613159579160200282015f5b8382111561312757833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026130dd565b80156131575782816101000a81549063ffffffff0219169055600401602081600301049283019260010302613127565b505b50613165929150613169565b5090565b5b80821115613165575f815560010161316a565b6001600160a01b0381168114610fe4575f5ffd5b5f602082840312156131a1575f5ffd5b81356124388161317d565b5f602082840312156131bc575f5ffd5b5035919050565b602080825282518282018190525f918401906040840190835b818110156132035783516001600160a01b03168352602093840193909201916001016131dc565b509095945050505050565b5f5f5f60808486031215613220575f5ffd5b83359250602084013591506080840185101561323a575f5ffd5b6040840190509250925092565b5f5f60408385031215613258575f5ffd5b82359150602083013561326a8161317d565b809150509250929050565b5f5f5f60608486031215613287575f5ffd5b8335925060208401356132998161317d565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b5f5f604083850312156132cf575f5ffd5b82356132da8161317d565b946020939093013593505050565b5f5f604083850312156132f9575f5ffd5b50508035926020909101359150565b5f5f83601f840112613318575f5ffd5b5081356001600160401b0381111561332e575f5ffd5b602083019150836020828501011115613345575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f60a08a8c031215613364575f5ffd5b8935985060208a01356001600160401b03811115613380575f5ffd5b8a01601f81018c13613390575f5ffd5b80356001600160401b038111156133a5575f5ffd5b8c60208260051b84010111156133b9575f5ffd5b6020919091019850965060408a01356001600160401b038111156133db575f5ffd5b6133e78c828d01613308565b90975095505060608a01356001600160401b03811115613405575f5ffd5b6134118c828d01613308565b90955093505060808a01356001600160401b0381111561342f575f5ffd5b61343b8c828d01613308565b915080935050809150509295985092959850929598565b634e487b7160e01b5f52601160045260245ffd5b5f8161347457613474613452565b505f190190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f600182016134c8576134c8613452565b5060010190565b5f602082840312156134df575f5ffd5b5051919050565b803563ffffffff81168114611754575f5ffd5b5f60208284031215613509575f5ffd5b612438826134e6565b80820180821115610bf057610bf0613452565b84815260a0810160208201855f5b60028110156135605763ffffffff61354a836134e6565b1683526020928301929190910190600101613533565b50505060608201939093526080015292915050565b80518015158114611754575f5ffd5b5f60208284031215613594575f5ffd5b61243882613575565b602080825282548282018190525f848152918220906040840190835b818110156132035783546001600160a01b03168352600193840193602090930192016135b9565b6040516101e081016001600160401b03811182821017156136035761360361347b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156136315761363161347b565b604052919050565b5f6001600160401b038211156136515761365161347b565b50601f01601f191660200190565b5f82601f83011261366e575f5ffd5b81356001600160401b038111156136875761368761347b565b8060051b61369760208201613609565b918252602081850181019290810190868411156136b2575f5ffd5b6020860192505b838310156136d45782358252602092830192909101906136b9565b9695505050505050565b5f5f604083850312156136ef575f5ffd5b82356001600160401b03811115613704575f5ffd5b8301601f81018513613714575f5ffd5b803561372761372282613639565b613609565b81815286602083850101111561373b575f5ffd5b816020840160208301375f6020838301015280945050505060208301356001600160401b0381111561376b575f5ffd5b6137778582860161365f565b9150509250929050565b81810381811115610bf057610bf0613452565b805160048110611754575f5ffd5b5f82601f8301126137b1575f5ffd5b604080519081016001600160401b03811182821017156137d3576137d361347b565b80604052508060408401858111156137e9575f5ffd5b845b818110156138035780518352602092830192016137eb565b509195945050505050565b80516117548161317d565b5f82601f830112613828575f5ffd5b815161383661372282613639565b81815284602083860101111561384a575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613876575f5ffd5b81516001600160401b0381111561388b575f5ffd5b8201610200818503121561389d575f5ffd5b6138a56135e0565b815181526138b560208301613794565b6020820152604082810151908201526138d185606084016137a2565b606082015260a082015160808201526138ec60c0830161380e565b60a082015260e08201516001600160401b03811115613909575f5ffd5b61391586828501613819565b60c0830152506101008201516001600160401b03811115613934575f5ffd5b61394086828501613819565b60e083015250613953610120830161380e565b610100820152613966610140830161380e565b61012082015261016082810151610140830152610180830151908201526101a08201516001600160401b0381111561399c575f5ffd5b6139a886828501613819565b610180830152506139bc6101c0830161380e565b6101a08201526139cf6101e08301613575565b6101c0820152949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f613a186040830186886139dd565b8281036020840152613a2b8185876139dd565b979650505050505050565b604080825281018490525f8560608301825b87811015613a78578235613a5b8161317d565b6001600160a01b0316825260209283019290910190600101613a48565b508381036020850152613a8c8186886139dd565b98975050505050505050565b6020808252602a908201527f4c617a79494d543a206c656166206d757374206265203c20534e41524b5f53436040820152691053105497d19251531160b21b606082015260800190565b60ff8181168382160190811115610bf057610bf0613452565b64ffffffffff8181168382160190811115610bf057610bf0613452565b6040810181835f5b6002811015613b3f578151835260209283019290910190600101613b20565b50505092915050565b64ffffffffff8281168282160390811115610bf057610bf0613452565b5f82613b7f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526023908201527f4c617a79494d543a206465707468206d757374206265203c3d204d41585f44456040820152620a0a8960eb1b606082015260800190565b6001815b6001841115610ea157808504811115613be657613be6613452565b6001841615613bf457908102905b60019390931c928002613bcb565b5f82613c1057506001610bf0565b81613c1c57505f610bf0565b8160018114613c325760028114613c3c57613c6e565b6001915050610bf0565b60ff841115613c4d57613c4d613452565b6001841b915064ffffffffff821115613c6857613c68613452565b50610bf0565b5060208310610133831016604e8410600b8410161715613ca6575081810a64ffffffffff811115613ca157613ca1613452565b610bf0565b613cb664ffffffffff8484613bc7565b8064ffffffffff04821115613ccd57613ccd613452565b029392505050565b5f61243864ffffffffff841664ffffffffff8416613c02565b64ffffffffff8181168382160290811690818114613d0e57613d0e613452565b509291505056fea164736f6c634300081c000a", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80639f0f874a11610135578063e59e4695116100b4578063f26ef74e11610079578063f26ef74e14610571578063f2fde38b14610584578063f379b0df14610597578063f52fd803146105d1578063f6fc05d514610643575f5ffd5b8063e59e469514610516578063e6745e1314610529578063e82f3b701461053c578063ebf0c7171461054f578063f165053614610557575f5ffd5b8063c3a0ec30116100fa578063c3a0ec30146104ae578063ca2869a0146104bf578063cd6dc687146104de578063da881e5a146104f1578063dbb06c9314610504575f5ffd5b80639f0f874a1461044d578063a016493014610456578063a8a4d69b14610469578063bff232c11461047c578063c2b40ae41461048f575f5ffd5b8063715018a6116101c15780638d1ddfb1116101865780638d1ddfb1146103cd5780638da5cb5b146103e35780638e5ce3ad146103eb5780639015d371146103fe5780639a7a2ffc14610411575f5ffd5b8063715018a6146103465780637c92f5241461034e578063858142431461037b5780638a78bb151461039b5780638cb89ecb146103ae575f5ffd5b80632e7b716d116102075780632e7b716d146102d85780634d6861a6146102eb57806350e6d94c146102fe5780635d5047761461032057806370e36bbe14610333575f5ffd5b8063096b810a146102435780630f3e34121461025857806317d611201461026b5780632800d82914610294578063291a691b146102b5575b5f5ffd5b610256610251366004613191565b61064c565b005b6102566102663660046131ac565b610798565b61027e6102793660046131ac565b6107db565b60405161028b91906131c3565b60405180910390f35b6102a76102a23660046131ac565b61091d565b60405190815260200161028b565b6102c86102c336600461320e565b610969565b604051901515815260200161028b565b6102c86102e6366004613191565b610b43565b6102c86102f93660046131ac565b610bf6565b6102c861030c366004613191565b60066020525f908152604090205460ff1681565b6102c861032e366004613247565b610c35565b610256610341366004613191565b610c79565b610256610cef565b61036161035c366004613275565b610d02565b6040805192835263ffffffff90911660208301520161028b565b60015461038e906001600160a01b031681565b60405161028b91906132aa565b6102566103a9366004613191565b610ea9565b6102a76103bc3660046131ac565b60096020525f908152604090205481565b600454600160281b900464ffffffffff166102a7565b61038e610fe7565b600b5461038e906001600160a01b031681565b6102c861040c366004613191565b611015565b61043761041f366004613191565b60076020525f908152604090205464ffffffffff1681565b60405164ffffffffff909116815260200161028b565b6102a760035481565b61027e6104643660046131ac565b611032565b6102c8610477366004613247565b6110c8565b61025661048a366004613191565b61110c565b6102a761049d3660046131ac565b60086020525f908152604090205481565b6001546001600160a01b031661038e565b6102a76104cd3660046131ac565b5f9081526008602052604090205490565b6102566104ec3660046132be565b61115d565b6102c86104ff3660046131ac565b6112ba565b5f5461038e906001600160a01b031681565b610256610524366004613191565b6114ed565b6102566105373660046132e8565b611565565b6102a761054a3660046131ac565b611728565b6102a7611759565b61055f601481565b60405160ff909116815260200161028b565b61025661057f36600461334c565b61176b565b610256610592366004613191565b611a61565b6004546105b39064ffffffffff80821691600160281b90041682565b6040805164ffffffffff93841681529290911660208301520161028b565b6106146105df3660046131ac565b5f908152600a6020819052604090912090810154600590910154909163ffffffff80831692600160201b900416908284101590565b60405161028b949392919093845263ffffffff9283166020850152911660408301521515606082015260800190565b6102a760025481565b610654610fe7565b6001600160a01b0316336001600160a01b0316148061067d57506001546001600160a01b031633145b61069a57604051632864c4e160e01b815260040160405180910390fd5b6106a381611015565b81906106cc576040516381e5828960e01b81526004016106c391906132aa565b60405180910390fd5b506001600160a01b0381165f9081526007602052604081205464ffffffffff16906106fa9060049083611a9b565b6001600160a01b0382165f908152600660205260408120805460ff19169055600280549161072783613466565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d5906060015b60405180910390a25050565b6107a0611d3d565b60038190556040518181527fbe772dc189863d512fa01e489c8eac204975aef1a8662d8b5a333804b5207ab79060200160405180910390a150565b5f818152600a602081905260408220600681015491810154606093919291816001600160401b038111156108115761081161347b565b60405190808252806020026020018201604052801561083a578160200160208202803683370190505b5090505f805b84811015610911576001866009015f886006018481548110610864576108646134a3565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205460ff16600281111561089c5761089c61348f565b03610909578560060181815481106108b6576108b66134a3565b905f5260205f20015f9054906101000a90046001600160a01b03168383815181106108e3576108e36134a3565b6001600160a01b039092166020928302919091019091015281610905816134b7565b9250505b600101610840565b50909695505050505050565b5f818152600a6020526040812081815460ff1660038111156109415761094161348f565b0361095f57604051630d4c1d9760e41b815260040160405180910390fd5b6003015492915050565b5f80546001600160a01b031633146109945760405163e4c2a7eb60e01b815260040160405180910390fd5b5f848152600a6020526040812090815460ff1660038111156109b8576109b861348f565b146109d6576040516374ff462560e11b815260040160405180910390fd5b60015460408051630cc37d8f60e11b815290515f926001600160a01b031691631986fb1e9160048083019260209291908290030181865afa158015610a1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4191906134cf565b905080610a5460408601602087016134f9565b63ffffffff161115610a6c60408601602087016134f9565b829091610a9a576040516344ec930f60e01b815263ffffffff909216600483015260248201526044016106c3565b5050815460ff1916600190811783558201859055436002830155600354610ac19042613512565b6003830155610ad5600583018560026130c8565b50610ade611759565b5f87815260086020526040908190209190915560028301546003840154915188927f381d281d32f95ef8fe4e5f3b263ea6a32d03d331e1a141ae1da996dc02a7a17092610b2f928a928a9291613525565b60405180910390a250600195945050505050565b5f610b4d82611015565b610b5857505f919050565b6001546001600160a01b0316610b81576040516350ca893360e01b815260040160405180910390fd5b600154604051639f8a13d760e01b81526001600160a01b0390911690639f8a13d790610bb19085906004016132aa565b602060405180830381865afa158015610bcc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf09190613584565b92915050565b5f818152600a602052604081206001815460ff166003811115610c1b57610c1b61348f565b14610c2857505f92915050565b6003015442111592915050565b5f60015f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff166002811115610c7157610c7161348f565b149392505050565b610c81611d3d565b6001600160a01b038116610ca85760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b038316908117825560405190917f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c991a250565b610cf7611d3d565b610d005f611d6f565b565b600b545f9081906001600160a01b03163314610d315760405163fcef374960e01b815260040160405180910390fd5b5f858152600a602052604090206002815460ff166003811115610d5657610d5661348f565b14610d7457604051634f4b461f60e11b815260040160405180910390fd5b60058101546001600160a01b0386165f90815260098301602052604090205463ffffffff909116925060019060ff166002811115610db457610db461348f565b14610dc457600a01549150610ea1565b6001600160a01b0385165f9081526009820160205260408120805460ff19166002179055600a8201805491610df883613466565b919050555080600a01549250846001600160a01b0316867f6c783b92374361b4d6efaf29673b89437ee969bb3c9d2d5d86b143ad5447b8498686604051610e49929190918252602082015260400190565b60405180910390a36040805184815263ffffffff84166020820181905285101591810182905287907f119cb11dd0a68c257d6dc9b06dcb37dd422ce276eb8bf3cd0b7079a116b8e2989060600160405180910390a250505b935093915050565b610eb1610fe7565b6001600160a01b0316336001600160a01b03161480610eda57506001546001600160a01b031633145b610ef757604051632864c4e160e01b815260040160405180910390fd5b610f0081611015565b610fe45760048054600160281b900464ffffffffff1690610f2a906001600160a01b038416611ddf565b6001600160a01b0382165f908152600660209081526040808320805460ff1916600117905560079091528120805464ffffffffff841664ffffffffff199091161790556002805491610f7b836134b7565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db539060600161078c565b50565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081526006602052604090205460ff1690565b5f818152600a60205260409020600481015460609190611065576040516322e679e360e11b815260040160405180910390fd5b806006018054806020026020016040519081016040528092919081815260200182805480156110bb57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161109d575b5050505050915050919050565b5f805f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff1660028111156111035761110361348f565b14159392505050565b611114611d3d565b6001600160a01b03811661113b5760405163d92e233d60e01b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f611166611fb5565b805490915060ff600160401b82041615906001600160401b03165f8115801561118c5750825b90505f826001600160401b031660011480156111a75750303b155b9050811580156111b5575080155b156111d35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111fd57845460ff60401b1916600160401b1785555b6001600160a01b0387166112245760405163d92e233d60e01b815260040160405180910390fd5b61122d33611fdd565b61123960046014611fee565b61124286610798565b61124a610fe7565b6001600160a01b0316876001600160a01b03161461126b5761126b87611a61565b83156112b157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f818152600a6020526040812081815460ff1660038111156112de576112de61348f565b036112fc57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156113145761131461348f565b1461133257604051631860f69960e31b815260040160405180910390fd5b8060030154421161135657604051632f021e8d60e11b815260040160405180910390fd5b60058101546006820154600160201b90910463ffffffff1611158061143b578154600360ff199091161782556006820154600583015460408051928352600160201b90910463ffffffff16602083015285917fecc4a9fb7e28d074cba7f5b227e9b5827823c850a385539b9a2f98a08f8c203d910160405180910390a25f54604051635d968dc160e11b815260048101869052600260248201526001600160a01b039091169063bb2d1b82906044015f604051808303815f87803b15801561141c575f5ffd5b505af115801561142e573d5f5f3e3d5ffd5b505f979650505050505050565b815460ff191660021782556006820154600a8301555f54604051631f3ea75d60e21b8152600481018690526001600160a01b0390911690637cfa9d74906024015f604051808303815f87803b158015611492575f5ffd5b505af11580156114a4573d5f5f3e3d5ffd5b50505050837fed38c6266ebed7c01d311349a7fa67e0ef0f1d2f4760d60dbb34ca4799a2e132836006016040516114db919061359d565b60405180910390a25060019392505050565b6114f5611d3d565b6001600160a01b03811661151c5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a7905f90a250565b5f828152600a6020526040812090815460ff1660038111156115895761158961348f565b036115a757604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156115bf576115bf61348f565b146115dd57604051631860f69960e31b815260040160405180910390fd5b806003015442111561160257604051639a19114d60e01b815260040160405180910390fd5b335f90815260078201602052604090205460ff16156116345760405163257309f160e11b815260040160405180910390fd5b61163d33610b43565b61165a5760405163149fbcfd60e11b815260040160405180910390fd5b61166533838561206d565b6001810154604080516bffffffffffffffffffffffff193360601b16602080830191909152603482018690526054820187905260748083019490945282518083039094018452609490910190915281519101205f90335f8181526007850160205260409020805460ff191660011790559091506116e49083908361223e565b506040805184815260208101839052339186917f52999628fb1cb05707e842278833b22e511f11746202cecdf221968b0b89e8bd910160405180910390a350505050565b5f8181526009602052604090205480611754576040516322e679e360e11b815260040160405180910390fd5b919050565b5f6117666004601461243f565b905090565b611773611d3d565b5f898152600a602052604090206002815460ff1660038111156117985761179861348f565b146117b657604051634f4b461f60e11b815260040160405180910390fd5b6004810154156117d95760405163632a22bb60e01b815260040160405180910390fd5b600681015488146118225760405162461bcd60e51b815260206004820152601360248201527209cdec8ca40c6deeadce840dad2e6dac2e8c6d606b1b60448201526064016106c3565b5f61182f858701876136de565b9150505f8151116118795760405162461bcd60e51b815260206004820152601460248201527343353a206e6f207075626c696320696e7075747360601b60448201526064016106c3565b5f81600183516118899190613781565b81518110611899576118996134a3565b602002602001015190505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663406ed35c8e6040518263ffffffff1660e01b81526004016118e591815260200190565b5f60405180830381865afa1580156118ff573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119269190810190613866565b610120810151604051637bf41d7760e11b81529192506001600160a01b03169063f7e83aee90611960908b908b908b908b90600401613a05565b602060405180830381865afa15801561197b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061199f91906134cf565b5060048085018390555f8e815260096020526040808220859055905490516340a3b76160e11b81529182018f9052602482018490526001600160a01b0316906381476ec2906044015f604051808303815f87803b1580156119fe575f5ffd5b505af1158015611a10573d5f5f3e3d5ffd5b505050508c7ff7472ea3a028fe8a86ab1c9a3e2176b284c8c3a22675c101e0fa21c140b6678d8d8d8d8d604051611a4a9493929190613a36565b60405180910390a250505050505050505050505050565b611a69611d3d565b6001600160a01b038116611a92575f604051631e4fbdf760e01b81526004016106c391906132aa565b610fe481611d6f565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611ada5760405162461bcd60e51b81526004016106c390613a98565b825464ffffffffff600160281b90910481169082168111611b385760405162461bcd60e51b815260206004820152601860248201527713185e9e5253550e881b195859881b5d5cdd08195e1a5cdd60421b60448201526064016106c3565b825f5b81866001015f611b4b8488612538565b64ffffffffff1681526020019081526020015f20819055505f816001611b719190613ae2565b60ff168464ffffffffff16901c64ffffffffff16905060018564ffffffffff16901c64ffffffffff168111611ba65750611d35565b600185165f03611c6d575f611bc583611bc0886001613afb565b612538565b60408051808201825286815264ffffffffff83165f90815260018c0160209081529083902054908201529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611c2691600401613b18565b602060405180830381865af4158015611c41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6591906134cf565b935050611d21565b5f611c7d83611bc0600189613b48565b60408051808201825264ffffffffff83165f90815260018c0160209081529083902054825281018790529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611cde91600401613b18565b602060405180830381865af4158015611cf9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1d91906134cf565b9350505b50647fffffffff600194851c169301611b3b565b505050505050565b33611d46610fe7565b6001600160a01b031614610d00573360405163118cdaa760e01b81526004016106c391906132aa565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b8154600160281b900464ffffffffff167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611e2e5760405162461bcd60e51b81526004016106c390613a98565b825464ffffffffff90811690821610611e815760405162461bcd60e51b815260206004820152601560248201527413185e9e5253550e881d1c9959481a5cc8199d5b1b605a1b60448201526064016106c3565b611e8c816001613afb565b835464ffffffffff91909116600160281b0269ffffffffff000000000019909116178355815f5b81856001015f611ec38487612538565b64ffffffffff16815260208101919091526040015f20556001831615611fae575f611ef382611bc0600187613b48565b60408051808201825264ffffffffff83165f90815260018a0160209081529083902054825281018690529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611f5491600401613b18565b602060405180830381865af4158015611f6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9391906134cf565b647fffffffff600195861c1694909350919091019050611eb3565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610bf0565b611fe5612555565b610fe48161257a565b602060ff8216111561203c5760405162461bcd60e51b81526020600482015260176024820152764c617a79494d543a205472656520746f6f206c6172676560481b60448201526064016106c3565b61204d600160ff831681901b613781565b825469ffffffffffffffffffff191664ffffffffff919091161790915550565b5f821161208d5760405163aeaddff160e01b815260040160405180910390fd5b6001546001600160a01b03166120b6576040516350ca893360e01b815260040160405180910390fd5b5f818152600a602052604081206001805460028301549293926001600160a01b039091169163bb03bd719188916120ec91613781565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612133573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215791906134cf565b90505f60015f9054906101000a90046001600160a01b03166001600160a01b0316631209b1f66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121aa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121ce91906134cf565b90505f81116121f05760405163aeaddff160e01b815260040160405180910390fd5b5f6121fb8284613b65565b90505f811161221d5760405163149fbcfd60e11b815260040160405180910390fd5b808611156112b15760405163aeaddff160e01b815260040160405180910390fd5b60058301546006840180545f92600160201b900463ffffffff16908111156122bc57508054600180820183555f928352602080842090920180546001600160a01b0319166001600160a01b03881690811790915583526008870182526040808420869055600988019092529120805460ff1916821790559050612438565b5f5f90505f876008015f855f815481106122d8576122d86134a3565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905060015b8454811015612360575f896008015f878481548110612322576123226134a3565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905082811115612357578092508193505b50600101612301565b50808610612374575f945050505050612438565b5f886009015f86858154811061238c5761238c6134a3565b5f9182526020808320909101546001600160a01b031683528201929092526040019020805460ff191660018360028111156123c9576123c961348f565b0217905550868483815481106123e1576123e16134a3565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918916815260088a018252604080822089905560098b0190925220805460ff191660019081179091559450505050505b9392505050565b5f5f8260ff16116124925760405162461bcd60e51b815260206004820152601a60248201527f4c617a79494d543a206465707468206d757374206265203e203000000000000060448201526064016106c3565b602060ff831611156124b65760405162461bcd60e51b81526004016106c390613b84565b8254600160281b900464ffffffffff16806124d560ff85166002613cd5565b64ffffffffff1610156125255760405162461bcd60e51b8152602060048201526018602482015277098c2f4f2929aa87440c2dac4d2ceeadeeae640c8cae0e8d60431b60448201526064016106c3565b612530848285612582565b949350505050565b5f8161254b60ff851663ffffffff613cee565b6124389190613afb565b61255d61264a565b610d0057604051631afcd79f60e31b815260040160405180910390fd5b611a69612555565b5f602060ff831611156125a75760405162461bcd60e51b81526004016106c390613b84565b8264ffffffffff165f036125c5576125be82612663565b9050612438565b5f6125d1836001613ae2565b60ff166001600160401b038111156125eb576125eb61347b565b604051908082528060200260200182016040528015612614578160200160208202803683370190505b50905061262385858584612cfd565b808360ff1681518110612638576126386134a3565b60200260200101519150509392505050565b5f612653611fb5565b54600160401b900460ff16919050565b5f8160ff165f0361267557505f919050565b8160ff166001036126a757507f2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864919050565b8160ff166002036126d957507f1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1919050565b8160ff1660030361270b57507f18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238919050565b8160ff1660040361273d57507f07f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a919050565b8160ff1660050361276f57507f2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55919050565b8160ff166006036127a157507f2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78919050565b8160ff166007036127d357507f078295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d919050565b8160ff1660080361280557507f2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61919050565b8160ff1660090361283757507f0e884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747919050565b8160ff16600a0361286957507f1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2919050565b8160ff16600b0361289b57507f1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636919050565b8160ff16600c036128cd57507f2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a919050565b8160ff16600d036128ff57507f14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0919050565b8160ff16600e0361293157507f190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c919050565b8160ff16600f0361296357507f22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92919050565b8160ff1660100361299557507f2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323919050565b8160ff166011036129c757507f2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992919050565b8160ff166012036129f957507f0f57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f919050565b8160ff16601303612a2b57507f1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca919050565b8160ff16601403612a5d57507f2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e919050565b8160ff16601503612a8f57507f19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1919050565b8160ff16601603612ac157507f18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b919050565b8160ff16601703612af357507f2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d919050565b8160ff16601803612b2557507f27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540919050565b8160ff16601903612b5757507f2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21919050565b8160ff16601a03612b8957507f120c58f143d491e95902f7f5277778a2e0ad5168f6add75669932630ce611518919050565b8160ff16601b03612bbb57507f1f21feb70d3f21b07bf853d5e5db03071ec495a0a565a21da2d665d279483795919050565b8160ff16601c03612bed57507f24be905fa71335e14c638cc0f66a8623a826e768068a9e968bb1a1dde18a72d2919050565b8160ff16601d03612c1f57507f0f8666b62ed17491c50ceadead57d4cd597ef3821d65c328744c74e553dac26d919050565b8160ff16601e03612c5157507f0918d46bf52d98b034413f4a1a1c41594e7a7a3f6ae08cb43d1a2a230e1959ef919050565b8160ff16601f03612c8357507f1bbeb01b4c479ecde76917645e404dfa2e26f90d0afc5a65128513ad375c5ff2919050565b8160ff16602003612cb557507f2f68a1c58e257e42a17a6c61dff5551ed560b9922ab119d5ac8e184c9734ead9919050565b60405162461bcd60e51b815260206004820152601e60248201527f4c617a79494d543a2064656661756c745a65726f2062616420696e646578000060448201526064016106c3565b602060ff83161115612d215760405162461bcd60e51b81526004016106c390613b84565b5f8364ffffffffff1611612d855760405162461bcd60e51b815260206004820152602560248201527f4c617a79494d543a206e756d626572206f66206c6561766573206d7573742062604482015264065203e20360dc1b60648201526084016106c3565b5f612d91600185613b48565b9050600181165f03612de457846001015f612dac5f84612538565b64ffffffffff1681526020019081526020015f2054825f81518110612dd357612dd36134a3565b602002602001018181525050612e0c565b612ded5f612663565b825f81518110612dff57612dff6134a3565b6020026020010181815250505b5f5b8360ff168160ff161015611d3557600182165f03612f045773__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280868560ff1681518110612e6057612e606134a3565b60200260200101518152602001612e7685612663565b8152506040518263ffffffff1660e01b8152600401612e959190613b18565b602060405180830381865af4158015612eb0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed491906134cf565b83612ee0836001613ae2565b60ff1681518110612ef357612ef36134a3565b6020026020010181815250506130b5565b5f612f10826001613ae2565b60ff168664ffffffffff16901c64ffffffffff16905060018364ffffffffff16901c64ffffffffff16811115612fb2575f876001015f612f67856001612f569190613ae2565b60018864ffffffffff16901c612538565b64ffffffffff1681526020019081526020015f205490508085846001612f8d9190613ae2565b60ff1681518110612fa057612fa06134a3565b602002602001018181525050506130b3565b5f876001015f612fc985600188611bc09190613b48565b64ffffffffff1681526020019081526020015f2054905073__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280848152602001888760ff1681518110613020576130206134a3565b60200260200101518152506040518263ffffffff1660e01b81526004016130479190613b18565b602060405180830381865af4158015613062573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061308691906134cf565b85613092856001613ae2565b60ff16815181106130a5576130a56134a3565b602002602001018181525050505b505b647fffffffff600192831c169101612e0e565b600183019183908215613159579160200282015f5b8382111561312757833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026130dd565b80156131575782816101000a81549063ffffffff0219169055600401602081600301049283019260010302613127565b505b50613165929150613169565b5090565b5b80821115613165575f815560010161316a565b6001600160a01b0381168114610fe4575f5ffd5b5f602082840312156131a1575f5ffd5b81356124388161317d565b5f602082840312156131bc575f5ffd5b5035919050565b602080825282518282018190525f918401906040840190835b818110156132035783516001600160a01b03168352602093840193909201916001016131dc565b509095945050505050565b5f5f5f60808486031215613220575f5ffd5b83359250602084013591506080840185101561323a575f5ffd5b6040840190509250925092565b5f5f60408385031215613258575f5ffd5b82359150602083013561326a8161317d565b809150509250929050565b5f5f5f60608486031215613287575f5ffd5b8335925060208401356132998161317d565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b5f5f604083850312156132cf575f5ffd5b82356132da8161317d565b946020939093013593505050565b5f5f604083850312156132f9575f5ffd5b50508035926020909101359150565b5f5f83601f840112613318575f5ffd5b5081356001600160401b0381111561332e575f5ffd5b602083019150836020828501011115613345575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f60a08a8c031215613364575f5ffd5b8935985060208a01356001600160401b03811115613380575f5ffd5b8a01601f81018c13613390575f5ffd5b80356001600160401b038111156133a5575f5ffd5b8c60208260051b84010111156133b9575f5ffd5b6020919091019850965060408a01356001600160401b038111156133db575f5ffd5b6133e78c828d01613308565b90975095505060608a01356001600160401b03811115613405575f5ffd5b6134118c828d01613308565b90955093505060808a01356001600160401b0381111561342f575f5ffd5b61343b8c828d01613308565b915080935050809150509295985092959850929598565b634e487b7160e01b5f52601160045260245ffd5b5f8161347457613474613452565b505f190190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f600182016134c8576134c8613452565b5060010190565b5f602082840312156134df575f5ffd5b5051919050565b803563ffffffff81168114611754575f5ffd5b5f60208284031215613509575f5ffd5b612438826134e6565b80820180821115610bf057610bf0613452565b84815260a0810160208201855f5b60028110156135605763ffffffff61354a836134e6565b1683526020928301929190910190600101613533565b50505060608201939093526080015292915050565b80518015158114611754575f5ffd5b5f60208284031215613594575f5ffd5b61243882613575565b602080825282548282018190525f848152918220906040840190835b818110156132035783546001600160a01b03168352600193840193602090930192016135b9565b6040516101e081016001600160401b03811182821017156136035761360361347b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156136315761363161347b565b604052919050565b5f6001600160401b038211156136515761365161347b565b50601f01601f191660200190565b5f82601f83011261366e575f5ffd5b81356001600160401b038111156136875761368761347b565b8060051b61369760208201613609565b918252602081850181019290810190868411156136b2575f5ffd5b6020860192505b838310156136d45782358252602092830192909101906136b9565b9695505050505050565b5f5f604083850312156136ef575f5ffd5b82356001600160401b03811115613704575f5ffd5b8301601f81018513613714575f5ffd5b803561372761372282613639565b613609565b81815286602083850101111561373b575f5ffd5b816020840160208301375f6020838301015280945050505060208301356001600160401b0381111561376b575f5ffd5b6137778582860161365f565b9150509250929050565b81810381811115610bf057610bf0613452565b805160048110611754575f5ffd5b5f82601f8301126137b1575f5ffd5b604080519081016001600160401b03811182821017156137d3576137d361347b565b80604052508060408401858111156137e9575f5ffd5b845b818110156138035780518352602092830192016137eb565b509195945050505050565b80516117548161317d565b5f82601f830112613828575f5ffd5b815161383661372282613639565b81815284602083860101111561384a575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613876575f5ffd5b81516001600160401b0381111561388b575f5ffd5b8201610200818503121561389d575f5ffd5b6138a56135e0565b815181526138b560208301613794565b6020820152604082810151908201526138d185606084016137a2565b606082015260a082015160808201526138ec60c0830161380e565b60a082015260e08201516001600160401b03811115613909575f5ffd5b61391586828501613819565b60c0830152506101008201516001600160401b03811115613934575f5ffd5b61394086828501613819565b60e083015250613953610120830161380e565b610100820152613966610140830161380e565b61012082015261016082810151610140830152610180830151908201526101a08201516001600160401b0381111561399c575f5ffd5b6139a886828501613819565b610180830152506139bc6101c0830161380e565b6101a08201526139cf6101e08301613575565b6101c0820152949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f613a186040830186886139dd565b8281036020840152613a2b8185876139dd565b979650505050505050565b604080825281018490525f8560608301825b87811015613a78578235613a5b8161317d565b6001600160a01b0316825260209283019290910190600101613a48565b508381036020850152613a8c8186886139dd565b98975050505050505050565b6020808252602a908201527f4c617a79494d543a206c656166206d757374206265203c20534e41524b5f53436040820152691053105497d19251531160b21b606082015260800190565b60ff8181168382160190811115610bf057610bf0613452565b64ffffffffff8181168382160190811115610bf057610bf0613452565b6040810181835f5b6002811015613b3f578151835260209283019290910190600101613b20565b50505092915050565b64ffffffffff8281168282160390811115610bf057610bf0613452565b5f82613b7f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526023908201527f4c617a79494d543a206465707468206d757374206265203c3d204d41585f44456040820152620a0a8960eb1b606082015260800190565b6001815b6001841115610ea157808504811115613be657613be6613452565b6001841615613bf457908102905b60019390931c928002613bcb565b5f82613c1057506001610bf0565b81613c1c57505f610bf0565b8160018114613c325760028114613c3c57613c6e565b6001915050610bf0565b60ff841115613c4d57613c4d613452565b6001841b915064ffffffffff821115613c6857613c68613452565b50610bf0565b5060208310610133831016604e8410600b8410161715613ca6575081810a64ffffffffff811115613ca157613ca1613452565b610bf0565b613cb664ffffffffff8484613bc7565b8064ffffffffff04821115613ccd57613ccd613452565b029392505050565b5f61243864ffffffffff841664ffffffffff8416613c02565b64ffffffffff8181168382160290811690818114613d0e57613d0e613452565b509291505056fea164736f6c634300081c000a", + "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613d3d806100d65f395ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80639f0f874a11610135578063e59e4695116100b4578063f26ef74e11610079578063f26ef74e14610571578063f2fde38b14610584578063f379b0df14610597578063f52fd803146105d1578063f6fc05d514610643575f5ffd5b8063e59e469514610516578063e6745e1314610529578063e82f3b701461053c578063ebf0c7171461054f578063f165053614610557575f5ffd5b8063c3a0ec30116100fa578063c3a0ec30146104ae578063ca2869a0146104bf578063cd6dc687146104de578063da881e5a146104f1578063dbb06c9314610504575f5ffd5b80639f0f874a1461044d578063a016493014610456578063a8a4d69b14610469578063bff232c11461047c578063c2b40ae41461048f575f5ffd5b8063715018a6116101c15780638d1ddfb1116101865780638d1ddfb1146103cd5780638da5cb5b146103e35780638e5ce3ad146103eb5780639015d371146103fe5780639a7a2ffc14610411575f5ffd5b8063715018a6146103465780637c92f5241461034e578063858142431461037b5780638a78bb151461039b5780638cb89ecb146103ae575f5ffd5b80632e7b716d116102075780632e7b716d146102d85780634d6861a6146102eb57806350e6d94c146102fe5780635d5047761461032057806370e36bbe14610333575f5ffd5b8063096b810a146102435780630f3e34121461025857806317d611201461026b5780632800d82914610294578063291a691b146102b5575b5f5ffd5b610256610251366004613195565b61064c565b005b6102566102663660046131b0565b610798565b61027e6102793660046131b0565b6107db565b60405161028b91906131c7565b60405180910390f35b6102a76102a23660046131b0565b61091d565b60405190815260200161028b565b6102c86102c3366004613212565b610969565b604051901515815260200161028b565b6102c86102e6366004613195565b610b43565b6102c86102f93660046131b0565b610bf6565b6102c861030c366004613195565b60066020525f908152604090205460ff1681565b6102c861032e36600461324b565b610c35565b610256610341366004613195565b610c79565b610256610cef565b61036161035c366004613279565b610d02565b6040805192835263ffffffff90911660208301520161028b565b60015461038e906001600160a01b031681565b60405161028b91906132ae565b6102566103a9366004613195565b610ea9565b6102a76103bc3660046131b0565b60096020525f908152604090205481565b600454600160281b900464ffffffffff166102a7565b61038e610fe7565b600b5461038e906001600160a01b031681565b6102c861040c366004613195565b611015565b61043761041f366004613195565b60076020525f908152604090205464ffffffffff1681565b60405164ffffffffff909116815260200161028b565b6102a760035481565b61027e6104643660046131b0565b611032565b6102c861047736600461324b565b6110c8565b61025661048a366004613195565b61110c565b6102a761049d3660046131b0565b60086020525f908152604090205481565b6001546001600160a01b031661038e565b6102a76104cd3660046131b0565b5f9081526008602052604090205490565b6102566104ec3660046132c2565b61115d565b6102c86104ff3660046131b0565b6112ba565b5f5461038e906001600160a01b031681565b610256610524366004613195565b6114ed565b6102566105373660046132ec565b611565565b6102a761054a3660046131b0565b611728565b6102a7611759565b61055f601481565b60405160ff909116815260200161028b565b61025661057f366004613350565b61176b565b610256610592366004613195565b611a65565b6004546105b39064ffffffffff80821691600160281b90041682565b6040805164ffffffffff93841681529290911660208301520161028b565b6106146105df3660046131b0565b5f908152600a6020819052604090912090810154600590910154909163ffffffff80831692600160201b900416908284101590565b60405161028b949392919093845263ffffffff9283166020850152911660408301521515606082015260800190565b6102a760025481565b610654610fe7565b6001600160a01b0316336001600160a01b0316148061067d57506001546001600160a01b031633145b61069a57604051632864c4e160e01b815260040160405180910390fd5b6106a381611015565b81906106cc576040516381e5828960e01b81526004016106c391906132ae565b60405180910390fd5b506001600160a01b0381165f9081526007602052604081205464ffffffffff16906106fa9060049083611a9f565b6001600160a01b0382165f908152600660205260408120805460ff1916905560028054916107278361346a565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d5906060015b60405180910390a25050565b6107a0611d41565b60038190556040518181527fbe772dc189863d512fa01e489c8eac204975aef1a8662d8b5a333804b5207ab79060200160405180910390a150565b5f818152600a602081905260408220600681015491810154606093919291816001600160401b038111156108115761081161347f565b60405190808252806020026020018201604052801561083a578160200160208202803683370190505b5090505f805b84811015610911576001866009015f886006018481548110610864576108646134a7565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205460ff16600281111561089c5761089c613493565b03610909578560060181815481106108b6576108b66134a7565b905f5260205f20015f9054906101000a90046001600160a01b03168383815181106108e3576108e36134a7565b6001600160a01b039092166020928302919091019091015281610905816134bb565b9250505b600101610840565b50909695505050505050565b5f818152600a6020526040812081815460ff16600381111561094157610941613493565b0361095f57604051630d4c1d9760e41b815260040160405180910390fd5b6003015492915050565b5f80546001600160a01b031633146109945760405163e4c2a7eb60e01b815260040160405180910390fd5b5f848152600a6020526040812090815460ff1660038111156109b8576109b8613493565b146109d6576040516374ff462560e11b815260040160405180910390fd5b60015460408051630cc37d8f60e11b815290515f926001600160a01b031691631986fb1e9160048083019260209291908290030181865afa158015610a1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4191906134d3565b905080610a5460408601602087016134fd565b63ffffffff161115610a6c60408601602087016134fd565b829091610a9a576040516344ec930f60e01b815263ffffffff909216600483015260248201526044016106c3565b5050815460ff1916600190811783558201859055436002830155600354610ac19042613516565b6003830155610ad5600583018560026130cc565b50610ade611759565b5f87815260086020526040908190209190915560028301546003840154915188927f381d281d32f95ef8fe4e5f3b263ea6a32d03d331e1a141ae1da996dc02a7a17092610b2f928a928a9291613529565b60405180910390a250600195945050505050565b5f610b4d82611015565b610b5857505f919050565b6001546001600160a01b0316610b81576040516350ca893360e01b815260040160405180910390fd5b600154604051639f8a13d760e01b81526001600160a01b0390911690639f8a13d790610bb19085906004016132ae565b602060405180830381865afa158015610bcc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf09190613588565b92915050565b5f818152600a602052604081206001815460ff166003811115610c1b57610c1b613493565b14610c2857505f92915050565b6003015442111592915050565b5f60015f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff166002811115610c7157610c71613493565b149392505050565b610c81611d41565b6001600160a01b038116610ca85760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b038316908117825560405190917f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c991a250565b610cf7611d41565b610d005f611d73565b565b600b545f9081906001600160a01b03163314610d315760405163fcef374960e01b815260040160405180910390fd5b5f858152600a602052604090206002815460ff166003811115610d5657610d56613493565b14610d7457604051634f4b461f60e11b815260040160405180910390fd5b60058101546001600160a01b0386165f90815260098301602052604090205463ffffffff909116925060019060ff166002811115610db457610db4613493565b14610dc457600a01549150610ea1565b6001600160a01b0385165f9081526009820160205260408120805460ff19166002179055600a8201805491610df88361346a565b919050555080600a01549250846001600160a01b0316867f6c783b92374361b4d6efaf29673b89437ee969bb3c9d2d5d86b143ad5447b8498686604051610e49929190918252602082015260400190565b60405180910390a36040805184815263ffffffff84166020820181905285101591810182905287907f119cb11dd0a68c257d6dc9b06dcb37dd422ce276eb8bf3cd0b7079a116b8e2989060600160405180910390a250505b935093915050565b610eb1610fe7565b6001600160a01b0316336001600160a01b03161480610eda57506001546001600160a01b031633145b610ef757604051632864c4e160e01b815260040160405180910390fd5b610f0081611015565b610fe45760048054600160281b900464ffffffffff1690610f2a906001600160a01b038416611de3565b6001600160a01b0382165f908152600660209081526040808320805460ff1916600117905560079091528120805464ffffffffff841664ffffffffff199091161790556002805491610f7b836134bb565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db539060600161078c565b50565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081526006602052604090205460ff1690565b5f818152600a60205260409020600481015460609190611065576040516322e679e360e11b815260040160405180910390fd5b806006018054806020026020016040519081016040528092919081815260200182805480156110bb57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161109d575b5050505050915050919050565b5f805f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff16600281111561110357611103613493565b14159392505050565b611114611d41565b6001600160a01b03811661113b5760405163d92e233d60e01b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f611166611fb9565b805490915060ff600160401b82041615906001600160401b03165f8115801561118c5750825b90505f826001600160401b031660011480156111a75750303b155b9050811580156111b5575080155b156111d35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111fd57845460ff60401b1916600160401b1785555b6001600160a01b0387166112245760405163d92e233d60e01b815260040160405180910390fd5b61122d33611fe1565b61123960046014611ff2565b61124286610798565b61124a610fe7565b6001600160a01b0316876001600160a01b03161461126b5761126b87611a65565b83156112b157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f818152600a6020526040812081815460ff1660038111156112de576112de613493565b036112fc57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff16600381111561131457611314613493565b1461133257604051631860f69960e31b815260040160405180910390fd5b8060030154421161135657604051632f021e8d60e11b815260040160405180910390fd5b60058101546006820154600160201b90910463ffffffff1611158061143b578154600360ff199091161782556006820154600583015460408051928352600160201b90910463ffffffff16602083015285917fecc4a9fb7e28d074cba7f5b227e9b5827823c850a385539b9a2f98a08f8c203d910160405180910390a25f54604051635d968dc160e11b815260048101869052600260248201526001600160a01b039091169063bb2d1b82906044015f604051808303815f87803b15801561141c575f5ffd5b505af115801561142e573d5f5f3e3d5ffd5b505f979650505050505050565b815460ff191660021782556006820154600a8301555f54604051631f3ea75d60e21b8152600481018690526001600160a01b0390911690637cfa9d74906024015f604051808303815f87803b158015611492575f5ffd5b505af11580156114a4573d5f5f3e3d5ffd5b50505050837fed38c6266ebed7c01d311349a7fa67e0ef0f1d2f4760d60dbb34ca4799a2e132836006016040516114db91906135a1565b60405180910390a25060019392505050565b6114f5611d41565b6001600160a01b03811661151c5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a7905f90a250565b5f828152600a6020526040812090815460ff16600381111561158957611589613493565b036115a757604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156115bf576115bf613493565b146115dd57604051631860f69960e31b815260040160405180910390fd5b806003015442111561160257604051639a19114d60e01b815260040160405180910390fd5b335f90815260078201602052604090205460ff16156116345760405163257309f160e11b815260040160405180910390fd5b61163d33610b43565b61165a5760405163149fbcfd60e11b815260040160405180910390fd5b611665338385612071565b6001810154604080516bffffffffffffffffffffffff193360601b16602080830191909152603482018690526054820187905260748083019490945282518083039094018452609490910190915281519101205f90335f8181526007850160205260409020805460ff191660011790559091506116e490839083612242565b506040805184815260208101839052339186917f52999628fb1cb05707e842278833b22e511f11746202cecdf221968b0b89e8bd910160405180910390a350505050565b5f8181526009602052604090205480611754576040516322e679e360e11b815260040160405180910390fd5b919050565b5f61176660046014612443565b905090565b611773611d41565b5f898152600a602052604090206002815460ff16600381111561179857611798613493565b146117b657604051634f4b461f60e11b815260040160405180910390fd5b6004810154156117d95760405163632a22bb60e01b815260040160405180910390fd5b600681015488146118225760405162461bcd60e51b815260206004820152601360248201527209cdec8ca40c6deeadce840dad2e6dac2e8c6d606b1b60448201526064016106c3565b5f61182f858701876136e2565b9150505f8151116118795760405162461bcd60e51b815260206004820152601460248201527343353a206e6f207075626c696320696e7075747360601b60448201526064016106c3565b5f81600183516118899190613785565b81518110611899576118996134a7565b602002602001015190505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663406ed35c8e6040518263ffffffff1660e01b81526004016118e591815260200190565b5f60405180830381865afa1580156118ff573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611926919081019061386a565b610120810151604051637bf41d7760e11b81529192506001600160a01b03169063f7e83aee90611960908b908b908b908b90600401613a09565b602060405180830381865afa15801561197b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061199f91906134d3565b5060048085018390555f8e815260096020526040808220859055905490516340a3b76160e11b81529182018f9052602482018490526001600160a01b0316906381476ec2906044015f604051808303815f87803b1580156119fe575f5ffd5b505af1158015611a10573d5f5f3e3d5ffd5b505050508c7f49ac1dd411942113d1c5e6799c6379ce341afe85a4175fb562cf2a5fb886c27d8d8d8d8d8d8d604051611a4e96959493929190613a3a565b60405180910390a250505050505050505050505050565b611a6d611d41565b6001600160a01b038116611a96575f604051631e4fbdf760e01b81526004016106c391906132ae565b610fe481611d73565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611ade5760405162461bcd60e51b81526004016106c390613ab3565b825464ffffffffff600160281b90910481169082168111611b3c5760405162461bcd60e51b815260206004820152601860248201527713185e9e5253550e881b195859881b5d5cdd08195e1a5cdd60421b60448201526064016106c3565b825f5b81866001015f611b4f848861253c565b64ffffffffff1681526020019081526020015f20819055505f816001611b759190613afd565b60ff168464ffffffffff16901c64ffffffffff16905060018564ffffffffff16901c64ffffffffff168111611baa5750611d39565b600185165f03611c71575f611bc983611bc4886001613b16565b61253c565b60408051808201825286815264ffffffffff83165f90815260018c0160209081529083902054908201529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611c2a91600401613b33565b602060405180830381865af4158015611c45573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6991906134d3565b935050611d25565b5f611c8183611bc4600189613b63565b60408051808201825264ffffffffff83165f90815260018c0160209081529083902054825281018790529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611ce291600401613b33565b602060405180830381865af4158015611cfd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d2191906134d3565b9350505b50647fffffffff600194851c169301611b3f565b505050505050565b33611d4a610fe7565b6001600160a01b031614610d00573360405163118cdaa760e01b81526004016106c391906132ae565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b8154600160281b900464ffffffffff167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611e325760405162461bcd60e51b81526004016106c390613ab3565b825464ffffffffff90811690821610611e855760405162461bcd60e51b815260206004820152601560248201527413185e9e5253550e881d1c9959481a5cc8199d5b1b605a1b60448201526064016106c3565b611e90816001613b16565b835464ffffffffff91909116600160281b0269ffffffffff000000000019909116178355815f5b81856001015f611ec7848761253c565b64ffffffffff16815260208101919091526040015f20556001831615611fb2575f611ef782611bc4600187613b63565b60408051808201825264ffffffffff83165f90815260018a0160209081529083902054825281018690529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611f5891600401613b33565b602060405180830381865af4158015611f73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9791906134d3565b647fffffffff600195861c1694909350919091019050611eb7565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610bf0565b611fe9612559565b610fe48161257e565b602060ff821611156120405760405162461bcd60e51b81526020600482015260176024820152764c617a79494d543a205472656520746f6f206c6172676560481b60448201526064016106c3565b612051600160ff831681901b613785565b825469ffffffffffffffffffff191664ffffffffff919091161790915550565b5f82116120915760405163aeaddff160e01b815260040160405180910390fd5b6001546001600160a01b03166120ba576040516350ca893360e01b815260040160405180910390fd5b5f818152600a602052604081206001805460028301549293926001600160a01b039091169163bb03bd719188916120f091613785565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612137573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215b91906134d3565b90505f60015f9054906101000a90046001600160a01b03166001600160a01b0316631209b1f66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d291906134d3565b90505f81116121f45760405163aeaddff160e01b815260040160405180910390fd5b5f6121ff8284613b80565b90505f81116122215760405163149fbcfd60e11b815260040160405180910390fd5b808611156112b15760405163aeaddff160e01b815260040160405180910390fd5b60058301546006840180545f92600160201b900463ffffffff16908111156122c057508054600180820183555f928352602080842090920180546001600160a01b0319166001600160a01b03881690811790915583526008870182526040808420869055600988019092529120805460ff191682179055905061243c565b5f5f90505f876008015f855f815481106122dc576122dc6134a7565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905060015b8454811015612364575f896008015f878481548110612326576123266134a7565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205490508281111561235b578092508193505b50600101612305565b50808610612378575f94505050505061243c565b5f886009015f868581548110612390576123906134a7565b5f9182526020808320909101546001600160a01b031683528201929092526040019020805460ff191660018360028111156123cd576123cd613493565b0217905550868483815481106123e5576123e56134a7565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918916815260088a018252604080822089905560098b0190925220805460ff191660019081179091559450505050505b9392505050565b5f5f8260ff16116124965760405162461bcd60e51b815260206004820152601a60248201527f4c617a79494d543a206465707468206d757374206265203e203000000000000060448201526064016106c3565b602060ff831611156124ba5760405162461bcd60e51b81526004016106c390613b9f565b8254600160281b900464ffffffffff16806124d960ff85166002613cf0565b64ffffffffff1610156125295760405162461bcd60e51b8152602060048201526018602482015277098c2f4f2929aa87440c2dac4d2ceeadeeae640c8cae0e8d60431b60448201526064016106c3565b612534848285612586565b949350505050565b5f8161254f60ff851663ffffffff613d09565b61243c9190613b16565b61256161264e565b610d0057604051631afcd79f60e31b815260040160405180910390fd5b611a6d612559565b5f602060ff831611156125ab5760405162461bcd60e51b81526004016106c390613b9f565b8264ffffffffff165f036125c9576125c282612667565b905061243c565b5f6125d5836001613afd565b60ff166001600160401b038111156125ef576125ef61347f565b604051908082528060200260200182016040528015612618578160200160208202803683370190505b50905061262785858584612d01565b808360ff168151811061263c5761263c6134a7565b60200260200101519150509392505050565b5f612657611fb9565b54600160401b900460ff16919050565b5f8160ff165f0361267957505f919050565b8160ff166001036126ab57507f2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864919050565b8160ff166002036126dd57507f1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1919050565b8160ff1660030361270f57507f18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238919050565b8160ff1660040361274157507f07f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a919050565b8160ff1660050361277357507f2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55919050565b8160ff166006036127a557507f2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78919050565b8160ff166007036127d757507f078295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d919050565b8160ff1660080361280957507f2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61919050565b8160ff1660090361283b57507f0e884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747919050565b8160ff16600a0361286d57507f1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2919050565b8160ff16600b0361289f57507f1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636919050565b8160ff16600c036128d157507f2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a919050565b8160ff16600d0361290357507f14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0919050565b8160ff16600e0361293557507f190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c919050565b8160ff16600f0361296757507f22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92919050565b8160ff1660100361299957507f2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323919050565b8160ff166011036129cb57507f2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992919050565b8160ff166012036129fd57507f0f57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f919050565b8160ff16601303612a2f57507f1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca919050565b8160ff16601403612a6157507f2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e919050565b8160ff16601503612a9357507f19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1919050565b8160ff16601603612ac557507f18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b919050565b8160ff16601703612af757507f2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d919050565b8160ff16601803612b2957507f27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540919050565b8160ff16601903612b5b57507f2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21919050565b8160ff16601a03612b8d57507f120c58f143d491e95902f7f5277778a2e0ad5168f6add75669932630ce611518919050565b8160ff16601b03612bbf57507f1f21feb70d3f21b07bf853d5e5db03071ec495a0a565a21da2d665d279483795919050565b8160ff16601c03612bf157507f24be905fa71335e14c638cc0f66a8623a826e768068a9e968bb1a1dde18a72d2919050565b8160ff16601d03612c2357507f0f8666b62ed17491c50ceadead57d4cd597ef3821d65c328744c74e553dac26d919050565b8160ff16601e03612c5557507f0918d46bf52d98b034413f4a1a1c41594e7a7a3f6ae08cb43d1a2a230e1959ef919050565b8160ff16601f03612c8757507f1bbeb01b4c479ecde76917645e404dfa2e26f90d0afc5a65128513ad375c5ff2919050565b8160ff16602003612cb957507f2f68a1c58e257e42a17a6c61dff5551ed560b9922ab119d5ac8e184c9734ead9919050565b60405162461bcd60e51b815260206004820152601e60248201527f4c617a79494d543a2064656661756c745a65726f2062616420696e646578000060448201526064016106c3565b602060ff83161115612d255760405162461bcd60e51b81526004016106c390613b9f565b5f8364ffffffffff1611612d895760405162461bcd60e51b815260206004820152602560248201527f4c617a79494d543a206e756d626572206f66206c6561766573206d7573742062604482015264065203e20360dc1b60648201526084016106c3565b5f612d95600185613b63565b9050600181165f03612de857846001015f612db05f8461253c565b64ffffffffff1681526020019081526020015f2054825f81518110612dd757612dd76134a7565b602002602001018181525050612e10565b612df15f612667565b825f81518110612e0357612e036134a7565b6020026020010181815250505b5f5b8360ff168160ff161015611d3957600182165f03612f085773__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280868560ff1681518110612e6457612e646134a7565b60200260200101518152602001612e7a85612667565b8152506040518263ffffffff1660e01b8152600401612e999190613b33565b602060405180830381865af4158015612eb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed891906134d3565b83612ee4836001613afd565b60ff1681518110612ef757612ef76134a7565b6020026020010181815250506130b9565b5f612f14826001613afd565b60ff168664ffffffffff16901c64ffffffffff16905060018364ffffffffff16901c64ffffffffff16811115612fb6575f876001015f612f6b856001612f5a9190613afd565b60018864ffffffffff16901c61253c565b64ffffffffff1681526020019081526020015f205490508085846001612f919190613afd565b60ff1681518110612fa457612fa46134a7565b602002602001018181525050506130b7565b5f876001015f612fcd85600188611bc49190613b63565b64ffffffffff1681526020019081526020015f2054905073__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280848152602001888760ff1681518110613024576130246134a7565b60200260200101518152506040518263ffffffff1660e01b815260040161304b9190613b33565b602060405180830381865af4158015613066573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061308a91906134d3565b85613096856001613afd565b60ff16815181106130a9576130a96134a7565b602002602001018181525050505b505b647fffffffff600192831c169101612e12565b60018301918390821561315d579160200282015f5b8382111561312b57833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026130e1565b801561315b5782816101000a81549063ffffffff021916905560040160208160030104928301926001030261312b565b505b5061316992915061316d565b5090565b5b80821115613169575f815560010161316e565b6001600160a01b0381168114610fe4575f5ffd5b5f602082840312156131a5575f5ffd5b813561243c81613181565b5f602082840312156131c0575f5ffd5b5035919050565b602080825282518282018190525f918401906040840190835b818110156132075783516001600160a01b03168352602093840193909201916001016131e0565b509095945050505050565b5f5f5f60808486031215613224575f5ffd5b83359250602084013591506080840185101561323e575f5ffd5b6040840190509250925092565b5f5f6040838503121561325c575f5ffd5b82359150602083013561326e81613181565b809150509250929050565b5f5f5f6060848603121561328b575f5ffd5b83359250602084013561329d81613181565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b5f5f604083850312156132d3575f5ffd5b82356132de81613181565b946020939093013593505050565b5f5f604083850312156132fd575f5ffd5b50508035926020909101359150565b5f5f83601f84011261331c575f5ffd5b5081356001600160401b03811115613332575f5ffd5b602083019150836020828501011115613349575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f60a08a8c031215613368575f5ffd5b8935985060208a01356001600160401b03811115613384575f5ffd5b8a01601f81018c13613394575f5ffd5b80356001600160401b038111156133a9575f5ffd5b8c60208260051b84010111156133bd575f5ffd5b6020919091019850965060408a01356001600160401b038111156133df575f5ffd5b6133eb8c828d0161330c565b90975095505060608a01356001600160401b03811115613409575f5ffd5b6134158c828d0161330c565b90955093505060808a01356001600160401b03811115613433575f5ffd5b61343f8c828d0161330c565b915080935050809150509295985092959850929598565b634e487b7160e01b5f52601160045260245ffd5b5f8161347857613478613456565b505f190190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f600182016134cc576134cc613456565b5060010190565b5f602082840312156134e3575f5ffd5b5051919050565b803563ffffffff81168114611754575f5ffd5b5f6020828403121561350d575f5ffd5b61243c826134ea565b80820180821115610bf057610bf0613456565b84815260a0810160208201855f5b60028110156135645763ffffffff61354e836134ea565b1683526020928301929190910190600101613537565b50505060608201939093526080015292915050565b80518015158114611754575f5ffd5b5f60208284031215613598575f5ffd5b61243c82613579565b602080825282548282018190525f848152918220906040840190835b818110156132075783546001600160a01b03168352600193840193602090930192016135bd565b6040516101e081016001600160401b03811182821017156136075761360761347f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156136355761363561347f565b604052919050565b5f6001600160401b038211156136555761365561347f565b50601f01601f191660200190565b5f82601f830112613672575f5ffd5b81356001600160401b0381111561368b5761368b61347f565b8060051b61369b6020820161360d565b918252602081850181019290810190868411156136b6575f5ffd5b6020860192505b838310156136d85782358252602092830192909101906136bd565b9695505050505050565b5f5f604083850312156136f3575f5ffd5b82356001600160401b03811115613708575f5ffd5b8301601f81018513613718575f5ffd5b803561372b6137268261363d565b61360d565b81815286602083850101111561373f575f5ffd5b816020840160208301375f6020838301015280945050505060208301356001600160401b0381111561376f575f5ffd5b61377b85828601613663565b9150509250929050565b81810381811115610bf057610bf0613456565b805160048110611754575f5ffd5b5f82601f8301126137b5575f5ffd5b604080519081016001600160401b03811182821017156137d7576137d761347f565b80604052508060408401858111156137ed575f5ffd5b845b818110156138075780518352602092830192016137ef565b509195945050505050565b805161175481613181565b5f82601f83011261382c575f5ffd5b815161383a6137268261363d565b81815284602083860101111561384e575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561387a575f5ffd5b81516001600160401b0381111561388f575f5ffd5b820161020081850312156138a1575f5ffd5b6138a96135e4565b815181526138b960208301613798565b6020820152604082810151908201526138d585606084016137a6565b606082015260a082015160808201526138f060c08301613812565b60a082015260e08201516001600160401b0381111561390d575f5ffd5b6139198682850161381d565b60c0830152506101008201516001600160401b03811115613938575f5ffd5b6139448682850161381d565b60e0830152506139576101208301613812565b61010082015261396a6101408301613812565b61012082015261016082810151610140830152610180830151908201526101a08201516001600160401b038111156139a0575f5ffd5b6139ac8682850161381d565b610180830152506139c06101c08301613812565b6101a08201526139d36101e08301613579565b6101c0820152949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f613a1c6040830186886139e1565b8281036020840152613a2f8185876139e1565b979650505050505050565b606080825281018690525f8760808301825b89811015613a7c578235613a5f81613181565b6001600160a01b0316825260209283019290910190600101613a4c565b508381036020850152613a9081888a6139e1565b9150508281036040840152613aa68185876139e1565b9998505050505050505050565b6020808252602a908201527f4c617a79494d543a206c656166206d757374206265203c20534e41524b5f53436040820152691053105497d19251531160b21b606082015260800190565b60ff8181168382160190811115610bf057610bf0613456565b64ffffffffff8181168382160190811115610bf057610bf0613456565b6040810181835f5b6002811015613b5a578151835260209283019290910190600101613b3b565b50505092915050565b64ffffffffff8281168282160390811115610bf057610bf0613456565b5f82613b9a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526023908201527f4c617a79494d543a206465707468206d757374206265203c3d204d41585f44456040820152620a0a8960eb1b606082015260800190565b6001815b6001841115610ea157808504811115613c0157613c01613456565b6001841615613c0f57908102905b60019390931c928002613be6565b5f82613c2b57506001610bf0565b81613c3757505f610bf0565b8160018114613c4d5760028114613c5757613c89565b6001915050610bf0565b60ff841115613c6857613c68613456565b6001841b915064ffffffffff821115613c8357613c83613456565b50610bf0565b5060208310610133831016604e8410600b8410161715613cc1575081810a64ffffffffff811115613cbc57613cbc613456565b610bf0565b613cd164ffffffffff8484613be2565b8064ffffffffff04821115613ce857613ce8613456565b029392505050565b5f61243c64ffffffffff841664ffffffffff8416613c1d565b64ffffffffff8181168382160290811690818114613d2957613d29613456565b509291505056fea164736f6c634300081c000a", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80639f0f874a11610135578063e59e4695116100b4578063f26ef74e11610079578063f26ef74e14610571578063f2fde38b14610584578063f379b0df14610597578063f52fd803146105d1578063f6fc05d514610643575f5ffd5b8063e59e469514610516578063e6745e1314610529578063e82f3b701461053c578063ebf0c7171461054f578063f165053614610557575f5ffd5b8063c3a0ec30116100fa578063c3a0ec30146104ae578063ca2869a0146104bf578063cd6dc687146104de578063da881e5a146104f1578063dbb06c9314610504575f5ffd5b80639f0f874a1461044d578063a016493014610456578063a8a4d69b14610469578063bff232c11461047c578063c2b40ae41461048f575f5ffd5b8063715018a6116101c15780638d1ddfb1116101865780638d1ddfb1146103cd5780638da5cb5b146103e35780638e5ce3ad146103eb5780639015d371146103fe5780639a7a2ffc14610411575f5ffd5b8063715018a6146103465780637c92f5241461034e578063858142431461037b5780638a78bb151461039b5780638cb89ecb146103ae575f5ffd5b80632e7b716d116102075780632e7b716d146102d85780634d6861a6146102eb57806350e6d94c146102fe5780635d5047761461032057806370e36bbe14610333575f5ffd5b8063096b810a146102435780630f3e34121461025857806317d611201461026b5780632800d82914610294578063291a691b146102b5575b5f5ffd5b610256610251366004613195565b61064c565b005b6102566102663660046131b0565b610798565b61027e6102793660046131b0565b6107db565b60405161028b91906131c7565b60405180910390f35b6102a76102a23660046131b0565b61091d565b60405190815260200161028b565b6102c86102c3366004613212565b610969565b604051901515815260200161028b565b6102c86102e6366004613195565b610b43565b6102c86102f93660046131b0565b610bf6565b6102c861030c366004613195565b60066020525f908152604090205460ff1681565b6102c861032e36600461324b565b610c35565b610256610341366004613195565b610c79565b610256610cef565b61036161035c366004613279565b610d02565b6040805192835263ffffffff90911660208301520161028b565b60015461038e906001600160a01b031681565b60405161028b91906132ae565b6102566103a9366004613195565b610ea9565b6102a76103bc3660046131b0565b60096020525f908152604090205481565b600454600160281b900464ffffffffff166102a7565b61038e610fe7565b600b5461038e906001600160a01b031681565b6102c861040c366004613195565b611015565b61043761041f366004613195565b60076020525f908152604090205464ffffffffff1681565b60405164ffffffffff909116815260200161028b565b6102a760035481565b61027e6104643660046131b0565b611032565b6102c861047736600461324b565b6110c8565b61025661048a366004613195565b61110c565b6102a761049d3660046131b0565b60086020525f908152604090205481565b6001546001600160a01b031661038e565b6102a76104cd3660046131b0565b5f9081526008602052604090205490565b6102566104ec3660046132c2565b61115d565b6102c86104ff3660046131b0565b6112ba565b5f5461038e906001600160a01b031681565b610256610524366004613195565b6114ed565b6102566105373660046132ec565b611565565b6102a761054a3660046131b0565b611728565b6102a7611759565b61055f601481565b60405160ff909116815260200161028b565b61025661057f366004613350565b61176b565b610256610592366004613195565b611a65565b6004546105b39064ffffffffff80821691600160281b90041682565b6040805164ffffffffff93841681529290911660208301520161028b565b6106146105df3660046131b0565b5f908152600a6020819052604090912090810154600590910154909163ffffffff80831692600160201b900416908284101590565b60405161028b949392919093845263ffffffff9283166020850152911660408301521515606082015260800190565b6102a760025481565b610654610fe7565b6001600160a01b0316336001600160a01b0316148061067d57506001546001600160a01b031633145b61069a57604051632864c4e160e01b815260040160405180910390fd5b6106a381611015565b81906106cc576040516381e5828960e01b81526004016106c391906132ae565b60405180910390fd5b506001600160a01b0381165f9081526007602052604081205464ffffffffff16906106fa9060049083611a9f565b6001600160a01b0382165f908152600660205260408120805460ff1916905560028054916107278361346a565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d5906060015b60405180910390a25050565b6107a0611d41565b60038190556040518181527fbe772dc189863d512fa01e489c8eac204975aef1a8662d8b5a333804b5207ab79060200160405180910390a150565b5f818152600a602081905260408220600681015491810154606093919291816001600160401b038111156108115761081161347f565b60405190808252806020026020018201604052801561083a578160200160208202803683370190505b5090505f805b84811015610911576001866009015f886006018481548110610864576108646134a7565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205460ff16600281111561089c5761089c613493565b03610909578560060181815481106108b6576108b66134a7565b905f5260205f20015f9054906101000a90046001600160a01b03168383815181106108e3576108e36134a7565b6001600160a01b039092166020928302919091019091015281610905816134bb565b9250505b600101610840565b50909695505050505050565b5f818152600a6020526040812081815460ff16600381111561094157610941613493565b0361095f57604051630d4c1d9760e41b815260040160405180910390fd5b6003015492915050565b5f80546001600160a01b031633146109945760405163e4c2a7eb60e01b815260040160405180910390fd5b5f848152600a6020526040812090815460ff1660038111156109b8576109b8613493565b146109d6576040516374ff462560e11b815260040160405180910390fd5b60015460408051630cc37d8f60e11b815290515f926001600160a01b031691631986fb1e9160048083019260209291908290030181865afa158015610a1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4191906134d3565b905080610a5460408601602087016134fd565b63ffffffff161115610a6c60408601602087016134fd565b829091610a9a576040516344ec930f60e01b815263ffffffff909216600483015260248201526044016106c3565b5050815460ff1916600190811783558201859055436002830155600354610ac19042613516565b6003830155610ad5600583018560026130cc565b50610ade611759565b5f87815260086020526040908190209190915560028301546003840154915188927f381d281d32f95ef8fe4e5f3b263ea6a32d03d331e1a141ae1da996dc02a7a17092610b2f928a928a9291613529565b60405180910390a250600195945050505050565b5f610b4d82611015565b610b5857505f919050565b6001546001600160a01b0316610b81576040516350ca893360e01b815260040160405180910390fd5b600154604051639f8a13d760e01b81526001600160a01b0390911690639f8a13d790610bb19085906004016132ae565b602060405180830381865afa158015610bcc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf09190613588565b92915050565b5f818152600a602052604081206001815460ff166003811115610c1b57610c1b613493565b14610c2857505f92915050565b6003015442111592915050565b5f60015f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff166002811115610c7157610c71613493565b149392505050565b610c81611d41565b6001600160a01b038116610ca85760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b038316908117825560405190917f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c991a250565b610cf7611d41565b610d005f611d73565b565b600b545f9081906001600160a01b03163314610d315760405163fcef374960e01b815260040160405180910390fd5b5f858152600a602052604090206002815460ff166003811115610d5657610d56613493565b14610d7457604051634f4b461f60e11b815260040160405180910390fd5b60058101546001600160a01b0386165f90815260098301602052604090205463ffffffff909116925060019060ff166002811115610db457610db4613493565b14610dc457600a01549150610ea1565b6001600160a01b0385165f9081526009820160205260408120805460ff19166002179055600a8201805491610df88361346a565b919050555080600a01549250846001600160a01b0316867f6c783b92374361b4d6efaf29673b89437ee969bb3c9d2d5d86b143ad5447b8498686604051610e49929190918252602082015260400190565b60405180910390a36040805184815263ffffffff84166020820181905285101591810182905287907f119cb11dd0a68c257d6dc9b06dcb37dd422ce276eb8bf3cd0b7079a116b8e2989060600160405180910390a250505b935093915050565b610eb1610fe7565b6001600160a01b0316336001600160a01b03161480610eda57506001546001600160a01b031633145b610ef757604051632864c4e160e01b815260040160405180910390fd5b610f0081611015565b610fe45760048054600160281b900464ffffffffff1690610f2a906001600160a01b038416611de3565b6001600160a01b0382165f908152600660209081526040808320805460ff1916600117905560079091528120805464ffffffffff841664ffffffffff199091161790556002805491610f7b836134bb565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db539060600161078c565b50565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081526006602052604090205460ff1690565b5f818152600a60205260409020600481015460609190611065576040516322e679e360e11b815260040160405180910390fd5b806006018054806020026020016040519081016040528092919081815260200182805480156110bb57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161109d575b5050505050915050919050565b5f805f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff16600281111561110357611103613493565b14159392505050565b611114611d41565b6001600160a01b03811661113b5760405163d92e233d60e01b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f611166611fb9565b805490915060ff600160401b82041615906001600160401b03165f8115801561118c5750825b90505f826001600160401b031660011480156111a75750303b155b9050811580156111b5575080155b156111d35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111fd57845460ff60401b1916600160401b1785555b6001600160a01b0387166112245760405163d92e233d60e01b815260040160405180910390fd5b61122d33611fe1565b61123960046014611ff2565b61124286610798565b61124a610fe7565b6001600160a01b0316876001600160a01b03161461126b5761126b87611a65565b83156112b157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f818152600a6020526040812081815460ff1660038111156112de576112de613493565b036112fc57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff16600381111561131457611314613493565b1461133257604051631860f69960e31b815260040160405180910390fd5b8060030154421161135657604051632f021e8d60e11b815260040160405180910390fd5b60058101546006820154600160201b90910463ffffffff1611158061143b578154600360ff199091161782556006820154600583015460408051928352600160201b90910463ffffffff16602083015285917fecc4a9fb7e28d074cba7f5b227e9b5827823c850a385539b9a2f98a08f8c203d910160405180910390a25f54604051635d968dc160e11b815260048101869052600260248201526001600160a01b039091169063bb2d1b82906044015f604051808303815f87803b15801561141c575f5ffd5b505af115801561142e573d5f5f3e3d5ffd5b505f979650505050505050565b815460ff191660021782556006820154600a8301555f54604051631f3ea75d60e21b8152600481018690526001600160a01b0390911690637cfa9d74906024015f604051808303815f87803b158015611492575f5ffd5b505af11580156114a4573d5f5f3e3d5ffd5b50505050837fed38c6266ebed7c01d311349a7fa67e0ef0f1d2f4760d60dbb34ca4799a2e132836006016040516114db91906135a1565b60405180910390a25060019392505050565b6114f5611d41565b6001600160a01b03811661151c5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a7905f90a250565b5f828152600a6020526040812090815460ff16600381111561158957611589613493565b036115a757604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156115bf576115bf613493565b146115dd57604051631860f69960e31b815260040160405180910390fd5b806003015442111561160257604051639a19114d60e01b815260040160405180910390fd5b335f90815260078201602052604090205460ff16156116345760405163257309f160e11b815260040160405180910390fd5b61163d33610b43565b61165a5760405163149fbcfd60e11b815260040160405180910390fd5b611665338385612071565b6001810154604080516bffffffffffffffffffffffff193360601b16602080830191909152603482018690526054820187905260748083019490945282518083039094018452609490910190915281519101205f90335f8181526007850160205260409020805460ff191660011790559091506116e490839083612242565b506040805184815260208101839052339186917f52999628fb1cb05707e842278833b22e511f11746202cecdf221968b0b89e8bd910160405180910390a350505050565b5f8181526009602052604090205480611754576040516322e679e360e11b815260040160405180910390fd5b919050565b5f61176660046014612443565b905090565b611773611d41565b5f898152600a602052604090206002815460ff16600381111561179857611798613493565b146117b657604051634f4b461f60e11b815260040160405180910390fd5b6004810154156117d95760405163632a22bb60e01b815260040160405180910390fd5b600681015488146118225760405162461bcd60e51b815260206004820152601360248201527209cdec8ca40c6deeadce840dad2e6dac2e8c6d606b1b60448201526064016106c3565b5f61182f858701876136e2565b9150505f8151116118795760405162461bcd60e51b815260206004820152601460248201527343353a206e6f207075626c696320696e7075747360601b60448201526064016106c3565b5f81600183516118899190613785565b81518110611899576118996134a7565b602002602001015190505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663406ed35c8e6040518263ffffffff1660e01b81526004016118e591815260200190565b5f60405180830381865afa1580156118ff573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611926919081019061386a565b610120810151604051637bf41d7760e11b81529192506001600160a01b03169063f7e83aee90611960908b908b908b908b90600401613a09565b602060405180830381865afa15801561197b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061199f91906134d3565b5060048085018390555f8e815260096020526040808220859055905490516340a3b76160e11b81529182018f9052602482018490526001600160a01b0316906381476ec2906044015f604051808303815f87803b1580156119fe575f5ffd5b505af1158015611a10573d5f5f3e3d5ffd5b505050508c7f49ac1dd411942113d1c5e6799c6379ce341afe85a4175fb562cf2a5fb886c27d8d8d8d8d8d8d604051611a4e96959493929190613a3a565b60405180910390a250505050505050505050505050565b611a6d611d41565b6001600160a01b038116611a96575f604051631e4fbdf760e01b81526004016106c391906132ae565b610fe481611d73565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611ade5760405162461bcd60e51b81526004016106c390613ab3565b825464ffffffffff600160281b90910481169082168111611b3c5760405162461bcd60e51b815260206004820152601860248201527713185e9e5253550e881b195859881b5d5cdd08195e1a5cdd60421b60448201526064016106c3565b825f5b81866001015f611b4f848861253c565b64ffffffffff1681526020019081526020015f20819055505f816001611b759190613afd565b60ff168464ffffffffff16901c64ffffffffff16905060018564ffffffffff16901c64ffffffffff168111611baa5750611d39565b600185165f03611c71575f611bc983611bc4886001613b16565b61253c565b60408051808201825286815264ffffffffff83165f90815260018c0160209081529083902054908201529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611c2a91600401613b33565b602060405180830381865af4158015611c45573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6991906134d3565b935050611d25565b5f611c8183611bc4600189613b63565b60408051808201825264ffffffffff83165f90815260018c0160209081529083902054825281018790529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611ce291600401613b33565b602060405180830381865af4158015611cfd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d2191906134d3565b9350505b50647fffffffff600194851c169301611b3f565b505050505050565b33611d4a610fe7565b6001600160a01b031614610d00573360405163118cdaa760e01b81526004016106c391906132ae565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b8154600160281b900464ffffffffff167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611e325760405162461bcd60e51b81526004016106c390613ab3565b825464ffffffffff90811690821610611e855760405162461bcd60e51b815260206004820152601560248201527413185e9e5253550e881d1c9959481a5cc8199d5b1b605a1b60448201526064016106c3565b611e90816001613b16565b835464ffffffffff91909116600160281b0269ffffffffff000000000019909116178355815f5b81856001015f611ec7848761253c565b64ffffffffff16815260208101919091526040015f20556001831615611fb2575f611ef782611bc4600187613b63565b60408051808201825264ffffffffff83165f90815260018a0160209081529083902054825281018690529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611f5891600401613b33565b602060405180830381865af4158015611f73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9791906134d3565b647fffffffff600195861c1694909350919091019050611eb7565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610bf0565b611fe9612559565b610fe48161257e565b602060ff821611156120405760405162461bcd60e51b81526020600482015260176024820152764c617a79494d543a205472656520746f6f206c6172676560481b60448201526064016106c3565b612051600160ff831681901b613785565b825469ffffffffffffffffffff191664ffffffffff919091161790915550565b5f82116120915760405163aeaddff160e01b815260040160405180910390fd5b6001546001600160a01b03166120ba576040516350ca893360e01b815260040160405180910390fd5b5f818152600a602052604081206001805460028301549293926001600160a01b039091169163bb03bd719188916120f091613785565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612137573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215b91906134d3565b90505f60015f9054906101000a90046001600160a01b03166001600160a01b0316631209b1f66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d291906134d3565b90505f81116121f45760405163aeaddff160e01b815260040160405180910390fd5b5f6121ff8284613b80565b90505f81116122215760405163149fbcfd60e11b815260040160405180910390fd5b808611156112b15760405163aeaddff160e01b815260040160405180910390fd5b60058301546006840180545f92600160201b900463ffffffff16908111156122c057508054600180820183555f928352602080842090920180546001600160a01b0319166001600160a01b03881690811790915583526008870182526040808420869055600988019092529120805460ff191682179055905061243c565b5f5f90505f876008015f855f815481106122dc576122dc6134a7565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905060015b8454811015612364575f896008015f878481548110612326576123266134a7565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205490508281111561235b578092508193505b50600101612305565b50808610612378575f94505050505061243c565b5f886009015f868581548110612390576123906134a7565b5f9182526020808320909101546001600160a01b031683528201929092526040019020805460ff191660018360028111156123cd576123cd613493565b0217905550868483815481106123e5576123e56134a7565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918916815260088a018252604080822089905560098b0190925220805460ff191660019081179091559450505050505b9392505050565b5f5f8260ff16116124965760405162461bcd60e51b815260206004820152601a60248201527f4c617a79494d543a206465707468206d757374206265203e203000000000000060448201526064016106c3565b602060ff831611156124ba5760405162461bcd60e51b81526004016106c390613b9f565b8254600160281b900464ffffffffff16806124d960ff85166002613cf0565b64ffffffffff1610156125295760405162461bcd60e51b8152602060048201526018602482015277098c2f4f2929aa87440c2dac4d2ceeadeeae640c8cae0e8d60431b60448201526064016106c3565b612534848285612586565b949350505050565b5f8161254f60ff851663ffffffff613d09565b61243c9190613b16565b61256161264e565b610d0057604051631afcd79f60e31b815260040160405180910390fd5b611a6d612559565b5f602060ff831611156125ab5760405162461bcd60e51b81526004016106c390613b9f565b8264ffffffffff165f036125c9576125c282612667565b905061243c565b5f6125d5836001613afd565b60ff166001600160401b038111156125ef576125ef61347f565b604051908082528060200260200182016040528015612618578160200160208202803683370190505b50905061262785858584612d01565b808360ff168151811061263c5761263c6134a7565b60200260200101519150509392505050565b5f612657611fb9565b54600160401b900460ff16919050565b5f8160ff165f0361267957505f919050565b8160ff166001036126ab57507f2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864919050565b8160ff166002036126dd57507f1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1919050565b8160ff1660030361270f57507f18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238919050565b8160ff1660040361274157507f07f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a919050565b8160ff1660050361277357507f2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55919050565b8160ff166006036127a557507f2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78919050565b8160ff166007036127d757507f078295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d919050565b8160ff1660080361280957507f2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61919050565b8160ff1660090361283b57507f0e884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747919050565b8160ff16600a0361286d57507f1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2919050565b8160ff16600b0361289f57507f1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636919050565b8160ff16600c036128d157507f2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a919050565b8160ff16600d0361290357507f14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0919050565b8160ff16600e0361293557507f190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c919050565b8160ff16600f0361296757507f22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92919050565b8160ff1660100361299957507f2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323919050565b8160ff166011036129cb57507f2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992919050565b8160ff166012036129fd57507f0f57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f919050565b8160ff16601303612a2f57507f1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca919050565b8160ff16601403612a6157507f2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e919050565b8160ff16601503612a9357507f19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1919050565b8160ff16601603612ac557507f18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b919050565b8160ff16601703612af757507f2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d919050565b8160ff16601803612b2957507f27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540919050565b8160ff16601903612b5b57507f2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21919050565b8160ff16601a03612b8d57507f120c58f143d491e95902f7f5277778a2e0ad5168f6add75669932630ce611518919050565b8160ff16601b03612bbf57507f1f21feb70d3f21b07bf853d5e5db03071ec495a0a565a21da2d665d279483795919050565b8160ff16601c03612bf157507f24be905fa71335e14c638cc0f66a8623a826e768068a9e968bb1a1dde18a72d2919050565b8160ff16601d03612c2357507f0f8666b62ed17491c50ceadead57d4cd597ef3821d65c328744c74e553dac26d919050565b8160ff16601e03612c5557507f0918d46bf52d98b034413f4a1a1c41594e7a7a3f6ae08cb43d1a2a230e1959ef919050565b8160ff16601f03612c8757507f1bbeb01b4c479ecde76917645e404dfa2e26f90d0afc5a65128513ad375c5ff2919050565b8160ff16602003612cb957507f2f68a1c58e257e42a17a6c61dff5551ed560b9922ab119d5ac8e184c9734ead9919050565b60405162461bcd60e51b815260206004820152601e60248201527f4c617a79494d543a2064656661756c745a65726f2062616420696e646578000060448201526064016106c3565b602060ff83161115612d255760405162461bcd60e51b81526004016106c390613b9f565b5f8364ffffffffff1611612d895760405162461bcd60e51b815260206004820152602560248201527f4c617a79494d543a206e756d626572206f66206c6561766573206d7573742062604482015264065203e20360dc1b60648201526084016106c3565b5f612d95600185613b63565b9050600181165f03612de857846001015f612db05f8461253c565b64ffffffffff1681526020019081526020015f2054825f81518110612dd757612dd76134a7565b602002602001018181525050612e10565b612df15f612667565b825f81518110612e0357612e036134a7565b6020026020010181815250505b5f5b8360ff168160ff161015611d3957600182165f03612f085773__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280868560ff1681518110612e6457612e646134a7565b60200260200101518152602001612e7a85612667565b8152506040518263ffffffff1660e01b8152600401612e999190613b33565b602060405180830381865af4158015612eb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed891906134d3565b83612ee4836001613afd565b60ff1681518110612ef757612ef76134a7565b6020026020010181815250506130b9565b5f612f14826001613afd565b60ff168664ffffffffff16901c64ffffffffff16905060018364ffffffffff16901c64ffffffffff16811115612fb6575f876001015f612f6b856001612f5a9190613afd565b60018864ffffffffff16901c61253c565b64ffffffffff1681526020019081526020015f205490508085846001612f919190613afd565b60ff1681518110612fa457612fa46134a7565b602002602001018181525050506130b7565b5f876001015f612fcd85600188611bc49190613b63565b64ffffffffff1681526020019081526020015f2054905073__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280848152602001888760ff1681518110613024576130246134a7565b60200260200101518152506040518263ffffffff1660e01b815260040161304b9190613b33565b602060405180830381865af4158015613066573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061308a91906134d3565b85613096856001613afd565b60ff16815181106130a9576130a96134a7565b602002602001018181525050505b505b647fffffffff600192831c169101612e12565b60018301918390821561315d579160200282015f5b8382111561312b57833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026130e1565b801561315b5782816101000a81549063ffffffff021916905560040160208160030104928301926001030261312b565b505b5061316992915061316d565b5090565b5b80821115613169575f815560010161316e565b6001600160a01b0381168114610fe4575f5ffd5b5f602082840312156131a5575f5ffd5b813561243c81613181565b5f602082840312156131c0575f5ffd5b5035919050565b602080825282518282018190525f918401906040840190835b818110156132075783516001600160a01b03168352602093840193909201916001016131e0565b509095945050505050565b5f5f5f60808486031215613224575f5ffd5b83359250602084013591506080840185101561323e575f5ffd5b6040840190509250925092565b5f5f6040838503121561325c575f5ffd5b82359150602083013561326e81613181565b809150509250929050565b5f5f5f6060848603121561328b575f5ffd5b83359250602084013561329d81613181565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b5f5f604083850312156132d3575f5ffd5b82356132de81613181565b946020939093013593505050565b5f5f604083850312156132fd575f5ffd5b50508035926020909101359150565b5f5f83601f84011261331c575f5ffd5b5081356001600160401b03811115613332575f5ffd5b602083019150836020828501011115613349575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f60a08a8c031215613368575f5ffd5b8935985060208a01356001600160401b03811115613384575f5ffd5b8a01601f81018c13613394575f5ffd5b80356001600160401b038111156133a9575f5ffd5b8c60208260051b84010111156133bd575f5ffd5b6020919091019850965060408a01356001600160401b038111156133df575f5ffd5b6133eb8c828d0161330c565b90975095505060608a01356001600160401b03811115613409575f5ffd5b6134158c828d0161330c565b90955093505060808a01356001600160401b03811115613433575f5ffd5b61343f8c828d0161330c565b915080935050809150509295985092959850929598565b634e487b7160e01b5f52601160045260245ffd5b5f8161347857613478613456565b505f190190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f600182016134cc576134cc613456565b5060010190565b5f602082840312156134e3575f5ffd5b5051919050565b803563ffffffff81168114611754575f5ffd5b5f6020828403121561350d575f5ffd5b61243c826134ea565b80820180821115610bf057610bf0613456565b84815260a0810160208201855f5b60028110156135645763ffffffff61354e836134ea565b1683526020928301929190910190600101613537565b50505060608201939093526080015292915050565b80518015158114611754575f5ffd5b5f60208284031215613598575f5ffd5b61243c82613579565b602080825282548282018190525f848152918220906040840190835b818110156132075783546001600160a01b03168352600193840193602090930192016135bd565b6040516101e081016001600160401b03811182821017156136075761360761347f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156136355761363561347f565b604052919050565b5f6001600160401b038211156136555761365561347f565b50601f01601f191660200190565b5f82601f830112613672575f5ffd5b81356001600160401b0381111561368b5761368b61347f565b8060051b61369b6020820161360d565b918252602081850181019290810190868411156136b6575f5ffd5b6020860192505b838310156136d85782358252602092830192909101906136bd565b9695505050505050565b5f5f604083850312156136f3575f5ffd5b82356001600160401b03811115613708575f5ffd5b8301601f81018513613718575f5ffd5b803561372b6137268261363d565b61360d565b81815286602083850101111561373f575f5ffd5b816020840160208301375f6020838301015280945050505060208301356001600160401b0381111561376f575f5ffd5b61377b85828601613663565b9150509250929050565b81810381811115610bf057610bf0613456565b805160048110611754575f5ffd5b5f82601f8301126137b5575f5ffd5b604080519081016001600160401b03811182821017156137d7576137d761347f565b80604052508060408401858111156137ed575f5ffd5b845b818110156138075780518352602092830192016137ef565b509195945050505050565b805161175481613181565b5f82601f83011261382c575f5ffd5b815161383a6137268261363d565b81815284602083860101111561384e575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561387a575f5ffd5b81516001600160401b0381111561388f575f5ffd5b820161020081850312156138a1575f5ffd5b6138a96135e4565b815181526138b960208301613798565b6020820152604082810151908201526138d585606084016137a6565b606082015260a082015160808201526138f060c08301613812565b60a082015260e08201516001600160401b0381111561390d575f5ffd5b6139198682850161381d565b60c0830152506101008201516001600160401b03811115613938575f5ffd5b6139448682850161381d565b60e0830152506139576101208301613812565b61010082015261396a6101408301613812565b61012082015261016082810151610140830152610180830151908201526101a08201516001600160401b038111156139a0575f5ffd5b6139ac8682850161381d565b610180830152506139c06101c08301613812565b6101a08201526139d36101e08301613579565b6101c0820152949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f613a1c6040830186886139e1565b8281036020840152613a2f8185876139e1565b979650505050505050565b606080825281018690525f8760808301825b89811015613a7c578235613a5f81613181565b6001600160a01b0316825260209283019290910190600101613a4c565b508381036020850152613a9081888a6139e1565b9150508281036040840152613aa68185876139e1565b9998505050505050505050565b6020808252602a908201527f4c617a79494d543a206c656166206d757374206265203c20534e41524b5f53436040820152691053105497d19251531160b21b606082015260800190565b60ff8181168382160190811115610bf057610bf0613456565b64ffffffffff8181168382160190811115610bf057610bf0613456565b6040810181835f5b6002811015613b5a578151835260209283019290910190600101613b3b565b50505092915050565b64ffffffffff8281168282160390811115610bf057610bf0613456565b5f82613b9a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526023908201527f4c617a79494d543a206465707468206d757374206265203c3d204d41585f44456040820152620a0a8960eb1b606082015260800190565b6001815b6001841115610ea157808504811115613c0157613c01613456565b6001841615613c0f57908102905b60019390931c928002613be6565b5f82613c2b57506001610bf0565b81613c3757505f610bf0565b8160018114613c4d5760028114613c5757613c89565b6001915050610bf0565b60ff841115613c6857613c68613456565b6001841b915064ffffffffff821115613c8357613c83613456565b50610bf0565b5060208310610133831016604e8410600b8410161715613cc1575081810a64ffffffffff811115613cbc57613cbc613456565b610bf0565b613cd164ffffffffff8484613be2565b8064ffffffffff04821115613ce857613ce8613456565b029392505050565b5f61243c64ffffffffff841664ffffffffff8416613c1d565b64ffffffffff8181168382160290811690818114613d2957613d29613456565b509291505056fea164736f6c634300081c000a", "linkReferences": { "npm/poseidon-solidity@0.0.5/PoseidonT3.sol": { "PoseidonT3": [ { "length": 20, - "start": 7382 + "start": 7386 }, { "length": 20, - "start": 7566 + "start": 7570 }, { "length": 20, - "start": 8196 + "start": 8200 }, { "length": 20, - "start": 12030 + "start": 12034 }, { "length": 20, - "start": 12472 + "start": 12476 } ] } @@ -1280,28 +1286,28 @@ "PoseidonT3": [ { "length": 20, - "start": 7168 + "start": 7172 }, { "length": 20, - "start": 7352 + "start": 7356 }, { "length": 20, - "start": 7982 + "start": 7986 }, { "length": 20, - "start": 11816 + "start": 11820 }, { "length": 20, - "start": 12258 + "start": 12262 } ] } }, "immutableReferences": {}, "inputSourceName": "project/contracts/registry/CiphernodeRegistryOwnable.sol", - "buildInfoId": "solc-0_8_28-561f4408bcfee777a1360e3f4f4b4e2d1bea7249" + "buildInfoId": "solc-0_8_28-4e1d4326aa586bce7ef3b38a9e93aeff5ca3ac8f" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/token/EnclaveTicketToken.sol/EnclaveTicketToken.json b/packages/enclave-contracts/artifacts/contracts/token/EnclaveTicketToken.sol/EnclaveTicketToken.json index a47b0fdd6a..433586d3fb 100644 --- a/packages/enclave-contracts/artifacts/contracts/token/EnclaveTicketToken.sol/EnclaveTicketToken.json +++ b/packages/enclave-contracts/artifacts/contracts/token/EnclaveTicketToken.sol/EnclaveTicketToken.json @@ -1223,5 +1223,5 @@ ] }, "inputSourceName": "project/contracts/token/EnclaveTicketToken.sol", - "buildInfoId": "solc-0_8_28-16cf43f6814888a6b7f512f8d4a2a360fcb66d4c" + "buildInfoId": "solc-0_8_28-4e1d4326aa586bce7ef3b38a9e93aeff5ca3ac8f" } \ No newline at end of file diff --git a/packages/enclave-contracts/contracts/Enclave.sol b/packages/enclave-contracts/contracts/Enclave.sol index e547864e3a..6f09b2f219 100644 --- a/packages/enclave-contracts/contracts/Enclave.sol +++ b/packages/enclave-contracts/contracts/Enclave.sol @@ -485,7 +485,7 @@ contract Enclave is IEnclave, OwnableUpgradeable { _distributeRewards(e3Id); - emit PlaintextOutputPublished(e3Id, plaintextOutput); + emit PlaintextOutputPublished(e3Id, plaintextOutput, proof); emit E3StageChanged(e3Id, E3Stage.CiphertextReady, E3Stage.Complete); } diff --git a/packages/enclave-contracts/contracts/interfaces/ICiphernodeRegistry.sol b/packages/enclave-contracts/contracts/interfaces/ICiphernodeRegistry.sol index f6d4f0a5e5..a2d59c78fc 100644 --- a/packages/enclave-contracts/contracts/interfaces/ICiphernodeRegistry.sol +++ b/packages/enclave-contracts/contracts/interfaces/ICiphernodeRegistry.sol @@ -99,10 +99,12 @@ interface ICiphernodeRegistry { /// @notice This event MUST be emitted when a committee is selected for an E3. /// @param e3Id ID of the E3 for which the committee was selected. /// @param publicKey Public key of the committee. + /// @param proof C5 proof bytes verified prior to publication. event CommitteePublished( uint256 indexed e3Id, address[] nodes, - bytes publicKey + bytes publicKey, + bytes proof ); /// @notice This event MUST be emitted when a committee's active status changes. diff --git a/packages/enclave-contracts/contracts/interfaces/IEnclave.sol b/packages/enclave-contracts/contracts/interfaces/IEnclave.sol index 160e957b15..323e64d0c5 100644 --- a/packages/enclave-contracts/contracts/interfaces/IEnclave.sol +++ b/packages/enclave-contracts/contracts/interfaces/IEnclave.sol @@ -104,7 +104,12 @@ interface IEnclave { /// is successfully published. /// @param e3Id ID of the E3. /// @param plaintextOutput ABI encoded plaintext output. - event PlaintextOutputPublished(uint256 indexed e3Id, bytes plaintextOutput); + /// @param proof ABI encoded verification proof (C7) for the plaintext output. + event PlaintextOutputPublished( + uint256 indexed e3Id, + bytes plaintextOutput, + bytes proof + ); /// @notice This event MUST be emitted when the ciphertext output of an Encrypted Execution Environment (E3) /// is successfully published. diff --git a/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol b/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol index 99400fc357..08935fce8e 100644 --- a/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol +++ b/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol @@ -311,7 +311,7 @@ contract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable { enclave.onCommitteePublished(e3Id, publicKeyHash); - emit CommitteePublished(e3Id, nodes, publicKey); + emit CommitteePublished(e3Id, nodes, publicKey, proof); } /// @inheritdoc ICiphernodeRegistry diff --git a/packages/enclave-contracts/deployed_contracts.json b/packages/enclave-contracts/deployed_contracts.json index 1849d9405b..dfd3ccc67a 100644 --- a/packages/enclave-contracts/deployed_contracts.json +++ b/packages/enclave-contracts/deployed_contracts.json @@ -151,21 +151,21 @@ }, "localhost": { "PoseidonT3": { - "blockNumber": 1, + "blockNumber": 4, "address": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93" }, "MockUSDC": { "constructorArgs": { "initialSupply": "1000000" }, - "blockNumber": 2, + "blockNumber": 5, "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" }, "EnclaveToken": { "constructorArgs": { "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" }, - "blockNumber": 3, + "blockNumber": 6, "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" }, "EnclaveTicketToken": { @@ -174,14 +174,14 @@ "registry": "0x0000000000000000000000000000000000000001", "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" }, - "blockNumber": 5, + "blockNumber": 8, "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" }, "SlashingManager": { "constructorArgs": { "admin": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" }, - "blockNumber": 6, + "blockNumber": 9, "address": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707" }, "CiphernodeRegistryOwnable": { @@ -196,7 +196,7 @@ "proxyAdminAddress": "0x9bd03768a7DCc129555dE410FF8E85528A4F88b5", "implementationAddress": "0x0165878A594ca255338adfa4d48449f69242Eb8F" }, - "blockNumber": 7, + "blockNumber": 10, "address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853" }, "BondingRegistry": { @@ -218,7 +218,7 @@ "proxyAdminAddress": "0x8aCd85898458400f7Db866d53FCFF6f0D49741FF", "implementationAddress": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6" }, - "blockNumber": 8, + "blockNumber": 11, "address": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" }, "Enclave": { @@ -241,7 +241,7 @@ "proxyAdminAddress": "0x8dAF17A20c9DBA35f005b6324F493785D239719d", "implementationAddress": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788" }, - "blockNumber": 11, + "blockNumber": 14, "address": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e" }, "E3RefundManager": { @@ -257,36 +257,24 @@ "proxyAdminAddress": "0x32467b43BFa67273FC7dDda0999Ee9A12F2AaA08", "implementationAddress": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0" }, - "blockNumber": 13, + "blockNumber": 16, "address": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82" }, "MockComputeProvider": { - "blockNumber": 31, + "blockNumber": 18, "address": "0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E" }, - "MockE3Program": { - "blockNumber": 32, + "MockDecryptionVerifier": { + "blockNumber": 19, "address": "0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690" }, - "ZKTranscriptLib": { - "blockNumber": 34, - "address": "0x9E545E3C0baAB3E08CdfD552C960A1050f373042" - }, - "RecursiveAggregationFoldVerifier": { - "blockNumber": 35, - "address": "0xa82fF9aFd8f496c3d6ac40E2a0F282E47488CFc9" + "MockPkVerifier": { + "blockNumber": 20, + "address": "0x84eA74d481Ee0A5332c457a4d796187F6Ba67fEB" }, - "ThresholdDecryptedSharesAggregationVerifier": { - "blockNumber": 36, - "address": "0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8" - }, - "ThresholdPkAggregationVerifier": { - "blockNumber": 37, - "address": "0x851356ae760d987E095750cCeb3bC6014560891C" - }, - "BfvDecryptionVerifier": { - "blockNumber": 38, - "address": "0xf5059a5D33d5853360D16C683c16e67980206f36" + "MockE3Program": { + "blockNumber": 21, + "address": "0x9E545E3C0baAB3E08CdfD552C960A1050f373042" } } } \ No newline at end of file diff --git a/packages/enclave-contracts/test/Enclave.spec.ts b/packages/enclave-contracts/test/Enclave.spec.ts index 82096a00c1..ce9d2af7be 100644 --- a/packages/enclave-contracts/test/Enclave.spec.ts +++ b/packages/enclave-contracts/test/Enclave.spec.ts @@ -1236,7 +1236,7 @@ describe("Enclave", function () { await enclave.publishPlaintextOutput(e3Id, data, proof, "0x"), ) .to.emit(enclave, "PlaintextOutputPublished") - .withArgs(e3Id, data); + .withArgs(e3Id, data, proof); }); }); }); diff --git a/packages/enclave-contracts/test/Registry/CiphernodeRegistryOwnable.spec.ts b/packages/enclave-contracts/test/Registry/CiphernodeRegistryOwnable.spec.ts index 11d7004f26..858ce78925 100644 --- a/packages/enclave-contracts/test/Registry/CiphernodeRegistryOwnable.spec.ts +++ b/packages/enclave-contracts/test/Registry/CiphernodeRegistryOwnable.spec.ts @@ -530,6 +530,7 @@ describe("CiphernodeRegistryOwnable", function () { await operator3.getAddress(), ], data, + c5Proof, ); }); }); diff --git a/packages/enclave-sdk/src/events/types.ts b/packages/enclave-sdk/src/events/types.ts index 3d7504915b..357f8ebff4 100644 --- a/packages/enclave-sdk/src/events/types.ts +++ b/packages/enclave-sdk/src/events/types.ts @@ -65,6 +65,7 @@ export interface CiphertextOutputPublishedData { export interface PlaintextOutputPublishedData { e3Id: bigint plaintextOutput: string + proof: string } export interface CiphernodeAddedData { @@ -93,6 +94,7 @@ export interface CommitteePublishedData { e3Id: bigint nodes: string[] publicKey: string + proof: string } export interface CommitteeFinalizedData {