Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Timelock
- Optimization enabled
- false
- Compiler version
- v0.8.10+commit.fc410830
- EVM Version
- default
- Verified at
- 2023-10-23T20:12:19.583778Z
Constructor Arguments
000000000000000000000000f33da2a3fd5e02ad8005cec0a6d3679959e75e5d000000000000000000000000000000000000000000000000000000000002a300
Arg [0] (address) : 0xf33da2a3fd5e02ad8005cec0a6d3679959e75e5d
Arg [1] (uint256) : 172800
Contract source code
// Sources flattened with hardhat v2.9.1 https://hardhat.org // File contracts/governance/libraries/SafeMath.sol pragma solidity ^0.8.10; // From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol // Subject to the MIT license. /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c; unchecked { c = a + b; } require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { uint256 c; unchecked { c = a + b; } require(c >= a, errorMessage); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction underflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c; unchecked { c = a * b; } require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c; unchecked { c = a * b; } require(c / a == b, errorMessage); return c; } /** * @dev Returns the integer division of two unsigned integers. * Reverts on division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. * Reverts with custom message on division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File contracts/governance/Timelock.sol // SPDX-License-Identifier: BSD-3-Clause pragma solidity ^0.8.10; contract Timelock { using SafeMath for uint; event NewAdmin(address indexed newAdmin); event NewPendingAdmin(address indexed newPendingAdmin); event NewDelay(uint indexed newDelay); event CancelTransaction( bytes32 indexed txHash, address indexed target, uint value, string signature, bytes data, uint eta ); event ExecuteTransaction( bytes32 indexed txHash, address indexed target, uint value, string signature, bytes data, uint eta ); event QueueTransaction( bytes32 indexed txHash, address indexed target, uint value, string signature, bytes data, uint eta ); uint public constant GRACE_PERIOD = 14 days; uint public constant MINIMUM_DELAY = 2 days; uint public constant MAXIMUM_DELAY = 30 days; address public admin; address public pendingAdmin; uint public delay; mapping(bytes32 => bool) public queuedTransactions; constructor(address admin_, uint delay_) { require( delay_ >= MINIMUM_DELAY, "Timelock::constructor: Delay must exceed minimum delay." ); require( delay_ <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay." ); admin = admin_; delay = delay_; } fallback() external payable {} function setDelay(uint delay_) public { require( msg.sender == address(this), "Timelock::setDelay: Call must come from Timelock." ); require( delay_ >= MINIMUM_DELAY, "Timelock::setDelay: Delay must exceed minimum delay." ); require( delay_ <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay." ); delay = delay_; emit NewDelay(delay); } function acceptAdmin() public { require( msg.sender == pendingAdmin, "Timelock::acceptAdmin: Call must come from pendingAdmin." ); admin = msg.sender; pendingAdmin = address(0); emit NewAdmin(admin); } function setPendingAdmin(address pendingAdmin_) public { require( msg.sender == address(this), "Timelock::setPendingAdmin: Call must come from Timelock." ); pendingAdmin = pendingAdmin_; emit NewPendingAdmin(pendingAdmin); } function queueTransaction( address target, uint value, string memory signature, bytes memory data, uint eta ) public returns (bytes32) { require( msg.sender == admin, "Timelock::queueTransaction: Call must come from admin." ); require( eta >= getBlockTimestamp().add(delay), "Timelock::queueTransaction: Estimated execution block must satisfy delay." ); bytes32 txHash = keccak256( abi.encode(target, value, signature, data, eta) ); queuedTransactions[txHash] = true; emit QueueTransaction(txHash, target, value, signature, data, eta); return txHash; } function cancelTransaction( address target, uint value, string memory signature, bytes memory data, uint eta ) public { require( msg.sender == admin, "Timelock::cancelTransaction: Call must come from admin." ); bytes32 txHash = keccak256( abi.encode(target, value, signature, data, eta) ); queuedTransactions[txHash] = false; emit CancelTransaction(txHash, target, value, signature, data, eta); } function executeTransaction( address target, uint value, string memory signature, bytes memory data, uint eta ) public payable returns (bytes memory) { require( msg.sender == admin, "Timelock::executeTransaction: Call must come from admin." ); bytes32 txHash = keccak256( abi.encode(target, value, signature, data, eta) ); require( queuedTransactions[txHash], "Timelock::executeTransaction: Transaction hasn't been queued." ); require( getBlockTimestamp() >= eta, "Timelock::executeTransaction: Transaction hasn't surpassed time lock." ); require( getBlockTimestamp() <= eta.add(GRACE_PERIOD), "Timelock::executeTransaction: Transaction is stale." ); queuedTransactions[txHash] = false; bytes memory callData; if (bytes(signature).length == 0) { callData = data; } else { callData = abi.encodePacked( bytes4(keccak256(bytes(signature))), data ); } // solium-disable-next-line security/no-call-value (bool success, bytes memory returnData) = target.call{value: value}( callData ); require( success, "Timelock::executeTransaction: Transaction execution reverted." ); emit ExecuteTransaction(txHash, target, value, signature, data, eta); return returnData; } function getBlockTimestamp() internal view returns (uint) { // solium-disable-next-line security/no-block-members return block.timestamp; } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"admin_","internalType":"address"},{"type":"uint256","name":"delay_","internalType":"uint256"}]},{"type":"event","name":"CancelTransaction","inputs":[{"type":"bytes32","name":"txHash","internalType":"bytes32","indexed":true},{"type":"address","name":"target","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"signature","internalType":"string","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false},{"type":"uint256","name":"eta","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ExecuteTransaction","inputs":[{"type":"bytes32","name":"txHash","internalType":"bytes32","indexed":true},{"type":"address","name":"target","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"signature","internalType":"string","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false},{"type":"uint256","name":"eta","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewAdmin","inputs":[{"type":"address","name":"newAdmin","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"NewDelay","inputs":[{"type":"uint256","name":"newDelay","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"NewPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"QueueTransaction","inputs":[{"type":"bytes32","name":"txHash","internalType":"bytes32","indexed":true},{"type":"address","name":"target","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"signature","internalType":"string","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false},{"type":"uint256","name":"eta","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"GRACE_PERIOD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAXIMUM_DELAY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MINIMUM_DELAY","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancelTransaction","inputs":[{"type":"address","name":"target","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"string","name":"signature","internalType":"string"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint256","name":"eta","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"delay","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"executeTransaction","inputs":[{"type":"address","name":"target","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"string","name":"signature","internalType":"string"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint256","name":"eta","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pendingAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"queueTransaction","inputs":[{"type":"address","name":"target","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"string","name":"signature","internalType":"string"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint256","name":"eta","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"queuedTransactions","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDelay","inputs":[{"type":"uint256","name":"delay_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPendingAdmin","inputs":[{"type":"address","name":"pendingAdmin_","internalType":"address"}]}]
Contract Creation Code
0x60806040523480156200001157600080fd5b50604051620020cc380380620020cc8339818101604052810190620000379190620001bd565b6202a30081101562000080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000077906200028b565b60405180910390fd5b62278d00811115620000c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c09062000323565b60405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600281905550505062000345565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200014a826200011d565b9050919050565b6200015c816200013d565b81146200016857600080fd5b50565b6000815190506200017c8162000151565b92915050565b6000819050919050565b620001978162000182565b8114620001a357600080fd5b50565b600081519050620001b7816200018c565b92915050565b60008060408385031215620001d757620001d662000118565b5b6000620001e7858286016200016b565b9250506020620001fa85828601620001a6565b9150509250929050565b600082825260208201905092915050565b7f54696d656c6f636b3a3a636f6e7374727563746f723a2044656c6179206d757360008201527f7420657863656564206d696e696d756d2064656c61792e000000000000000000602082015250565b60006200027360378362000204565b9150620002808262000215565b604082019050919050565b60006020820190508181036000830152620002a68162000264565b9050919050565b7f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206e60008201527f6f7420657863656564206d6178696d756d2064656c61792e0000000000000000602082015250565b60006200030b60388362000204565b91506200031882620002ad565b604082019050919050565b600060208201905081810360008301526200033e81620002fc565b9050919050565b611d7780620003556000396000f3fe6080604052600436106100c65760003560e01c80636a42b8f81161007f578063c1a287e211610059578063c1a287e21461024b578063e177246e14610276578063f2b065371461029f578063f851a440146102dc576100c7565b80636a42b8f8146101ca5780637d645fab146101f5578063b1b43ae514610220576100c7565b80630825f38f146100c95780630e18b681146100f957806326782247146101105780633a66f9011461013b5780634dd18bf514610178578063591fcdfe146101a1576100c7565b5b005b6100e360048036038101906100de9190611080565b610307565b6040516100f091906111bb565b60405180910390f35b34801561010557600080fd5b5061010e610654565b005b34801561011c57600080fd5b506101256107cb565b60405161013291906111ec565b60405180910390f35b34801561014757600080fd5b50610162600480360381019061015d9190611080565b6107f1565b60405161016f9190611220565b60405180910390f35b34801561018457600080fd5b5061019f600480360381019061019a919061123b565b6109a1565b005b3480156101ad57600080fd5b506101c860048036038101906101c39190611080565b610ab8565b005b3480156101d657600080fd5b506101df610c02565b6040516101ec9190611277565b60405180910390f35b34801561020157600080fd5b5061020a610c08565b6040516102179190611277565b60405180910390f35b34801561022c57600080fd5b50610235610c0f565b6040516102429190611277565b60405180910390f35b34801561025757600080fd5b50610260610c16565b60405161026d9190611277565b60405180910390f35b34801561028257600080fd5b5061029d60048036038101906102989190611292565b610c1d565b005b3480156102ab57600080fd5b506102c660048036038101906102c191906112eb565b610d50565b6040516102d39190611333565b60405180910390f35b3480156102e857600080fd5b506102f1610d70565b6040516102fe91906111ec565b60405180910390f35b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038e906113d1565b60405180910390fd5b600086868686866040516020016103b2959493929190611435565b6040516020818303038152906040528051906020012090506003600082815260200190815260200160002060009054906101000a900460ff1661042a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042190611508565b60405180910390fd5b82610433610d94565b1015610474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046b906115c0565b60405180910390fd5b61048a6212750084610d9c90919063ffffffff16565b610492610d94565b11156104d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ca90611652565b60405180910390fd5b60006003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060606000865114156105135784905061053f565b85805190602001208560405160200161052d9291906116fb565b60405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff1689846040516105689190611723565b60006040518083038185875af1925050503d80600081146105a5576040519150601f19603f3d011682016040523d82523d6000602084013e6105aa565b606091505b5091509150816105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e6906117ac565b60405180910390fd5b8973ffffffffffffffffffffffffffffffffffffffff16847fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e78b8b8b8b60405161063c94939291906117cc565b60405180910390a38094505050505095945050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106db90611891565b60405180910390fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60405160405180910390a2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087990611923565b60405180910390fd5b61089e600254610890610d94565b610d9c90919063ffffffff16565b8210156108e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d7906119db565b60405180910390fd5b600086868686866040516020016108fb959493929190611435565b60405160208183030381529060405280519060200120905060016003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055508673ffffffffffffffffffffffffffffffffffffffff16817f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f8888888860405161098c94939291906117cc565b60405180910390a38091505095945050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0690611a6d565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a75660405160405180910390a250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3d90611aff565b60405180910390fd5b60008585858585604051602001610b61959493929190611435565b60405160208183030381529060405280519060200120905060006003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055508573ffffffffffffffffffffffffffffffffffffffff16817f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf8787878787604051610bf294939291906117cc565b60405180910390a3505050505050565b60025481565b62278d0081565b6202a30081565b6212750081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290611b91565b60405180910390fd5b6202a300811015610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890611c23565b60405180910390fd5b62278d00811115610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e90611cb5565b60405180910390fd5b806002819055506002547f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c60405160405180910390a250565b60036020528060005260406000206000915054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600042905090565b600080828401905083811015610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90611d21565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e3082610e05565b9050919050565b610e4081610e25565b8114610e4b57600080fd5b50565b600081359050610e5d81610e37565b92915050565b6000819050919050565b610e7681610e63565b8114610e8157600080fd5b50565b600081359050610e9381610e6d565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610eec82610ea3565b810181811067ffffffffffffffff82111715610f0b57610f0a610eb4565b5b80604052505050565b6000610f1e610df1565b9050610f2a8282610ee3565b919050565b600067ffffffffffffffff821115610f4a57610f49610eb4565b5b610f5382610ea3565b9050602081019050919050565b82818337600083830152505050565b6000610f82610f7d84610f2f565b610f14565b905082815260208101848484011115610f9e57610f9d610e9e565b5b610fa9848285610f60565b509392505050565b600082601f830112610fc657610fc5610e99565b5b8135610fd6848260208601610f6f565b91505092915050565b600067ffffffffffffffff821115610ffa57610ff9610eb4565b5b61100382610ea3565b9050602081019050919050565b600061102361101e84610fdf565b610f14565b90508281526020810184848401111561103f5761103e610e9e565b5b61104a848285610f60565b509392505050565b600082601f83011261106757611066610e99565b5b8135611077848260208601611010565b91505092915050565b600080600080600060a0868803121561109c5761109b610dfb565b5b60006110aa88828901610e4e565b95505060206110bb88828901610e84565b945050604086013567ffffffffffffffff8111156110dc576110db610e00565b5b6110e888828901610fb1565b935050606086013567ffffffffffffffff81111561110957611108610e00565b5b61111588828901611052565b925050608061112688828901610e84565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b60005b8381101561116d578082015181840152602081019050611152565b8381111561117c576000848401525b50505050565b600061118d82611133565b611197818561113e565b93506111a781856020860161114f565b6111b081610ea3565b840191505092915050565b600060208201905081810360008301526111d58184611182565b905092915050565b6111e681610e25565b82525050565b600060208201905061120160008301846111dd565b92915050565b6000819050919050565b61121a81611207565b82525050565b60006020820190506112356000830184611211565b92915050565b60006020828403121561125157611250610dfb565b5b600061125f84828501610e4e565b91505092915050565b61127181610e63565b82525050565b600060208201905061128c6000830184611268565b92915050565b6000602082840312156112a8576112a7610dfb565b5b60006112b684828501610e84565b91505092915050565b6112c881611207565b81146112d357600080fd5b50565b6000813590506112e5816112bf565b92915050565b60006020828403121561130157611300610dfb565b5b600061130f848285016112d6565b91505092915050565b60008115159050919050565b61132d81611318565b82525050565b60006020820190506113486000830184611324565b92915050565b600082825260208201905092915050565b7f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20436160008201527f6c6c206d75737420636f6d652066726f6d2061646d696e2e0000000000000000602082015250565b60006113bb60388361134e565b91506113c68261135f565b604082019050919050565b600060208201905081810360008301526113ea816113ae565b9050919050565b600081519050919050565b6000611407826113f1565b611411818561134e565b935061142181856020860161114f565b61142a81610ea3565b840191505092915050565b600060a08201905061144a60008301886111dd565b6114576020830187611268565b818103604083015261146981866113fc565b9050818103606083015261147d8185611182565b905061148c6080830184611268565b9695505050505050565b7f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260008201527f616e73616374696f6e206861736e2774206265656e207175657565642e000000602082015250565b60006114f2603d8361134e565b91506114fd82611496565b604082019050919050565b60006020820190508181036000830152611521816114e5565b9050919050565b7f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260008201527f616e73616374696f6e206861736e2774207375727061737365642074696d652060208201527f6c6f636b2e000000000000000000000000000000000000000000000000000000604082015250565b60006115aa60458361134e565b91506115b582611528565b606082019050919050565b600060208201905081810360008301526115d98161159d565b9050919050565b7f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260008201527f616e73616374696f6e206973207374616c652e00000000000000000000000000602082015250565b600061163c60338361134e565b9150611647826115e0565b604082019050919050565b6000602082019050818103600083015261166b8161162f565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b6116b96116b482611672565b61169e565b82525050565b600081905092915050565b60006116d582611133565b6116df81856116bf565b93506116ef81856020860161114f565b80840191505092915050565b600061170782856116a8565b60048201915061171782846116ca565b91508190509392505050565b600061172f82846116ca565b915081905092915050565b7f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260008201527f616e73616374696f6e20657865637574696f6e2072657665727465642e000000602082015250565b6000611796603d8361134e565b91506117a18261173a565b604082019050919050565b600060208201905081810360008301526117c581611789565b9050919050565b60006080820190506117e16000830187611268565b81810360208301526117f381866113fc565b905081810360408301526118078185611182565b90506118166060830184611268565b95945050505050565b7f54696d656c6f636b3a3a61636365707441646d696e3a2043616c6c206d75737460008201527f20636f6d652066726f6d2070656e64696e6741646d696e2e0000000000000000602082015250565b600061187b60388361134e565b91506118868261181f565b604082019050919050565b600060208201905081810360008301526118aa8161186e565b9050919050565b7f54696d656c6f636b3a3a71756575655472616e73616374696f6e3a2043616c6c60008201527f206d75737420636f6d652066726f6d2061646d696e2e00000000000000000000602082015250565b600061190d60368361134e565b9150611918826118b1565b604082019050919050565b6000602082019050818103600083015261193c81611900565b9050919050565b7f54696d656c6f636b3a3a71756575655472616e73616374696f6e3a204573746960008201527f6d6174656420657865637574696f6e20626c6f636b206d75737420736174697360208201527f66792064656c61792e0000000000000000000000000000000000000000000000604082015250565b60006119c560498361134e565b91506119d082611943565b606082019050919050565b600060208201905081810360008301526119f4816119b8565b9050919050565b7f54696d656c6f636b3a3a73657450656e64696e6741646d696e3a2043616c6c2060008201527f6d75737420636f6d652066726f6d2054696d656c6f636b2e0000000000000000602082015250565b6000611a5760388361134e565b9150611a62826119fb565b604082019050919050565b60006020820190508181036000830152611a8681611a4a565b9050919050565b7f54696d656c6f636b3a3a63616e63656c5472616e73616374696f6e3a2043616c60008201527f6c206d75737420636f6d652066726f6d2061646d696e2e000000000000000000602082015250565b6000611ae960378361134e565b9150611af482611a8d565b604082019050919050565b60006020820190508181036000830152611b1881611adc565b9050919050565b7f54696d656c6f636b3a3a73657444656c61793a2043616c6c206d75737420636f60008201527f6d652066726f6d2054696d656c6f636b2e000000000000000000000000000000602082015250565b6000611b7b60318361134e565b9150611b8682611b1f565b604082019050919050565b60006020820190508181036000830152611baa81611b6e565b9050919050565b7f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206560008201527f7863656564206d696e696d756d2064656c61792e000000000000000000000000602082015250565b6000611c0d60348361134e565b9150611c1882611bb1565b604082019050919050565b60006020820190508181036000830152611c3c81611c00565b9050919050565b7f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206e60008201527f6f7420657863656564206d6178696d756d2064656c61792e0000000000000000602082015250565b6000611c9f60388361134e565b9150611caa82611c43565b604082019050919050565b60006020820190508181036000830152611cce81611c92565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000611d0b601b8361134e565b9150611d1682611cd5565b602082019050919050565b60006020820190508181036000830152611d3a81611cfe565b905091905056fea2646970667358221220c3244a0e49f472c0118513de0d12390fde2b3a157419e2d119cdf8e380c28ad364736f6c634300080a0033000000000000000000000000f33da2a3fd5e02ad8005cec0a6d3679959e75e5d000000000000000000000000000000000000000000000000000000000002a300
Deployed ByteCode
0x6080604052600436106100c65760003560e01c80636a42b8f81161007f578063c1a287e211610059578063c1a287e21461024b578063e177246e14610276578063f2b065371461029f578063f851a440146102dc576100c7565b80636a42b8f8146101ca5780637d645fab146101f5578063b1b43ae514610220576100c7565b80630825f38f146100c95780630e18b681146100f957806326782247146101105780633a66f9011461013b5780634dd18bf514610178578063591fcdfe146101a1576100c7565b5b005b6100e360048036038101906100de9190611080565b610307565b6040516100f091906111bb565b60405180910390f35b34801561010557600080fd5b5061010e610654565b005b34801561011c57600080fd5b506101256107cb565b60405161013291906111ec565b60405180910390f35b34801561014757600080fd5b50610162600480360381019061015d9190611080565b6107f1565b60405161016f9190611220565b60405180910390f35b34801561018457600080fd5b5061019f600480360381019061019a919061123b565b6109a1565b005b3480156101ad57600080fd5b506101c860048036038101906101c39190611080565b610ab8565b005b3480156101d657600080fd5b506101df610c02565b6040516101ec9190611277565b60405180910390f35b34801561020157600080fd5b5061020a610c08565b6040516102179190611277565b60405180910390f35b34801561022c57600080fd5b50610235610c0f565b6040516102429190611277565b60405180910390f35b34801561025757600080fd5b50610260610c16565b60405161026d9190611277565b60405180910390f35b34801561028257600080fd5b5061029d60048036038101906102989190611292565b610c1d565b005b3480156102ab57600080fd5b506102c660048036038101906102c191906112eb565b610d50565b6040516102d39190611333565b60405180910390f35b3480156102e857600080fd5b506102f1610d70565b6040516102fe91906111ec565b60405180910390f35b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038e906113d1565b60405180910390fd5b600086868686866040516020016103b2959493929190611435565b6040516020818303038152906040528051906020012090506003600082815260200190815260200160002060009054906101000a900460ff1661042a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042190611508565b60405180910390fd5b82610433610d94565b1015610474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046b906115c0565b60405180910390fd5b61048a6212750084610d9c90919063ffffffff16565b610492610d94565b11156104d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ca90611652565b60405180910390fd5b60006003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060606000865114156105135784905061053f565b85805190602001208560405160200161052d9291906116fb565b60405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff1689846040516105689190611723565b60006040518083038185875af1925050503d80600081146105a5576040519150601f19603f3d011682016040523d82523d6000602084013e6105aa565b606091505b5091509150816105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e6906117ac565b60405180910390fd5b8973ffffffffffffffffffffffffffffffffffffffff16847fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e78b8b8b8b60405161063c94939291906117cc565b60405180910390a38094505050505095945050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106db90611891565b60405180910390fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60405160405180910390a2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087990611923565b60405180910390fd5b61089e600254610890610d94565b610d9c90919063ffffffff16565b8210156108e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d7906119db565b60405180910390fd5b600086868686866040516020016108fb959493929190611435565b60405160208183030381529060405280519060200120905060016003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055508673ffffffffffffffffffffffffffffffffffffffff16817f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f8888888860405161098c94939291906117cc565b60405180910390a38091505095945050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0690611a6d565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a75660405160405180910390a250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3d90611aff565b60405180910390fd5b60008585858585604051602001610b61959493929190611435565b60405160208183030381529060405280519060200120905060006003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055508573ffffffffffffffffffffffffffffffffffffffff16817f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf8787878787604051610bf294939291906117cc565b60405180910390a3505050505050565b60025481565b62278d0081565b6202a30081565b6212750081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290611b91565b60405180910390fd5b6202a300811015610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890611c23565b60405180910390fd5b62278d00811115610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e90611cb5565b60405180910390fd5b806002819055506002547f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c60405160405180910390a250565b60036020528060005260406000206000915054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600042905090565b600080828401905083811015610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90611d21565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e3082610e05565b9050919050565b610e4081610e25565b8114610e4b57600080fd5b50565b600081359050610e5d81610e37565b92915050565b6000819050919050565b610e7681610e63565b8114610e8157600080fd5b50565b600081359050610e9381610e6d565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610eec82610ea3565b810181811067ffffffffffffffff82111715610f0b57610f0a610eb4565b5b80604052505050565b6000610f1e610df1565b9050610f2a8282610ee3565b919050565b600067ffffffffffffffff821115610f4a57610f49610eb4565b5b610f5382610ea3565b9050602081019050919050565b82818337600083830152505050565b6000610f82610f7d84610f2f565b610f14565b905082815260208101848484011115610f9e57610f9d610e9e565b5b610fa9848285610f60565b509392505050565b600082601f830112610fc657610fc5610e99565b5b8135610fd6848260208601610f6f565b91505092915050565b600067ffffffffffffffff821115610ffa57610ff9610eb4565b5b61100382610ea3565b9050602081019050919050565b600061102361101e84610fdf565b610f14565b90508281526020810184848401111561103f5761103e610e9e565b5b61104a848285610f60565b509392505050565b600082601f83011261106757611066610e99565b5b8135611077848260208601611010565b91505092915050565b600080600080600060a0868803121561109c5761109b610dfb565b5b60006110aa88828901610e4e565b95505060206110bb88828901610e84565b945050604086013567ffffffffffffffff8111156110dc576110db610e00565b5b6110e888828901610fb1565b935050606086013567ffffffffffffffff81111561110957611108610e00565b5b61111588828901611052565b925050608061112688828901610e84565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b60005b8381101561116d578082015181840152602081019050611152565b8381111561117c576000848401525b50505050565b600061118d82611133565b611197818561113e565b93506111a781856020860161114f565b6111b081610ea3565b840191505092915050565b600060208201905081810360008301526111d58184611182565b905092915050565b6111e681610e25565b82525050565b600060208201905061120160008301846111dd565b92915050565b6000819050919050565b61121a81611207565b82525050565b60006020820190506112356000830184611211565b92915050565b60006020828403121561125157611250610dfb565b5b600061125f84828501610e4e565b91505092915050565b61127181610e63565b82525050565b600060208201905061128c6000830184611268565b92915050565b6000602082840312156112a8576112a7610dfb565b5b60006112b684828501610e84565b91505092915050565b6112c881611207565b81146112d357600080fd5b50565b6000813590506112e5816112bf565b92915050565b60006020828403121561130157611300610dfb565b5b600061130f848285016112d6565b91505092915050565b60008115159050919050565b61132d81611318565b82525050565b60006020820190506113486000830184611324565b92915050565b600082825260208201905092915050565b7f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20436160008201527f6c6c206d75737420636f6d652066726f6d2061646d696e2e0000000000000000602082015250565b60006113bb60388361134e565b91506113c68261135f565b604082019050919050565b600060208201905081810360008301526113ea816113ae565b9050919050565b600081519050919050565b6000611407826113f1565b611411818561134e565b935061142181856020860161114f565b61142a81610ea3565b840191505092915050565b600060a08201905061144a60008301886111dd565b6114576020830187611268565b818103604083015261146981866113fc565b9050818103606083015261147d8185611182565b905061148c6080830184611268565b9695505050505050565b7f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260008201527f616e73616374696f6e206861736e2774206265656e207175657565642e000000602082015250565b60006114f2603d8361134e565b91506114fd82611496565b604082019050919050565b60006020820190508181036000830152611521816114e5565b9050919050565b7f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260008201527f616e73616374696f6e206861736e2774207375727061737365642074696d652060208201527f6c6f636b2e000000000000000000000000000000000000000000000000000000604082015250565b60006115aa60458361134e565b91506115b582611528565b606082019050919050565b600060208201905081810360008301526115d98161159d565b9050919050565b7f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260008201527f616e73616374696f6e206973207374616c652e00000000000000000000000000602082015250565b600061163c60338361134e565b9150611647826115e0565b604082019050919050565b6000602082019050818103600083015261166b8161162f565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b6116b96116b482611672565b61169e565b82525050565b600081905092915050565b60006116d582611133565b6116df81856116bf565b93506116ef81856020860161114f565b80840191505092915050565b600061170782856116a8565b60048201915061171782846116ca565b91508190509392505050565b600061172f82846116ca565b915081905092915050565b7f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260008201527f616e73616374696f6e20657865637574696f6e2072657665727465642e000000602082015250565b6000611796603d8361134e565b91506117a18261173a565b604082019050919050565b600060208201905081810360008301526117c581611789565b9050919050565b60006080820190506117e16000830187611268565b81810360208301526117f381866113fc565b905081810360408301526118078185611182565b90506118166060830184611268565b95945050505050565b7f54696d656c6f636b3a3a61636365707441646d696e3a2043616c6c206d75737460008201527f20636f6d652066726f6d2070656e64696e6741646d696e2e0000000000000000602082015250565b600061187b60388361134e565b91506118868261181f565b604082019050919050565b600060208201905081810360008301526118aa8161186e565b9050919050565b7f54696d656c6f636b3a3a71756575655472616e73616374696f6e3a2043616c6c60008201527f206d75737420636f6d652066726f6d2061646d696e2e00000000000000000000602082015250565b600061190d60368361134e565b9150611918826118b1565b604082019050919050565b6000602082019050818103600083015261193c81611900565b9050919050565b7f54696d656c6f636b3a3a71756575655472616e73616374696f6e3a204573746960008201527f6d6174656420657865637574696f6e20626c6f636b206d75737420736174697360208201527f66792064656c61792e0000000000000000000000000000000000000000000000604082015250565b60006119c560498361134e565b91506119d082611943565b606082019050919050565b600060208201905081810360008301526119f4816119b8565b9050919050565b7f54696d656c6f636b3a3a73657450656e64696e6741646d696e3a2043616c6c2060008201527f6d75737420636f6d652066726f6d2054696d656c6f636b2e0000000000000000602082015250565b6000611a5760388361134e565b9150611a62826119fb565b604082019050919050565b60006020820190508181036000830152611a8681611a4a565b9050919050565b7f54696d656c6f636b3a3a63616e63656c5472616e73616374696f6e3a2043616c60008201527f6c206d75737420636f6d652066726f6d2061646d696e2e000000000000000000602082015250565b6000611ae960378361134e565b9150611af482611a8d565b604082019050919050565b60006020820190508181036000830152611b1881611adc565b9050919050565b7f54696d656c6f636b3a3a73657444656c61793a2043616c6c206d75737420636f60008201527f6d652066726f6d2054696d656c6f636b2e000000000000000000000000000000602082015250565b6000611b7b60318361134e565b9150611b8682611b1f565b604082019050919050565b60006020820190508181036000830152611baa81611b6e565b9050919050565b7f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206560008201527f7863656564206d696e696d756d2064656c61792e000000000000000000000000602082015250565b6000611c0d60348361134e565b9150611c1882611bb1565b604082019050919050565b60006020820190508181036000830152611c3c81611c00565b9050919050565b7f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206e60008201527f6f7420657863656564206d6178696d756d2064656c61792e0000000000000000602082015250565b6000611c9f60388361134e565b9150611caa82611c43565b604082019050919050565b60006020820190508181036000830152611cce81611c92565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000611d0b601b8361134e565b9150611d1682611cd5565b602082019050919050565b60006020820190508181036000830152611d3a81611cfe565b905091905056fea2646970667358221220c3244a0e49f472c0118513de0d12390fde2b3a157419e2d119cdf8e380c28ad364736f6c634300080a0033