Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- SupraSValueFeedVerifier
- Optimization enabled
- true
- Compiler version
- v0.8.24+commit.e11b9ed9
- Optimization runs
- 200
- Verified at
- 2024-06-20T11:51:56.995715Z
src/SupraSValueFeedVerifier.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.24;import "./BLS.sol";import "./ISupraSValueFeed.sol";import {EnumerableSet} from "./EnumerableSet.sol";import {UUPSUpgradeable} from "../lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol";import {Ownable2StepUpgradeable} from "../lib/openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol";import "../lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol";/// @title Supra SMR Block Utilities/// @notice This library contains the data structures and functions for hashing SMR blocks./// @dev This library is primarily used by the SupraSValueFeedVerifier contract.library Smr {/// @notice A vote is a block with a round number./// @dev The library assumes the round number is passed in little endian formatstruct Vote {MinBlock smrBlock;// SPEC: smrBlock.round.to_le_bytes()bytes8 roundLE;}/// @notice A partial SMR block containing the bare-minimum for hashingstruct MinBlock {uint64 round;uint128 timestamp;bytes32 author;bytes32 qcHash;bytes32[] batchHashes;}/// @notice An SMR Transactionstruct MinTxn {bytes32[] clusterHashes;bytes32 sender;bytes10 protocol;bytes1 tx_sub_type;}/// @notice A partial SMR batch containing the bare-minimum for hashing/// @dev The library assumes that txnHashes is a list of keccak256 hashes of abi encoded SMR transaction
lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)pragma solidity ^0.8.0;/*** @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.** _Available since v4.8.3._*/interface IERC1967 {/*** @dev Emitted when the implementation is upgraded.*/event Upgraded(address indexed implementation);/*** @dev Emitted when the admin account has changed.*/event AdminChanged(address previousAdmin, address newAdmin);/*** @dev Emitted when the beacon is changed.*/event BeaconUpgraded(address indexed beacon);}
lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)pragma solidity ^0.8.0;/*** @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified* proxy whose upgrades are fully controlled by the current implementation.*/interface IERC1822Proxiable {/*** @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation* address.** IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this* function revert if invoked through a proxy.*/function proxiableUUID() external view returns (bytes32);}
lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)pragma solidity ^0.8.2;import "../beacon/IBeacon.sol";import "../../interfaces/IERC1967.sol";import "../../interfaces/draft-IERC1822.sol";import "../../utils/Address.sol";import "../../utils/StorageSlot.sol";/*** @dev This abstract contract provides getters and event emitting update functions for* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.** _Available since v4.1._*/abstract contract ERC1967Upgrade is IERC1967 {// This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;/*** @dev Storage slot with the address of the current implementation.* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is* validated in the constructor.*/bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;/*** @dev Returns the current implementation address.*/function _getImplementation() internal view returns (address) {return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;}/*** @dev Stores a new address in the EIP1967 implementation slot.*/function _setImplementation(address newImplementation) private {require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)pragma solidity ^0.8.0;/*** @dev This is the interface that {BeaconProxy} expects of its beacon.*/interface IBeacon {/*** @dev Must return an address that can be used as a delegate call target.** {BeaconProxy} will check that this address is a contract.*/function implementation() external view returns (address);}
lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)pragma solidity ^0.8.0;import "../../interfaces/draft-IERC1822.sol";import "../ERC1967/ERC1967Upgrade.sol";/*** @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an* {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.** A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is* reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing* `UUPSUpgradeable` with a custom implementation of upgrades.** The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.** _Available since v4.1._*/abstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade {/// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignmentaddress private immutable __self = address(this);/*** @dev Check that the execution is being performed through a delegatecall call and that the execution context is* a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case* for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a* function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to* fail.*/modifier onlyProxy() {require(address(this) != __self, "Function must be called through delegatecall");require(_getImplementation() == __self, "Function must be called through active proxy");_;}/*** @dev Check that the execution is not being performed through a delegate call. This allows a function to be* callable on the implementing contract but not through proxies.*/
lib/openzeppelin-contracts/contracts/utils/Address.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)pragma solidity ^0.8.1;/*** @dev Collection of functions related to the address type*/library Address {/*** @dev Returns true if `account` is a contract.** [IMPORTANT]* ====* It is unsafe to assume that an address for which this function returns* false is an externally-owned account (EOA) and not a contract.** Among others, `isContract` will return false for the following* types of addresses:** - an externally-owned account* - a contract in construction* - an address where a contract will be created* - an address where a contract lived, but was destroyed** Furthermore, `isContract` will also return true if the target contract within* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,* which only has an effect at the end of a transaction.* ====** [IMPORTANT]* ====* You shouldn't rely on `isContract` to protect against flash loan attacks!** Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract* constructor.* ====*/function isContract(address account) internal view returns (bool) {// This method relies on extcodesize/address.code.length, which returns 0
lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.pragma solidity ^0.8.0;/*** @dev Library for reading and writing primitive types to specific storage slots.** Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.* This library helps with reading and writing to such slots without the need for inline assembly.** The functions in this library return Slot structs that contain a `value` member that can be used to read or write.** Example usage to set ERC1967 implementation slot:* ```solidity* contract ERC1967 {* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;** function _getImplementation() internal view returns (address) {* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;* }** function _setImplementation(address newImplementation) internal {* require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;* }* }* ```** _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._* _Available since v4.9 for `string`, `bytes`._*/library StorageSlot {struct AddressSlot {address value;}struct BooleanSlot {bool value;}
src/BLS.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.19;import {ModexpInverse, ModexpSqrt} from "./ModExp.sol";import {BNPairingPrecompileCostEstimator} from "./BNPairingPrecompileCostEstimator.sol";library BLS {uint256 private constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583;uint256 private constant N_G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;uint256 private constant N_G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;uint256 private constant Z0 = 0x0000000000000000b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd;uint256 private constant Z1 = 0x000000000000000059e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe;uint256 private constant T24 = 0x1000000000000000000000000000000000000000000000000;uint256 private constant MASK24 = 0xffffffffffffffffffffffffffffffffffffffffffffffff;address private constant COST_ESTIMATOR_ADDRESS = 0x079d8077C465BD0BF0FC502aD2B846757e415661;function verifySingle(uint256[2] memory signature,uint256[4] memory pubkey,uint256[2] memory message,uint256 precompileGasCost) internal view returns (bool, bool) {uint256[12] memory input = [signature[0],signature[1],N_G2_X1,N_G2_X0,N_G2_Y1,N_G2_Y0,message[0],message[1],pubkey[1],pubkey[0],pubkey[3],pubkey[2]];uint256[1] memory out;
src/BNPairingPrecompileCostEstimator.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.19;contract BNPairingPrecompileCostEstimator {uint256 public baseCost;uint256 public perPairCost;uint256 private constant G1_X = 1;uint256 private constant G1_Y = 2;uint256 private constant G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;uint256 private constant G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;uint256 private constant G2_Y0 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;uint256 private constant G2_Y1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653;uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052;function run() external {_run();}function getGasCost(uint256 pairCount) external view returns (uint256) {return pairCount * perPairCost + baseCost;}function _run() internal {uint256 gasCost1Pair = _gasCost1Pair();uint256 gasCost2Pair = _gasCost2Pair();perPairCost = gasCost2Pair - gasCost1Pair;baseCost = gasCost1Pair - perPairCost;}function _gasCost1Pair() internal view returns (uint256) {uint256[6] memory input = [G1_X, G1_Y, G2_X1, G2_X0, G2_Y1, G2_Y0];uint256[1] memory out;bool callSuccess;uint256 suppliedGas = gasleft() - 2000;require(gasleft() > 2000, "BNPairingPrecompileCostEstimator: not enough gas, single pair");uint256 gasT0 = gasleft();assembly {
lib/openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)pragma solidity ^0.8.0;import "./OwnableUpgradeable.sol";import "../proxy/utils/Initializable.sol";/*** @dev Contract module which provides access control mechanism, where* there is an account (an owner) that can be granted exclusive access to* specific functions.** By default, the owner account will be the one that deploys the contract. This* can later be changed with {transferOwnership} and {acceptOwnership}.** This module is used through inheritance. It will make available all functions* from parent (Ownable).*/abstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {function __Ownable2Step_init() internal onlyInitializing {__Ownable_init_unchained();}function __Ownable2Step_init_unchained() internal onlyInitializing {}address private _pendingOwner;event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);/*** @dev Returns the address of the pending owner.*/function pendingOwner() public view virtual returns (address) {return _pendingOwner;}/*** @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.* Can only be called by the current owner.*/
lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)pragma solidity ^0.8.0;import "../utils/ContextUpgradeable.sol";import "../proxy/utils/Initializable.sol";/*** @dev Contract module which provides a basic access control mechanism, where* there is an account (an owner) that can be granted exclusive access to* specific functions.** By default, the owner account will be the one that deploys the contract. This* can later be changed with {transferOwnership}.** This module is used through inheritance. It will make available the modifier* `onlyOwner`, which can be applied to your functions to restrict their use to* the owner.*/abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {address private _owner;event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);/*** @dev Initializes the contract setting the deployer as the initial owner.*/function __Ownable_init() internal onlyInitializing {__Ownable_init_unchained();}function __Ownable_init_unchained() internal onlyInitializing {_transferOwnership(_msgSender());}/*** @dev Throws if called by any account other than the owner.*/modifier onlyOwner() {_checkOwner();
lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)pragma solidity ^0.8.2;import "../../utils/AddressUpgradeable.sol";/*** @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.** The initialization functions use a version number. Once a version number is used, it is consumed and cannot be* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in* case an upgrade adds a module that needs to be initialized.** For example:** [.hljs-theme-light.nopadding]* ```solidity* contract MyToken is ERC20Upgradeable {* function initialize() initializer public {* __ERC20_init("MyToken", "MTK");* }* }** contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {* function initializeV2() reinitializer(2) public {* __ERC20Permit_init("MyToken");* }* }* ```** TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.** CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.** [CAUTION]
lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)pragma solidity ^0.8.1;/*** @dev Collection of functions related to the address type*/library AddressUpgradeable {/*** @dev Returns true if `account` is a contract.** [IMPORTANT]* ====* It is unsafe to assume that an address for which this function returns* false is an externally-owned account (EOA) and not a contract.** Among others, `isContract` will return false for the following* types of addresses:** - an externally-owned account* - a contract in construction* - an address where a contract will be created* - an address where a contract lived, but was destroyed** Furthermore, `isContract` will also return true if the target contract within* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,* which only has an effect at the end of a transaction.* ====** [IMPORTANT]* ====* You shouldn't rely on `isContract` to protect against flash loan attacks!** Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract* constructor.* ====*/function isContract(address account) internal view returns (bool) {// This method relies on extcodesize/address.code.length, which returns 0
lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)pragma solidity ^0.8.0;import "../proxy/utils/Initializable.sol";/*** @dev Provides information about the current execution context, including the* sender of the transaction and its data. While these are generally available* via msg.sender and msg.data, they should not be accessed in such a direct* manner, since when dealing with meta-transactions the account sending and* paying for execution may not be the actual sender (as far as an application* is concerned).** This contract is only required for intermediate, library-like contracts.*/abstract contract ContextUpgradeable is Initializable {function __Context_init() internal onlyInitializing {}function __Context_init_unchained() internal onlyInitializing {}function _msgSender() internal view virtual returns (address) {return msg.sender;}function _msgData() internal view virtual returns (bytes calldata) {return msg.data;}/*** @dev This empty reserved space is put in place to allow future versions to add new* variables without shifting down storage in the inheritance chain.* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps*/uint256[50] private __gap;}
src/EnumerableSet.sol
/*** ###############################################################* this is not exact replica of OpenZepplin implementation* ###############################################################*/// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.pragma solidity 0.8.24;library EnumerableSet {struct Set {// Storage of set valuesbytes32[] _values;// Position of the value in the `values` array, plus 1 because index 0// means a value is not in the set.mapping(bytes32 => uint256) _indexes;}function _add(Set storage set, bytes32 value) private returns (bool) {if (!_contains(set, value)) {set._values.push(value);// The value is stored at length-1, but we add 1 to all indexes// and use 0 as a sentinel valueset._indexes[value] = set._values.length;return true;} else {return false;}}/*** ###################################################################################* :::: this is the new method added on top of openzepplin implementation ::::* ###################################################################################*/function _clear(Set storage set) private returns (bool) {for (uint256 i = 0; i < set._values.length; i++) {delete set._indexes[set._values[i]];
src/ISupraSValueFeed.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.19;interface ISupraSValueFeed {struct priceFeed {uint256 round;uint256 decimals;uint256 time;uint256 price;}struct derivedData {int256 roundDifference;int256 timeDifference;uint256 derivedPrice;uint256 decimals;}function restrictedSetSupraStorage(uint256 _index, bytes32 _bytes) external;function restrictedSetTimestamp(uint256 _tradingPair, uint256 timestamp) external;function getTimestamp(uint256 _tradingPair) external view returns (uint256);function getRound(uint256 _tradingPair) external view returns (uint256);function getSvalue(uint64 _pairIndex) external view returns (bytes32, bool);function getSvalues(uint64[] memory _pairIndexes) external view returns (bytes32[] memory, bool[] memory);function getDerivedSvalue(uint256 _derivedPairId) external view returns (derivedData memory);function getSvalue(uint256 _pairIndex) external view returns (priceFeed memory);function getSvalues(uint256[] memory _pairIndexes) external view returns (priceFeed[] memory);}
src/ModExp.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.19;library ModexpInverse {function run(uint256 t2) internal pure returns (uint256 t0) {// solium-disable-next-line security/no-inline-assemblyassembly {let n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47t0 := mulmod(t2, t2, n)let t5 := mulmod(t0, t2, n)let t1 := mulmod(t5, t0, n)let t3 := mulmod(t5, t5, n)let t8 := mulmod(t1, t0, n)let t4 := mulmod(t3, t5, n)let t6 := mulmod(t3, t1, n)t0 := mulmod(t3, t3, n)let t7 := mulmod(t8, t3, n)t3 := mulmod(t4, t3, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t5, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t2, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t2, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t8, n)t0 := mulmod(t0, t0, n)t0 := mulmod(t0, t0, n)
Compiler Settings
{"viaIR":true,"remappings":["ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/"],"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"optimizer":{"runs":200,"enabled":true},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"error","name":"BLSIncorrectInputMessaage","inputs":[]},{"type":"error","name":"BLSInvalidPublicKeyorSignaturePoints","inputs":[]},{"type":"error","name":"ClusterNotVerified","inputs":[]},{"type":"error","name":"DuplicateCluster","inputs":[]},{"type":"error","name":"FreeNodeIsAlreadyWhitelisted","inputs":[]},{"type":"error","name":"FreeNodeIsNotWhitelisted","inputs":[]},{"type":"error","name":"IncorrectFutureUpdate","inputs":[{"type":"uint256","name":"FutureLengthInMsecs","internalType":"uint256"}]},{"type":"error","name":"InvalidBatch","inputs":[]},{"type":"error","name":"InvalidOperation","inputs":[]},{"type":"error","name":"InvalidTransaction","inputs":[]},{"type":"event","name":"AdminChanged","inputs":[{"type":"address","name":"previousAdmin","internalType":"address","indexed":false},{"type":"address","name":"newAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"type":"address","name":"beacon","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"FreeNodeRemovedFromWhitelist","inputs":[{"type":"address","name":"freeNodeWallet","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"FreeNodeWhitelisted","inputs":[{"type":"address","name":"freeNodeWalletAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"type":"uint8","name":"version","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"event","name":"MultipleFreeNodesWhitelisted","inputs":[{"type":"address[]","name":"freeNodeWallets","internalType":"address[]","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferStarted","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"PublicKeyUpdated","inputs":[{"type":"uint256","name":"committee_id","internalType":"uint256","indexed":false},{"type":"uint256[4]","name":"publicKey","internalType":"uint256[4]","indexed":false}],"anonymous":false},{"type":"event","name":"PublicKeyUpdated","inputs":[{"type":"uint256[4]","name":"publicKey","internalType":"uint256[4]","indexed":false}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"type":"address","name":"implementation","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"TIME_DELTA_ALLOWANCE","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[4]","name":"","internalType":"uint256[4]"}],"name":"checkCommitteePublicKey","inputs":[{"type":"uint256","name":"committee_id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[4]","name":"","internalType":"uint256[4]"}],"name":"checkPublicKey","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"bytes32","name":"_domain","internalType":"bytes32"},{"type":"address","name":"_supraSValueFeedStorage","internalType":"address"},{"type":"uint256[4]","name":"_publicKey","internalType":"uint256[4]"},{"type":"uint256","name":"_blsPrecompileGasCost","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pendingOwner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"processCluster","inputs":[{"type":"tuple","name":"vote","internalType":"struct Smr.Vote","components":[{"type":"tuple","name":"smrBlock","internalType":"struct Smr.MinBlock","components":[{"type":"uint64","name":"round","internalType":"uint64"},{"type":"uint128","name":"timestamp","internalType":"uint128"},{"type":"bytes32","name":"author","internalType":"bytes32"},{"type":"bytes32","name":"qcHash","internalType":"bytes32"},{"type":"bytes32[]","name":"batchHashes","internalType":"bytes32[]"}]},{"type":"bytes8","name":"roundLE","internalType":"bytes8"}]},{"type":"tuple","name":"smrBatch","internalType":"struct Smr.MinBatch","components":[{"type":"bytes10","name":"protocol","internalType":"bytes10"},{"type":"bytes32[]","name":"txnHashes","internalType":"bytes32[]"}]},{"type":"tuple","name":"smrTxn","internalType":"struct Smr.MinTxn","components":[{"type":"bytes32[]","name":"clusterHashes","internalType":"bytes32[]"},{"type":"bytes32","name":"sender","internalType":"bytes32"},{"type":"bytes10","name":"protocol","internalType":"bytes10"},{"type":"bytes1","name":"tx_sub_type","internalType":"bytes1"}]},{"type":"bytes","name":"sccR","internalType":"bytes"},{"type":"uint256","name":"batchIdx","internalType":"uint256"},{"type":"uint256","name":"txnIdx","internalType":"uint256"},{"type":"uint256","name":"clusterIdx","internalType":"uint256"},{"type":"uint256[2]","name":"sig","internalType":"uint256[2]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"proxiableUUID","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[],"name":"requireHashVerified_V1","inputs":[{"type":"bytes","name":"_message","internalType":"bytes"},{"type":"uint256[2]","name":"_signature","internalType":"uint256[2]"}]},{"type":"function","stateMutability":"view","outputs":[],"name":"requireHashVerified_V2","inputs":[{"type":"bytes32","name":"_message","internalType":"bytes32"},{"type":"uint256[2]","name":"_signature","internalType":"uint256[2]"},{"type":"uint256","name":"committee_id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ISupraSValueFeed"}],"name":"supraSValueFeedStorage","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePublicKey","inputs":[{"type":"uint256[4]","name":"_publicKey","internalType":"uint256[4]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePublicKey","inputs":[{"type":"uint256","name":"committee_id","internalType":"uint256"},{"type":"uint256[4]","name":"_publicKey","internalType":"uint256[4]"},{"type":"bool","name":"new_committee","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"upgradeTo","inputs":[{"type":"address","name":"newImplementation","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"upgradeToAndCall","inputs":[{"type":"address","name":"newImplementation","internalType":"address"},{"type":"bytes","name":"data","internalType":"bytes"}]}]
Contract Creation Code
0x60a0806040523461003157306080526133bc908161003782396080518181816102e10152818161092e0152610a440152f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c80631f3ac958146101375780632818300e146101325780633659cfe61461012d578063371e8375146101285780634a755aec146101235780634a9c01651461011e5780634b1bcc4e146101195780634f1ef2861461011457806352d1902d1461010f5780636a4e3e391461010a578063715018a6146101055780637861c6291461010057806379ba5097146100fb5780638da5cb5b146100f65780639bb4c707146100f15780639dc2f7aa146100ec578063e30c3978146100e75763f2fde38b146100e257600080fd5b610ffa565b610fd1565b610eaf565b610db0565b610d87565b610d02565b610c81565b610b1f565b610af6565b610a31565b6108f1565b610855565b6105d6565b6105b9565b610577565b6102be565b6101dc565b610186565b600091031261014757565b600080fd5b6000915b6004831061015d57505050565b600190825181526020809101920192019190610150565b608081019291610184919061014c565b565b346101475760003660031901126101475760806040516101a58161045b565b36903760806101b26110a3565b6101bf604051809261014c565bf35b9060249160641161014757565b9060e4916101241161014757565b34610147576080366003190112610147576102626101f9366101c1565b61020f60643560005260a4602052604060002090565b6102446097546040519061023f82610231600435602083019190602083019252565b03601f1981018452836104ac565b611866565b9061025c61025660a354943690610b8a565b916110d7565b90611a6d565b15610280571561026e57005b604051632246067560e01b8152600490fd5b604051637edd58eb60e01b8152600490fd5b600435906001600160a01b038216820361014757565b602435906001600160a01b038216820361014757565b34610147576020366003190112610147576102d7610292565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691906103103084141561110a565b61032d60008051602061336783398151915293828554161461116b565b610335611f5c565b6040519061034282610476565b600082527f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561037e57505061037c9150612394565b005b6020600491604094939451928380926352d1902d60e01b825286165afa600091816103d9575b506103c65760405162461bcd60e51b8152806103c260048201611be0565b0390fd5b61037c936103d49114611b82565b612340565b6103fc91925060203d602011610403575b6103f481836104ac565b81019061148b565b90386103a4565b503d6103ea565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761043b57604052565b61040a565b60a081019081106001600160401b0382111761043b57604052565b608081019081106001600160401b0382111761043b57604052565b602081019081106001600160401b0382111761043b57604052565b606081019081106001600160401b0382111761043b57604052565b90601f801991011681019081106001600160401b0382111761043b57604052565b6040519061018482610440565b6040519061018482610420565b6040519061018082018281106001600160401b0382111761043b57604052565b6001600160401b03811161043b57601f01601f191660200190565b92919261052e82610507565b9161053c60405193846104ac565b829481845281830111610147578281602093846000960137010152565b9080601f830112156101475781602061057493359101610522565b90565b34610147576060366003190112610147576004356001600160401b038111610147576105aa61037c913690600401610559565b6105b3366101c1565b90611218565b34610147576000366003190112610147576020604051610bb88152f35b346101475760203660031901126101475760806040516105f58161045b565b36903760043560005260a460205260806101b260406000206110d7565b35906001600160801b038216820361014757565b6001600160401b03811161043b5760051b60200190565b9080601f8301121561014757602090823561065781610626565b9361066560405195866104ac565b81855260208086019260051b82010192831161014757602001905b82821061068e575050505090565b81358152908301908301610680565b35906001600160c01b03198216820361014757565b91909160408184031261014757604051906106cc82610420565b819381356001600160401b03908181116101475783019260a084840312610147576040516106f981610440565b8435838116810361014757815261071260208601610612565b6020820152604085013560408201526060850135606082015260808501359283116101475761074a610757946020969487950161063d565b608082015285520161069d565b910152565b35906001600160b01b03198216820361014757565b9190604083820312610147576040519061078a82610420565b81936107958161075c565b83526020810135916001600160401b03831161014757602092610757920161063d565b919060808382031261014757604051906107d18261045b565b819380356001600160401b038111610147576060926107f191830161063d565b8352602081013560208401526108096040820161075c565b60408401520135906001600160f81b0319821682036101475760600152565b9181601f84011215610147578235916001600160401b038311610147576020838186019501011161014757565b3461014757610120366003190112610147576001600160401b03600435818111610147576108879036906004016106b2565b6024358281116101475761089f903690600401610771565b604435838111610147576108b79036906004016107b8565b90606435938411610147576108d361037c943690600401610828565b6108df949194366101ce565b9460c4359460a43594608435946114cf565b604036600319011261014757610905610292565b6024356001600160401b03811161014757610924903690600401610559565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692919061095e3085141561110a565b61097b60008051602061336783398151915294828654161461116b565b610983611f5c565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156109b957505061037c9150612394565b6020600491604094939451928380926352d1902d60e01b825286165afa60009181610a10575b506109fd5760405162461bcd60e51b8152806103c260048201611be0565b61037c93610a0b9114611b82565b61225a565b610a2a91925060203d602011610403576103f481836104ac565b90386109df565b34610147576000366003190112610147577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610a8b576040516000805160206133678339815191528152602090f35b60405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608490fd5b3461014757600036600319011261014757609c546040516001600160a01b039091168152602090f35b3461014757600080600319360112610b8757610b39611f5c565b606580546001600160a01b031990811690915560338054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b80fd5b919060405192610b9984610420565b83906040810192831161014757905b828210610bb457505050565b8135815260209182019101610ba8565b9060405191610bd28361045b565b82608491608411610147576004905b828210610bed57505050565b8135815260209182019101610be1565b80606312156101475760405190610c138261045b565b8160c49160c411610147576044905b828210610c2f5750505090565b8135815260209182019101610c22565b80604312156101475760405190610c558261045b565b8160a49160a411610147576024905b828210610c715750505090565b8135815260209182019101610c64565b3461014757608036600319011261014757366023121561014757610ca436610bc4565b610cac611f5c565b8060005b60048110610ced576040517f2158ce0319864975538049b324ba4f745f079dd8f5e32d5923585df31d3f45239080610ce88682610174565b0390a1005b60019060208351930192816098015501610cb0565b3461014757600036600319011261014757606554336001600160a01b0390911603610d305761037c33611fb4565b60405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608490fd5b34610147576000366003190112610147576033546040516001600160a01b039091168152602090f35b346101475760e036600319011261014757610dc96102a8565b610e1f610dd536610bfd565b9160005492610dfb60ff8560081c161580958196610ea1575b8115610e81575b50611734565b83610e0e600160ff196000541617600055565b610e68575b60c43591600435611797565b610e2557005b610e3561ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498908060208101610ce8565b610e7c61010061ff00196000541617600055565b610e13565b303b15915081610e93575b5038610df5565b6001915060ff161438610e8c565b600160ff8216109150610dee565b346101475760c036600319011261014757600435610ecc36610c3f565b60a4358015908115810361014757610ee2611f5c565b80610fb5575b15610f3c575081610f2d82610f287fe3313c1ceedeed13283ec8997d7e5572bf217e813149f0be12742b5b414374299560005260a4602052604060002090565b61170f565b610ce860405192839283611804565b80610f98575b15610f865781610f8182610f287fe3313c1ceedeed13283ec8997d7e5572bf217e813149f0be12742b5b414374299560005260a4602052604060002090565b610f2d565b604051631cc6a69960e11b8152600490fd5b50610fad8260005260a4602052604060002090565b541515610f42565b50610fca8360005260a4602052604060002090565b5415610ee8565b34610147576000366003190112610147576065546040516001600160a01b039091168152602090f35b3461014757602036600319011261014757611013610292565b61101b611f5c565b606580546001600160a01b0319166001600160a01b039283169081179091556033549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700600080a3005b604051906110748261045b565b6080368337565b6040519061108882610476565b6020368337565b6040519061109c82610420565b6040368337565b6040519060986000835b600482106110c1575050506101848261045b565b60016020819285548152019301910190916110ad565b60405191906000835b600482106110f4575050506101848261045b565b60016020819285548152019301910190916110e0565b1561111157565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608490fd5b1561117257565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608490fd5b604051906111d98261045b565b6060808352366020840137565b906111f082610507565b6111fd60405191826104ac565b828152809261120e601f1991610507565b0190602036910137565b9061122861123e92609754611866565b61123660a354923690610b8a565b61025c6110a3565b15610280571561026e57565b805182101561125e5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b9080601f8301121561014757602090823561128e81610626565b9361129c60405195866104ac565b81855260208086019260051b82010192831161014757602001905b8282106112c5575050505090565b813581529083019083016112b7565b919082606091031261014757604051606081018181106001600160401b0382111761043b57604052604080829480358452602081013560208501520135910152565b906020828203126101475781356001600160401b039283821161014757019060c082820312610147576040519261134c8461045b565b823581811161014757830160a081840312610147576113696104cd565b908035825260208101358381116101475784611386918301611274565b6020830152604081013583811161014757846113a3918301611274565b6040830152606081013583811161014757846113c0918301611274565b6060830152608081013590838211610147576113de91859101611274565b6080820152845260208301359081116101475782611403836060936114189601610559565b602086015260408101356040860152016112d4565b606082015290565b634e487b7160e01b600052601160045260246000fd5b906103e89182810292818404149015171561144d57565b611420565b90610bb8820180921161144d57565b602001908160201161144d57565b906040820180921161144d57565b906004820180921161144d57565b90816020910312610147575190565b6040513d6000823e3d90fd5b9060008051602061334783398151915291820391821161144d57565b9190820391821161144d57565b98976114e39097929496939591978a611c46565b6114fc6114ef88611dcb565b916080809b51015161124a565b51036116fd5761151d9161150f84611e66565b92839160208099015161124a565b51036116eb5761154161153a8360005260a2602052604060002090565b5460ff1690565b6116d95761156c61155f6115849360005260a2602052604060002090565b805460ff19166001179055565b611577368686610522565b868151910120925161124a565b51036116c75761159691810190611316565b604080820151906115ae6115a942611436565b611452565b956000805b868651015180518210156116bb57816115cb9161124a565b516115db8260608951015161124a565b51609c546001600160a01b0316865163023c4c9f60e61b81526004808201859052918b90829060249082905afa80156116b65789918791611699575b50111561162b575050506001905b016115b3565b8b881161166657506001929161166191898961165a868b611650828d8751015161124a565b519451015161124a565b5193611ee1565b611625565b86906103c261167e8a61167842611436565b906114c2565b925192839263628c210b60e11b845283019190602083019252565b6116b091508c8d3d10610403576103f481836104ac565b38611617565b61149a565b50505050505050509050565b60405163e522226b60e01b8152600490fd5b6040516333984a1960e01b8152600490fd5b60405163280503e760e11b8152600490fd5b6040516333b094a160e01b8152600490fd5b9060005b6004811061172057505050565b600190602083519301928185015501611713565b1561173b57565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b6117b160ff60005460081c166117ac8161200a565b61200a565b6117ba33611fb4565b60975560018060a01b03166bffffffffffffffffffffffff60a01b609c541617609c5560005b600481106117ef57505060a355565b600190602083519301928160980155016117e0565b90815260a081019291610184916020019061014c565b1561182157565b60405162461bcd60e51b815260206004820152601760248201527f424c533a20626e206164642063616c6c206661696c65640000000000000000006044820152606490fd5b91909160409081805161187881610420565b36903781805161188781610420565b3690378351906118ae6118a96118a461189f85611461565b61146f565b61147d565b6111e6565b6118b66111cc565b9260005b818110611a57575060839596508101600060608201536060606182015360006062820153826063820152602095869101538460008551806118fb8186611e4f565b039060025afa156116b6576000519060428152858101908282528581019160018353604182019480865260618301908982538960008a518061193d8189611e4f565b039060025afa156116b657600051808b8a015286188352600285538087528982538960008a518061196e8189611e4f565b039060025afa156116b657899660036119a09689958c60009a8d8c519283910152189052535253855191828092611e4f565b039060025afa156116b6576080611a1a93611a116000519384606082015260018060c01b0380601883015116906000805160206133478339815191528092826048838260308901511681600160c01b80960908960151169287611a016104da565b8781520199169209088552612119565b94859351612119565b90611a23611067565b845181528185015182820152825186820152910151606082015260066107cf195a01fa8015611a55576105749061181a565bfe5b80602080928a01015160608286010152016118ba565b92610180600894604060209485611b6c9781611a876104e7565b95805187520151828601527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2848601527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608601527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec60808601527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60a0860152805160c0860152015160e084015285810151610100840152805161012084015260608101516101408401520151610160820152611b6461107b565b958693fa1590565b611b795751151590600190565b50600090600090565b15611b8957565b60405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608490fd5b60809060208152602e60208201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960408201526d6f6e206973206e6f74205555505360901b60608201520190565b906040519160208301526020825261018482610420565b611d46611d52608083510151611d2160206040519283611c698382018093611d9e565b0393611c7d601f19958681018352826104ac565b5190208651611d0e611c9682516001600160401b031690565b92611d02611cad868501516001600160801b031690565b91606060408601519501516040519586948986019889939160789593916001600160401b0360c01b9060c01b1685526001600160801b03199060801b1660088501526018840152603883015260588201520190565b038681018352826104ac565b5190209501516001600160c01b03191690565b60408051602081019687526001600160c01b0319909216908201529283906048820190565b039081018352826104ac565b51902090611d6d61153a8360005260a1602052604060002090565b611d9a5781611d8a61155f92611d8561018495611c2f565b611218565b60005260a1602052604060002090565b5050565b805160208092019160005b828110611db7575050505090565b835185529381019392810192600101611da9565b6020810151604051611df381611de5602082018095611d9e565b03601f1981018352826104ac565b5190209069ffffffffffffffffffff60b01b905116906040519060208201928352602a820152602a8152611e2681610491565b51902090565b60005b838110611e3f5750506000910152565b8181015183820152602001611e2f565b90611e6260209282815194859201611e2c565b0190565b805190611e26604b604051611e8381611de5602082018098611d9e565b602084015169ffffffffffffffffffff60b01b60408601511694606060ff60f81b91015116604051958693611ec160208601998a9251928391611e2c565b84019260208401526040830152604a82015203602b8101845201826104ac565b609c5491946001600160a01b03909216939192843b156101475760009460449386926040519889978896635f6ce8c360e11b8852600488015260181b9260781b9160b81b9060c01b17171760248401525af180156116b657611f405750565b6001600160401b03811161043b5780610184916040528061013c565b6033546001600160a01b03163303611f7057565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6bffffffffffffffffffffffff60a01b90816065541660655560335460018060a01b038092168093821617603355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b1561201157565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b1561207157565b60405162461bcd60e51b815260206004820152602360248201527f6d6170546f506f696e7446543a20696e76616c6964206669656c6420656c656d604482015262195b9d60ea1b6064820152608490fd5b156120c957565b60405162461bcd60e51b815260206004820152602260248201527f424c533a20626164206674206d617070696e6720696d706c656d656e7461746960448201526137b760f11b6064820152608490fd5b61212161108f565b506000805160206133478339815191529061213d82821061206a565b8161214782612424565b9290508161218e81806004818680090893818077b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd830961218182888309612b62565b97818992090990096114a6565b7759e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe086121bb8560038184818180090908612424565b81906122455750508460016121d092086114a6565b6121e38560038184818180090908612424565b81906122455750505060018483816122109581808781980980090909089260038185818180090908612424565b9161221b82936120c2565b15612235575b5061222a6104da565b918252602082015290565b61223f91506114a6565b38612221565b9350939150935015612235575061222a6104da565b9061226482612394565b60006001600160a01b0383167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8280a2815115801590612338575b6122a857505050565b61232c928180604051946122bb86610491565b602786527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c6020870152660819985a5b195960ca1b6040870152602081519101845af4903d1561232f573d61230f81610507565b9061231d60405192836104ac565b8152809360203d92013e6132d5565b50565b606092506132d5565b50600161229f565b9061234a82612394565b60006001600160a01b0383167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8280a281511580159061238d576122a857505050565b508061229f565b803b156123c95760008051602061336783398151915280546001600160a01b0319166001600160a01b03909216919091179055565b60405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b906000805160206133478339815191528080808080808080808b8180808080808080808080808080808f8180828180808080808080808080809e8180808080858180808080808087819e8280808080808681808080808080809e818080808481808080808080808089819f828080808080808080808080808d819e8280808080808080888180808080809e8180808080808080808981808080809e81808080808080808080808b8180809e81808080808080808080808b8180809e818080808080808080808a818080809e8180808080808087818080808080809e8180808080808681808080808080809e8180808080808681808080808080809e8180808080808681808080808080809e8180808080808080808080808c81809e81808080808080808080808b8180809e8180808080808087818080808080809e81808080808080809781808080808581808080808080808080808b8181800909818c81818009090981808c8181800909818d818180090909098180808c8181800909818d818180090909818c818082818180090991818180090909090980098009800981808781818009099180090980098009800909800980098009800909800980098009800981808c8180828009918180828009918181800909090991800909800980098009800981808088800981808a8009818b8181800909090991800909800980098009098009800980098180808a800981808c8009818d8181800909090991800909800980098009800980090980098009800981808c8181800909918009098009800980098009800980099281808083818180090981848181800909099181808280099181808280099181818009090909099180090980098009800980098009800980098009800981808d818082800991818180090909918009098009800980098180898181800909918009098009800980099281808280099181808280099181818009090909918009098009800980098009800980098180808b8009818c8181800909099180090980098009800980098009800909800980098009800980098009818080808c8009818d818180090909818c81808281818009099181818009090909918009098009800980098009928180808381818009098184818180090909918180828009918180828009918181800909090909918009098009800981808d818082800991818180090909918009098009800980098009800980098009928181800909918009098009800980098009800980098009800992818082800991818180090909918009098009800981808d818180090991800909800980098009800980098009800992818080838009818481818009090991818082818180090991818180090909099180090980098009800981808d81808083800981848181800909099181808281818009099181818009090909918009098009800980098009818080898009818a8181800909099180090980098009928180828009918180828009918181800909090991800909800980098009800980098009800980098009818080808b8009818c81818009090981808c8181800909818d81818009090909918009098009800980099281808280099181818009090991800909800980098009800981808d81808281818009099181808281818009099181818009090909918009098009800980098009800980098180808088800981898181800909098180898181800909818a81818009090909918009098009800909800980098009800980098009928180828009918180828009918181800909090991800909800980098009800980098180808c8009818d8180828009918181800909090991800909800980098009800981808087800981888181800909099180090980098009098009800980098009800980099281808083818180090981848181800909099181808280099181808280099181818009090909099180090980098009800980098009818080808b8181800909818c81818009090981808c8181800909818d818082818180090991818180090909090991800909800980098009800980090980098009800980098009800909800980098009800992818180090991800909800980098009800980098009800980098180808c818082800991818180090909818d8180828181800909918181800909090991800909800980098180888181800909918009098009800992818180090991800909800980098009800980098009800981808d8180808381818009098184818180090909918180828181800909918180828181800909918181800909090909918009098009800980098180808a818180090981808c8181800909818d818180090909099180090980098009800992818080838181800909818481818009090991818082818180090991818082818180090991818180090909090991800909800980098180808c8009818d8181800909099180090980098009800980098180808781818009098180898181800909818a81818009090909918009098009916000805160206133478339815191528380091490565b80600080516020613347833981519152808080808080808881808080809e8180808080808080808981808080809e8180808080808080888180808080809e8180808080808080888180808080809e8181818080808080808781808080809e8180808080808087818080808080809e8180828180808080808080808080809e8180828180808080808080808981809e818080808080808080808080808d819e8280808080808080808080808080809e8082808080808080808080808080809e80828080808080808080808080808d819f828080808080808080808a818080809e8180808080808080808981808080809e8180808080808080808981808080809e8180808080808080808981808080809e8180808080808080808080808080809e80828080808080808080808080808d819f8280808080808080808981808080809e818080808080808080809981808080808581808080808080808080808b8181800909818c81818009090981808c8181800909818d818180090909098180808c8181800909818d818180090909818c818082818180090991818180090909090980098009800981808781818009099180090980098009800909800980098009800909800980098009800981808c8180828009918180828009918181800909090991800909800980098009800981808088800981808a8009818b8181800909090991800909800980098009098009800980098180808a800981808c8009818d8181800909090991800909800980098009800980090980098009800981808c8181800909918009098009800980098009800980099281808083818180090981848181800909099181808280099181808280099181818009090909099180090980098009800980098009800980098009800981808d818082800991818180090909918009098009800980098180898181800909918009098009800980099281808280099181808280099181818009090909918009098009800980098009800980098180808b8009818c8181800909099180090980098009800980098009800909800980098009800980098009818080808c8009818d818180090909818c81808281818009099181818009090909918009098009800980098009928180808381818009098184818180090909918180828009918180828009918181800909090909918009098009800981808d818082800991818180090909918009098009800980098009800980098009928181800909918009098009800980098009800980098009800992818082800991818180090909918009098009800981808d818180090991800909800980098009800980098009800992818080838009818481818009090991818082818180090991818180090909099180090980098009800981808d81808083800981848181800909099181808281818009099181818009090909918009098009800980098009818080898009818a8181800909099180090980098009928180828009918180828009918181800909090991800909800980098009800980098009800980098009818080808b8009818c81818009090981808c8181800909818d81818009090909918009098009800980099281808280099181818009090991800909800980098009800981808d81808281818009099181808281818009099181818009090909918009098009800980098009800980098180808088800981898181800909098180898181800909818a81818009090909918009098009800909800980098009800980098009928180828009918180828009918181800909090991800909800980098009800980098180808c8009818d8180828009918181800909090991800909800980098009800981808087800981888181800909099180090980098009098009800980098009800980099281808083818180090981848181800909099181808280099181808280099181818009090909099180090980098009800980098009818080808b8181800909818c81818009090981808c8181800909818d81808281818009099181818009090909099180090980098009800980098009098009800980098009800980090980098009800980099281818009099180090980098009800980098009800980098009818080808a8009818b81818009090981808b8181800909818c818180090909099180090980098009928181800909918009098009800981808d81818009099180090980098009800980098009800980099281808083818180090981848181800909099181808281818009099181808281818009099181818009090909099180090980098009800981808d8180828181800909918180828181800909918181800909090991800909800980098009818080808b8181800909818c81818009090981808c8181800909818d81808281818009099181818009090909099180090980098009818080878009818881818009090991800909800980090980098009800980098009928180828009918181800909099180090990565b1561329057565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b919290156132f557508151156132e9575090565b610574903b1515613289565b8251909150156133085750805190602001fd5b6044604051809262461bcd60e51b8252602060048301526133388151809281602486015260208686019101611e2c565b601f01601f19168101030190fdfe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212204b8c7c853f358b9f182b39c479913830f1611e440fda4479d76f2caeddd0bc6264736f6c63430008180033
Deployed ByteCode
0x6080604052600436101561001257600080fd5b60003560e01c80631f3ac958146101375780632818300e146101325780633659cfe61461012d578063371e8375146101285780634a755aec146101235780634a9c01651461011e5780634b1bcc4e146101195780634f1ef2861461011457806352d1902d1461010f5780636a4e3e391461010a578063715018a6146101055780637861c6291461010057806379ba5097146100fb5780638da5cb5b146100f65780639bb4c707146100f15780639dc2f7aa146100ec578063e30c3978146100e75763f2fde38b146100e257600080fd5b610ffa565b610fd1565b610eaf565b610db0565b610d87565b610d02565b610c81565b610b1f565b610af6565b610a31565b6108f1565b610855565b6105d6565b6105b9565b610577565b6102be565b6101dc565b610186565b600091031261014757565b600080fd5b6000915b6004831061015d57505050565b600190825181526020809101920192019190610150565b608081019291610184919061014c565b565b346101475760003660031901126101475760806040516101a58161045b565b36903760806101b26110a3565b6101bf604051809261014c565bf35b9060249160641161014757565b9060e4916101241161014757565b34610147576080366003190112610147576102626101f9366101c1565b61020f60643560005260a4602052604060002090565b6102446097546040519061023f82610231600435602083019190602083019252565b03601f1981018452836104ac565b611866565b9061025c61025660a354943690610b8a565b916110d7565b90611a6d565b15610280571561026e57005b604051632246067560e01b8152600490fd5b604051637edd58eb60e01b8152600490fd5b600435906001600160a01b038216820361014757565b602435906001600160a01b038216820361014757565b34610147576020366003190112610147576102d7610292565b6001600160a01b037f0000000000000000000000000993b350dd286fa05ad42f1e2ecdeb007a72eefc811691906103103084141561110a565b61032d60008051602061336783398151915293828554161461116b565b610335611f5c565b6040519061034282610476565b600082527f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561037e57505061037c9150612394565b005b6020600491604094939451928380926352d1902d60e01b825286165afa600091816103d9575b506103c65760405162461bcd60e51b8152806103c260048201611be0565b0390fd5b61037c936103d49114611b82565b612340565b6103fc91925060203d602011610403575b6103f481836104ac565b81019061148b565b90386103a4565b503d6103ea565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761043b57604052565b61040a565b60a081019081106001600160401b0382111761043b57604052565b608081019081106001600160401b0382111761043b57604052565b602081019081106001600160401b0382111761043b57604052565b606081019081106001600160401b0382111761043b57604052565b90601f801991011681019081106001600160401b0382111761043b57604052565b6040519061018482610440565b6040519061018482610420565b6040519061018082018281106001600160401b0382111761043b57604052565b6001600160401b03811161043b57601f01601f191660200190565b92919261052e82610507565b9161053c60405193846104ac565b829481845281830111610147578281602093846000960137010152565b9080601f830112156101475781602061057493359101610522565b90565b34610147576060366003190112610147576004356001600160401b038111610147576105aa61037c913690600401610559565b6105b3366101c1565b90611218565b34610147576000366003190112610147576020604051610bb88152f35b346101475760203660031901126101475760806040516105f58161045b565b36903760043560005260a460205260806101b260406000206110d7565b35906001600160801b038216820361014757565b6001600160401b03811161043b5760051b60200190565b9080601f8301121561014757602090823561065781610626565b9361066560405195866104ac565b81855260208086019260051b82010192831161014757602001905b82821061068e575050505090565b81358152908301908301610680565b35906001600160c01b03198216820361014757565b91909160408184031261014757604051906106cc82610420565b819381356001600160401b03908181116101475783019260a084840312610147576040516106f981610440565b8435838116810361014757815261071260208601610612565b6020820152604085013560408201526060850135606082015260808501359283116101475761074a610757946020969487950161063d565b608082015285520161069d565b910152565b35906001600160b01b03198216820361014757565b9190604083820312610147576040519061078a82610420565b81936107958161075c565b83526020810135916001600160401b03831161014757602092610757920161063d565b919060808382031261014757604051906107d18261045b565b819380356001600160401b038111610147576060926107f191830161063d565b8352602081013560208401526108096040820161075c565b60408401520135906001600160f81b0319821682036101475760600152565b9181601f84011215610147578235916001600160401b038311610147576020838186019501011161014757565b3461014757610120366003190112610147576001600160401b03600435818111610147576108879036906004016106b2565b6024358281116101475761089f903690600401610771565b604435838111610147576108b79036906004016107b8565b90606435938411610147576108d361037c943690600401610828565b6108df949194366101ce565b9460c4359460a43594608435946114cf565b604036600319011261014757610905610292565b6024356001600160401b03811161014757610924903690600401610559565b6001600160a01b037f0000000000000000000000000993b350dd286fa05ad42f1e2ecdeb007a72eefc811692919061095e3085141561110a565b61097b60008051602061336783398151915294828654161461116b565b610983611f5c565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156109b957505061037c9150612394565b6020600491604094939451928380926352d1902d60e01b825286165afa60009181610a10575b506109fd5760405162461bcd60e51b8152806103c260048201611be0565b61037c93610a0b9114611b82565b61225a565b610a2a91925060203d602011610403576103f481836104ac565b90386109df565b34610147576000366003190112610147577f0000000000000000000000000993b350dd286fa05ad42f1e2ecdeb007a72eefc6001600160a01b03163003610a8b576040516000805160206133678339815191528152602090f35b60405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608490fd5b3461014757600036600319011261014757609c546040516001600160a01b039091168152602090f35b3461014757600080600319360112610b8757610b39611f5c565b606580546001600160a01b031990811690915560338054918216905581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b80fd5b919060405192610b9984610420565b83906040810192831161014757905b828210610bb457505050565b8135815260209182019101610ba8565b9060405191610bd28361045b565b82608491608411610147576004905b828210610bed57505050565b8135815260209182019101610be1565b80606312156101475760405190610c138261045b565b8160c49160c411610147576044905b828210610c2f5750505090565b8135815260209182019101610c22565b80604312156101475760405190610c558261045b565b8160a49160a411610147576024905b828210610c715750505090565b8135815260209182019101610c64565b3461014757608036600319011261014757366023121561014757610ca436610bc4565b610cac611f5c565b8060005b60048110610ced576040517f2158ce0319864975538049b324ba4f745f079dd8f5e32d5923585df31d3f45239080610ce88682610174565b0390a1005b60019060208351930192816098015501610cb0565b3461014757600036600319011261014757606554336001600160a01b0390911603610d305761037c33611fb4565b60405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608490fd5b34610147576000366003190112610147576033546040516001600160a01b039091168152602090f35b346101475760e036600319011261014757610dc96102a8565b610e1f610dd536610bfd565b9160005492610dfb60ff8560081c161580958196610ea1575b8115610e81575b50611734565b83610e0e600160ff196000541617600055565b610e68575b60c43591600435611797565b610e2557005b610e3561ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498908060208101610ce8565b610e7c61010061ff00196000541617600055565b610e13565b303b15915081610e93575b5038610df5565b6001915060ff161438610e8c565b600160ff8216109150610dee565b346101475760c036600319011261014757600435610ecc36610c3f565b60a4358015908115810361014757610ee2611f5c565b80610fb5575b15610f3c575081610f2d82610f287fe3313c1ceedeed13283ec8997d7e5572bf217e813149f0be12742b5b414374299560005260a4602052604060002090565b61170f565b610ce860405192839283611804565b80610f98575b15610f865781610f8182610f287fe3313c1ceedeed13283ec8997d7e5572bf217e813149f0be12742b5b414374299560005260a4602052604060002090565b610f2d565b604051631cc6a69960e11b8152600490fd5b50610fad8260005260a4602052604060002090565b541515610f42565b50610fca8360005260a4602052604060002090565b5415610ee8565b34610147576000366003190112610147576065546040516001600160a01b039091168152602090f35b3461014757602036600319011261014757611013610292565b61101b611f5c565b606580546001600160a01b0319166001600160a01b039283169081179091556033549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700600080a3005b604051906110748261045b565b6080368337565b6040519061108882610476565b6020368337565b6040519061109c82610420565b6040368337565b6040519060986000835b600482106110c1575050506101848261045b565b60016020819285548152019301910190916110ad565b60405191906000835b600482106110f4575050506101848261045b565b60016020819285548152019301910190916110e0565b1561111157565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608490fd5b1561117257565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608490fd5b604051906111d98261045b565b6060808352366020840137565b906111f082610507565b6111fd60405191826104ac565b828152809261120e601f1991610507565b0190602036910137565b9061122861123e92609754611866565b61123660a354923690610b8a565b61025c6110a3565b15610280571561026e57565b805182101561125e5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b9080601f8301121561014757602090823561128e81610626565b9361129c60405195866104ac565b81855260208086019260051b82010192831161014757602001905b8282106112c5575050505090565b813581529083019083016112b7565b919082606091031261014757604051606081018181106001600160401b0382111761043b57604052604080829480358452602081013560208501520135910152565b906020828203126101475781356001600160401b039283821161014757019060c082820312610147576040519261134c8461045b565b823581811161014757830160a081840312610147576113696104cd565b908035825260208101358381116101475784611386918301611274565b6020830152604081013583811161014757846113a3918301611274565b6040830152606081013583811161014757846113c0918301611274565b6060830152608081013590838211610147576113de91859101611274565b6080820152845260208301359081116101475782611403836060936114189601610559565b602086015260408101356040860152016112d4565b606082015290565b634e487b7160e01b600052601160045260246000fd5b906103e89182810292818404149015171561144d57565b611420565b90610bb8820180921161144d57565b602001908160201161144d57565b906040820180921161144d57565b906004820180921161144d57565b90816020910312610147575190565b6040513d6000823e3d90fd5b9060008051602061334783398151915291820391821161144d57565b9190820391821161144d57565b98976114e39097929496939591978a611c46565b6114fc6114ef88611dcb565b916080809b51015161124a565b51036116fd5761151d9161150f84611e66565b92839160208099015161124a565b51036116eb5761154161153a8360005260a2602052604060002090565b5460ff1690565b6116d95761156c61155f6115849360005260a2602052604060002090565b805460ff19166001179055565b611577368686610522565b868151910120925161124a565b51036116c75761159691810190611316565b604080820151906115ae6115a942611436565b611452565b956000805b868651015180518210156116bb57816115cb9161124a565b516115db8260608951015161124a565b51609c546001600160a01b0316865163023c4c9f60e61b81526004808201859052918b90829060249082905afa80156116b65789918791611699575b50111561162b575050506001905b016115b3565b8b881161166657506001929161166191898961165a868b611650828d8751015161124a565b519451015161124a565b5193611ee1565b611625565b86906103c261167e8a61167842611436565b906114c2565b925192839263628c210b60e11b845283019190602083019252565b6116b091508c8d3d10610403576103f481836104ac565b38611617565b61149a565b50505050505050509050565b60405163e522226b60e01b8152600490fd5b6040516333984a1960e01b8152600490fd5b60405163280503e760e11b8152600490fd5b6040516333b094a160e01b8152600490fd5b9060005b6004811061172057505050565b600190602083519301928185015501611713565b1561173b57565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b6117b160ff60005460081c166117ac8161200a565b61200a565b6117ba33611fb4565b60975560018060a01b03166bffffffffffffffffffffffff60a01b609c541617609c5560005b600481106117ef57505060a355565b600190602083519301928160980155016117e0565b90815260a081019291610184916020019061014c565b1561182157565b60405162461bcd60e51b815260206004820152601760248201527f424c533a20626e206164642063616c6c206661696c65640000000000000000006044820152606490fd5b91909160409081805161187881610420565b36903781805161188781610420565b3690378351906118ae6118a96118a461189f85611461565b61146f565b61147d565b6111e6565b6118b66111cc565b9260005b818110611a57575060839596508101600060608201536060606182015360006062820153826063820152602095869101538460008551806118fb8186611e4f565b039060025afa156116b6576000519060428152858101908282528581019160018353604182019480865260618301908982538960008a518061193d8189611e4f565b039060025afa156116b657600051808b8a015286188352600285538087528982538960008a518061196e8189611e4f565b039060025afa156116b657899660036119a09689958c60009a8d8c519283910152189052535253855191828092611e4f565b039060025afa156116b6576080611a1a93611a116000519384606082015260018060c01b0380601883015116906000805160206133478339815191528092826048838260308901511681600160c01b80960908960151169287611a016104da565b8781520199169209088552612119565b94859351612119565b90611a23611067565b845181528185015182820152825186820152910151606082015260066107cf195a01fa8015611a55576105749061181a565bfe5b80602080928a01015160608286010152016118ba565b92610180600894604060209485611b6c9781611a876104e7565b95805187520151828601527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2848601527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608601527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec60808601527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60a0860152805160c0860152015160e084015285810151610100840152805161012084015260608101516101408401520151610160820152611b6461107b565b958693fa1590565b611b795751151590600190565b50600090600090565b15611b8957565b60405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608490fd5b60809060208152602e60208201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960408201526d6f6e206973206e6f74205555505360901b60608201520190565b906040519160208301526020825261018482610420565b611d46611d52608083510151611d2160206040519283611c698382018093611d9e565b0393611c7d601f19958681018352826104ac565b5190208651611d0e611c9682516001600160401b031690565b92611d02611cad868501516001600160801b031690565b91606060408601519501516040519586948986019889939160789593916001600160401b0360c01b9060c01b1685526001600160801b03199060801b1660088501526018840152603883015260588201520190565b038681018352826104ac565b5190209501516001600160c01b03191690565b60408051602081019687526001600160c01b0319909216908201529283906048820190565b039081018352826104ac565b51902090611d6d61153a8360005260a1602052604060002090565b611d9a5781611d8a61155f92611d8561018495611c2f565b611218565b60005260a1602052604060002090565b5050565b805160208092019160005b828110611db7575050505090565b835185529381019392810192600101611da9565b6020810151604051611df381611de5602082018095611d9e565b03601f1981018352826104ac565b5190209069ffffffffffffffffffff60b01b905116906040519060208201928352602a820152602a8152611e2681610491565b51902090565b60005b838110611e3f5750506000910152565b8181015183820152602001611e2f565b90611e6260209282815194859201611e2c565b0190565b805190611e26604b604051611e8381611de5602082018098611d9e565b602084015169ffffffffffffffffffff60b01b60408601511694606060ff60f81b91015116604051958693611ec160208601998a9251928391611e2c565b84019260208401526040830152604a82015203602b8101845201826104ac565b609c5491946001600160a01b03909216939192843b156101475760009460449386926040519889978896635f6ce8c360e11b8852600488015260181b9260781b9160b81b9060c01b17171760248401525af180156116b657611f405750565b6001600160401b03811161043b5780610184916040528061013c565b6033546001600160a01b03163303611f7057565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6bffffffffffffffffffffffff60a01b90816065541660655560335460018060a01b038092168093821617603355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b1561201157565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b1561207157565b60405162461bcd60e51b815260206004820152602360248201527f6d6170546f506f696e7446543a20696e76616c6964206669656c6420656c656d604482015262195b9d60ea1b6064820152608490fd5b156120c957565b60405162461bcd60e51b815260206004820152602260248201527f424c533a20626164206674206d617070696e6720696d706c656d656e7461746960448201526137b760f11b6064820152608490fd5b61212161108f565b506000805160206133478339815191529061213d82821061206a565b8161214782612424565b9290508161218e81806004818680090893818077b3c4d79d41a91759a9e4c7e359b6b89eaec68e62effffffd830961218182888309612b62565b97818992090990096114a6565b7759e26bcea0d48bacd4f263f1acdb5c4f5763473177fffffe086121bb8560038184818180090908612424565b81906122455750508460016121d092086114a6565b6121e38560038184818180090908612424565b81906122455750505060018483816122109581808781980980090909089260038185818180090908612424565b9161221b82936120c2565b15612235575b5061222a6104da565b918252602082015290565b61223f91506114a6565b38612221565b9350939150935015612235575061222a6104da565b9061226482612394565b60006001600160a01b0383167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8280a2815115801590612338575b6122a857505050565b61232c928180604051946122bb86610491565b602786527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c6020870152660819985a5b195960ca1b6040870152602081519101845af4903d1561232f573d61230f81610507565b9061231d60405192836104ac565b8152809360203d92013e6132d5565b50565b606092506132d5565b50600161229f565b9061234a82612394565b60006001600160a01b0383167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8280a281511580159061238d576122a857505050565b508061229f565b803b156123c95760008051602061336783398151915280546001600160a01b0319166001600160a01b03909216919091179055565b60405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b906000805160206133478339815191528080808080808080808b8180808080808080808080808080808f8180828180808080808080808080809e8180808080858180808080808087819e8280808080808681808080808080809e818080808481808080808080808089819f828080808080808080808080808d819e8280808080808080888180808080809e8180808080808080808981808080809e81808080808080808080808b8180809e81808080808080808080808b8180809e818080808080808080808a818080809e8180808080808087818080808080809e8180808080808681808080808080809e8180808080808681808080808080809e8180808080808681808080808080809e8180808080808080808080808c81809e81808080808080808080808b8180809e8180808080808087818080808080809e81808080808080809781808080808581808080808080808080808b8181800909818c81818009090981808c8181800909818d818180090909098180808c8181800909818d818180090909818c818082818180090991818180090909090980098009800981808781818009099180090980098009800909800980098009800909800980098009800981808c8180828009918180828009918181800909090991800909800980098009800981808088800981808a8009818b8181800909090991800909800980098009098009800980098180808a800981808c8009818d8181800909090991800909800980098009800980090980098009800981808c8181800909918009098009800980098009800980099281808083818180090981848181800909099181808280099181808280099181818009090909099180090980098009800980098009800980098009800981808d818082800991818180090909918009098009800980098180898181800909918009098009800980099281808280099181808280099181818009090909918009098009800980098009800980098180808b8009818c8181800909099180090980098009800980098009800909800980098009800980098009818080808c8009818d818180090909818c81808281818009099181818009090909918009098009800980098009928180808381818009098184818180090909918180828009918180828009918181800909090909918009098009800981808d818082800991818180090909918009098009800980098009800980098009928181800909918009098009800980098009800980098009800992818082800991818180090909918009098009800981808d818180090991800909800980098009800980098009800992818080838009818481818009090991818082818180090991818180090909099180090980098009800981808d81808083800981848181800909099181808281818009099181818009090909918009098009800980098009818080898009818a8181800909099180090980098009928180828009918180828009918181800909090991800909800980098009800980098009800980098009818080808b8009818c81818009090981808c8181800909818d81818009090909918009098009800980099281808280099181818009090991800909800980098009800981808d81808281818009099181808281818009099181818009090909918009098009800980098009800980098180808088800981898181800909098180898181800909818a81818009090909918009098009800909800980098009800980098009928180828009918180828009918181800909090991800909800980098009800980098180808c8009818d8180828009918181800909090991800909800980098009800981808087800981888181800909099180090980098009098009800980098009800980099281808083818180090981848181800909099181808280099181808280099181818009090909099180090980098009800980098009818080808b8181800909818c81818009090981808c8181800909818d818082818180090991818180090909090991800909800980098009800980090980098009800980098009800909800980098009800992818180090991800909800980098009800980098009800980098180808c818082800991818180090909818d8180828181800909918181800909090991800909800980098180888181800909918009098009800992818180090991800909800980098009800980098009800981808d8180808381818009098184818180090909918180828181800909918180828181800909918181800909090909918009098009800980098180808a818180090981808c8181800909818d818180090909099180090980098009800992818080838181800909818481818009090991818082818180090991818082818180090991818180090909090991800909800980098180808c8009818d8181800909099180090980098009800980098180808781818009098180898181800909818a81818009090909918009098009916000805160206133478339815191528380091490565b80600080516020613347833981519152808080808080808881808080809e8180808080808080808981808080809e8180808080808080888180808080809e8180808080808080888180808080809e8181818080808080808781808080809e8180808080808087818080808080809e8180828180808080808080808080809e8180828180808080808080808981809e818080808080808080808080808d819e8280808080808080808080808080809e8082808080808080808080808080809e80828080808080808080808080808d819f828080808080808080808a818080809e8180808080808080808981808080809e8180808080808080808981808080809e8180808080808080808981808080809e8180808080808080808080808080809e80828080808080808080808080808d819f8280808080808080808981808080809e818080808080808080809981808080808581808080808080808080808b8181800909818c81818009090981808c8181800909818d818180090909098180808c8181800909818d818180090909818c818082818180090991818180090909090980098009800981808781818009099180090980098009800909800980098009800909800980098009800981808c8180828009918180828009918181800909090991800909800980098009800981808088800981808a8009818b8181800909090991800909800980098009098009800980098180808a800981808c8009818d8181800909090991800909800980098009800980090980098009800981808c8181800909918009098009800980098009800980099281808083818180090981848181800909099181808280099181808280099181818009090909099180090980098009800980098009800980098009800981808d818082800991818180090909918009098009800980098180898181800909918009098009800980099281808280099181808280099181818009090909918009098009800980098009800980098180808b8009818c8181800909099180090980098009800980098009800909800980098009800980098009818080808c8009818d818180090909818c81808281818009099181818009090909918009098009800980098009928180808381818009098184818180090909918180828009918180828009918181800909090909918009098009800981808d818082800991818180090909918009098009800980098009800980098009928181800909918009098009800980098009800980098009800992818082800991818180090909918009098009800981808d818180090991800909800980098009800980098009800992818080838009818481818009090991818082818180090991818180090909099180090980098009800981808d81808083800981848181800909099181808281818009099181818009090909918009098009800980098009818080898009818a8181800909099180090980098009928180828009918180828009918181800909090991800909800980098009800980098009800980098009818080808b8009818c81818009090981808c8181800909818d81818009090909918009098009800980099281808280099181818009090991800909800980098009800981808d81808281818009099181808281818009099181818009090909918009098009800980098009800980098180808088800981898181800909098180898181800909818a81818009090909918009098009800909800980098009800980098009928180828009918180828009918181800909090991800909800980098009800980098180808c8009818d8180828009918181800909090991800909800980098009800981808087800981888181800909099180090980098009098009800980098009800980099281808083818180090981848181800909099181808280099181808280099181818009090909099180090980098009800980098009818080808b8181800909818c81818009090981808c8181800909818d81808281818009099181818009090909099180090980098009800980098009098009800980098009800980090980098009800980099281818009099180090980098009800980098009800980098009818080808a8009818b81818009090981808b8181800909818c818180090909099180090980098009928181800909918009098009800981808d81818009099180090980098009800980098009800980099281808083818180090981848181800909099181808281818009099181808281818009099181818009090909099180090980098009800981808d8180828181800909918180828181800909918181800909090991800909800980098009818080808b8181800909818c81818009090981808c8181800909818d81808281818009099181818009090909099180090980098009818080878009818881818009090991800909800980090980098009800980098009928180828009918181800909099180090990565b1561329057565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b919290156132f557508151156132e9575090565b610574903b1515613289565b8251909150156133085750805190602001fd5b6044604051809262461bcd60e51b8252602060048301526133388151809281602486015260208686019101611e2c565b601f01601f19168101030190fdfe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212204b8c7c853f358b9f182b39c479913830f1611e440fda4479d76f2caeddd0bc6264736f6c63430008180033