Contract Address Details
contract
0x3E0eA49698C81E7ba52c8844731F6BA128F4e539
Sponsored:
- Contract name:
- BlockReward
- Optimization enabled
- true
- Compiler version
- v0.4.26+commit.4563c3fc
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2023-10-02T01:55:25.757799Z
Contract source code
// File: contracts/abstracts/BlockRewardBase.sol pragma solidity ^0.4.24; /** * @title Interface to be implemented by block reward contract * @author LiorRabin * @dev abstract contract */ contract BlockRewardBase { // Produce rewards for the given benefactors, with corresponding reward codes. // Only valid when msg.sender == SYSTEM_ADDRESS (EIP96, 2**160 - 2) function reward(address[] benefactors, uint16[] kind) external returns (address[], uint256[]); } // File: contracts/interfaces/IConsensus.sol pragma solidity ^0.4.24; interface IConsensus { function currentValidatorsLength() external view returns(uint256); function currentValidatorsAtPosition(uint256 _p) external view returns(address); function getCycleDurationBlocks() external view returns(uint256); function getCurrentCycleEndBlock() external view returns(uint256); function cycle(address _validator) external; function isValidator(address _address) external view returns(bool); function getDelegatorsForRewardDistribution(address _validator, uint256 _rewardAmount) external view returns(address[], uint256[]); function isFinalized() external view returns(bool); function stakeAmount(address _address) external view returns(uint256); function totalStakeAmount() external view returns(uint256); } // File: contracts/eternal-storage/EternalStorage.sol pragma solidity ^0.4.24; /** * @title EternalStorage * @author LiorRabin * @dev This contract holds all the necessary state variables to carry out the storage of any contract and to support the upgrade functionality. */ contract EternalStorage { // Version number of the current implementation uint256 internal version; // Address of the current implementation address internal implementation; // Storage mappings mapping(bytes32 => uint256) internal uintStorage; mapping(bytes32 => string) internal stringStorage; mapping(bytes32 => address) internal addressStorage; mapping(bytes32 => bytes) internal bytesStorage; mapping(bytes32 => bool) internal boolStorage; mapping(bytes32 => int256) internal intStorage; mapping(bytes32 => uint256[]) internal uintArrayStorage; mapping(bytes32 => string[]) internal stringArrayStorage; mapping(bytes32 => address[]) internal addressArrayStorage; mapping(bytes32 => bytes[]) internal bytesArrayStorage; mapping(bytes32 => bool[]) internal boolArrayStorage; mapping(bytes32 => int256[]) internal intArrayStorage; mapping(bytes32 => bytes32[]) internal bytes32ArrayStorage; function isInitialized() public view returns(bool) { return boolStorage[keccak256(abi.encodePacked("isInitialized"))]; } function setInitialized(bool _status) internal { boolStorage[keccak256(abi.encodePacked("isInitialized"))] = _status; } } // File: contracts/eternal-storage/EternalStorageProxy.sol pragma solidity ^0.4.24; /** * @title EternalStorageProxy * @author LiorRabin * @dev This proxy holds the storage of the token contract and delegates every call to the current implementation set. * Besides, it allows to upgrade the token's behaviour towards further implementations, and provides authorization control functionalities */ contract EternalStorageProxy is EternalStorage { /** * @dev This event will be emitted every time the implementation gets upgraded * @param version representing the version number of the upgraded implementation * @param implementation representing the address of the upgraded implementation */ event Upgraded(uint256 version, address indexed implementation); /** * @dev This event will be emitted when ownership is renounces * @param previousOwner address which is renounced from ownership */ event OwnershipRenounced(address indexed previousOwner); /** * @dev This event will be emitted when ownership is transferred * @param previousOwner address which represents the previous owner * @param newOwner address which represents the new owner */ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev This modifier verifies that msg.sender is the ProxyStorage contract */ modifier onlyProxyStorage() { require(msg.sender == getProxyStorage()); _; } /** * @dev This modifier verifies that msg.sender is the owner of the contract */ modifier onlyOwner() { require(msg.sender == getOwner()); _; } /** * @dev Constructor * @param _proxyStorage address representing the ProxyStorage contract * @param _implementation address representing the implementation contract */ constructor(address _proxyStorage, address _implementation) public { require(_implementation != address(0)); if (_proxyStorage != address(0)) { _setProxyStorage(_proxyStorage); } else { _setProxyStorage(address(this)); } _setImplementation(_implementation); _setOwner(msg.sender); } /** * @dev Fallback function allowing to perform a delegatecall to the given implementation. * This function will return whatever the implementation call returns */ // solhint-disable no-complex-fallback, no-inline-assembly function() payable public { address _impl = getImplementation(); require(_impl != address(0)); assembly { // Copy msg.data. We take full control of memory in this inline assembly // block because it will not return to Solidity code. We overwrite the // Solidity scratch pad at memory position 0 calldatacopy(0, 0, calldatasize) // Call the implementation. // out and outsize are 0 because we don't know the size yet let result := delegatecall(gas, _impl, 0, calldatasize, 0, 0) // Copy the returned data returndatacopy(0, 0, returndatasize) switch result // delegatecall returns 0 on error case 0 { revert(0, returndatasize) } default { return(0, returndatasize) } } } // solhint-enable no-complex-fallback, no-inline-assembly /** * @dev Allows ProxyStorage contract (only) to upgrade the current implementation. * @param _newImplementation representing the address of the new implementation to be set. */ function upgradeTo(address _newImplementation) public onlyProxyStorage returns(bool) { if (_newImplementation == address(0)) return false; if (getImplementation() == _newImplementation) return false; uint256 _newVersion = getVersion() + 1; _setVersion(_newVersion); _setImplementation(_newImplementation); emit Upgraded(_newVersion, _newImplementation); return true; } /** * @dev Allows the current owner to relinquish ownership. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(getOwner()); _setOwner(address(0)); } /** * @dev Allows the current owner to transfer control of the contract to a _newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { require(_newOwner != address(0)); emit OwnershipTransferred(getOwner(), _newOwner); _setOwner(_newOwner); } function getOwner() public view returns(address) { return addressStorage[keccak256(abi.encodePacked("owner"))]; } function _setOwner(address _owner) private { addressStorage[keccak256(abi.encodePacked("owner"))] = _owner; } function getVersion() public view returns(uint256) { return version; } function _setVersion(uint256 _newVersion) private { version = _newVersion; } function getImplementation() public view returns(address) { return implementation; } function _setImplementation(address _newImplementation) private { implementation = _newImplementation; } function getProxyStorage() public view returns(address) { return addressStorage[keccak256(abi.encodePacked("proxyStorage"))]; } function _setProxyStorage(address _proxyStorage) private { addressStorage[keccak256(abi.encodePacked("proxyStorage"))] = _proxyStorage; } } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.4.24; /** * @title SafeMath * @dev Math operations with safety checks that revert on error */ library SafeMath { int256 constant private INT256_MIN = -2**255; /** * @dev Multiplies two unsigned integers, reverts on 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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Multiplies two signed integers, reverts on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // 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-solidity/pull/522 if (a == 0) { return 0; } require(!(a == -1 && b == INT256_MIN)); // This is the only case of overflow not detected by the check below int256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero. */ function div(int256 a, int256 b) internal pure returns (int256) { require(b != 0); // Solidity only automatically asserts when dividing by 0 require(!(b == -1 && a == INT256_MIN)); // This is the only case of overflow int256 c = a / b; return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Subtracts two signed integers, reverts on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Adds two signed integers, reverts on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } // File: contracts/ProxyStorage.sol pragma solidity ^0.4.24; /** * @title Contract used for access and upgradeability to all network contracts * @author LiorRabin */ contract ProxyStorage is EternalStorage { using SafeMath for uint256; /** * @dev Available contract types on the network */ enum ContractTypes { Invalid, Consensus, BlockReward, ProxyStorage, Voting } /** * @dev This event will be emitted when all contract addresses have been initialized by the contract owner */ event ProxyInitialized( address consensus, address blockReward, address voting ); /** * @dev This event will be emitted each time a contract address is updated * @param contractType contract type (See ContractTypes enum) * @param contractAddress contract address set for the contract type */ event AddressSet(uint256 contractType, address contractAddress); /** * @dev This modifier verifies that msg.sender is the owner of the contract */ modifier onlyOwner() { require(msg.sender == addressStorage[OWNER]); _; } /** * @dev This modifier verifies that msg.sender is the voting contract which implement proxy address change */ modifier onlyVoting() { require(msg.sender == getVoting()); _; } /** * @dev Function to be called on contract initialization * @param _consensus address of the network consensus contract */ function initialize(address _consensus) external onlyOwner { require(!isInitialized()); require(_consensus != address(0)); require(_consensus != address(this)); _setConsensus(_consensus); setInitialized(true); } /** * @dev Function to be called to initialize all available contract types addresses */ function initializeAddresses(address _blockReward, address _voting) external onlyOwner { require(!boolStorage[PROXY_STORAGE_ADDRESSES_INITIALIZED]); addressStorage[BLOCK_REWARD] = _blockReward; addressStorage[VOTING] = _voting; boolStorage[PROXY_STORAGE_ADDRESSES_INITIALIZED] = true; emit ProxyInitialized( getConsensus(), _blockReward, _voting ); } /** * @dev Function to be called to set specific contract type address * @param _contractType contract type (See ContractTypes enum) * @param _contractAddress contract address set for the contract type */ function setContractAddress(uint256 _contractType, address _contractAddress) external onlyVoting returns(bool) { if (!isInitialized()) return false; if (_contractAddress == address(0)) return false; bool success = false; if (_contractType == uint256(ContractTypes.Consensus)) { success = EternalStorageProxy(getConsensus()).upgradeTo(_contractAddress); } else if (_contractType == uint256(ContractTypes.BlockReward)) { success = EternalStorageProxy(getBlockReward()).upgradeTo(_contractAddress); } else if (_contractType == uint256(ContractTypes.ProxyStorage)) { success = EternalStorageProxy(this).upgradeTo(_contractAddress); } else if (_contractType == uint256(ContractTypes.Voting)) { success = EternalStorageProxy(getVoting()).upgradeTo(_contractAddress); } if (success) { emit AddressSet(_contractType, _contractAddress); } return success; } /** * @dev Function checking if a contract type is valid one for proxy usage * @param _contractType contract type to check if valid */ function isValidContractType(uint256 _contractType) external pure returns(bool) { return _contractType == uint256(ContractTypes.Consensus) || _contractType == uint256(ContractTypes.BlockReward) || _contractType == uint256(ContractTypes.ProxyStorage) || _contractType == uint256(ContractTypes.Voting); } bytes32 internal constant OWNER = keccak256(abi.encodePacked("owner")); bytes32 internal constant CONSENSUS = keccak256(abi.encodePacked("consensus")); bytes32 internal constant BLOCK_REWARD = keccak256(abi.encodePacked("blockReward")); bytes32 internal constant VOTING = keccak256(abi.encodePacked("voting")); bytes32 internal constant PROXY_STORAGE_ADDRESSES_INITIALIZED = keccak256(abi.encodePacked("proxyStorageAddressesInitialized")); function _setConsensus(address _consensus) private { addressStorage[CONSENSUS] = _consensus; } function getConsensus() public view returns(address){ return addressStorage[CONSENSUS]; } function getBlockReward() public view returns(address){ return addressStorage[BLOCK_REWARD]; } function getVoting() public view returns(address){ return addressStorage[VOTING]; } } // File: contracts/BlockReward.sol pragma solidity ^0.4.24; /** * @title Contract handling block reward logic * @author LiorRabin */ contract BlockReward is EternalStorage, BlockRewardBase { using SafeMath for uint256; uint256 public constant DECIMALS = 10 ** 18; uint256 public constant INFLATION = 2; uint256 public constant BLOCKS_PER_YEAR = 2102400; /** * @dev This event will be emitted every block, describing the rewards given * @param receivers array of addresses to reward * @param rewards array of balance increases corresponding to the receivers array */ event Rewarded(address[] receivers, uint256[] rewards); /** * @dev This event will be emitted on cycle end, describing the amount of rewards distributed on the cycle * @param amount total rewards distributed on this cycle */ event RewardedOnCycle(uint256 amount); /** * @dev This modifier verifies that msg.sender is the system address (EIP96) */ modifier onlySystem() { require(msg.sender == addressStorage[SYSTEM_ADDRESS]); _; } /** * @dev This modifier verifies that msg.sender is the owner of the contract */ modifier onlyOwner() { require(msg.sender == addressStorage[OWNER]); _; } /** * @dev This modifier verifies that msg.sender is the consensus contract */ modifier onlyConsensus() { require(msg.sender == ProxyStorage(getProxyStorage()).getConsensus()); _; } /** * @dev This modifier verifies that msg.sender is a validator */ modifier onlyValidator() { require(IConsensus(ProxyStorage(getProxyStorage()).getConsensus()).isValidator(msg.sender)); _; } /** * @dev Function to be called on contract initialization */ function initialize(uint256 _supply) external onlyOwner { require(!isInitialized()); _setSystemAddress(0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE); _setTotalSupply(_supply); _initRewardedOnCycle(); _setBlockRewardAmount(); setInitialized(true); } /** * @dev Function called to produce the reward on each block * @param benefactors array of addresses representing benefectors to be considered for reward * @param kind array of reward types. We support only arrays with one item and type = 0 (Author - Reward attributed to the block author) * See https://wiki.parity.io/Block-Reward-Contract.html */ function reward(address[] benefactors, uint16[] kind) external onlySystem returns (address[], uint256[]) { require(benefactors.length == kind.length); require(benefactors.length == 1); require(kind[0] == 0); uint256 blockRewardAmount = getBlockRewardAmountPerValidator(benefactors[0]); (address[] memory _delegators, uint256[] memory _rewards) = IConsensus(ProxyStorage(getProxyStorage()).getConsensus()).getDelegatorsForRewardDistribution(benefactors[0], blockRewardAmount); address[] memory receivers = new address[](_delegators.length + 1); uint256[] memory rewards = new uint256[](receivers.length); receivers[0] = benefactors[0]; rewards[0] = blockRewardAmount; for (uint256 i = 1; i <= _delegators.length; i++) { receivers[i] = _delegators[i - 1]; rewards[i] = _rewards[i - 1]; rewards[0] = rewards[0].sub(rewards[i]); } _setRewardedOnCycle(getRewardedOnCycle().add(blockRewardAmount)); _setTotalSupply(getTotalSupply().add(blockRewardAmount)); if ((block.number).mod(getBlocksPerYear()) == 0) { _setBlockRewardAmount(); } IConsensus(ProxyStorage(getProxyStorage()).getConsensus()).cycle(benefactors[0]); emit Rewarded(receivers, rewards); return (receivers, rewards); } function onCycleEnd() external onlyConsensus { _setShouldEmitRewardedOnCycle(true); } /** * @dev Function to be called by validators only to emit RewardedOnCycle event (only if `shouldEmitRewardedOnCycle` returns true) */ function emitRewardedOnCycle() external onlyValidator { require(shouldEmitRewardedOnCycle()); emit RewardedOnCycle(getRewardedOnCycle()); _setShouldEmitRewardedOnCycle(false); _setRewardedOnCycle(0); } bytes32 internal constant OWNER = keccak256(abi.encodePacked("owner")); bytes32 internal constant SYSTEM_ADDRESS = keccak256(abi.encodePacked("SYSTEM_ADDRESS")); bytes32 internal constant PROXY_STORAGE = keccak256(abi.encodePacked("proxyStorage")); bytes32 internal constant TOTAL_SUPPLY = keccak256(abi.encodePacked("totalSupply")); bytes32 internal constant REWARDED_THIS_CYCLE = keccak256(abi.encodePacked("rewardedOnCycle")); bytes32 internal constant BLOCK_REWARD_AMOUNT = keccak256(abi.encodePacked("blockRewardAmount")); bytes32 internal constant SHOULD_EMIT_REWARDED_ON_CYCLE = keccak256(abi.encodePacked("shouldEmitRewardedOnCycle")); function _setSystemAddress(address _newAddress) private { addressStorage[SYSTEM_ADDRESS] = _newAddress; } function _setTotalSupply(uint256 _supply) private { require(_supply >= 0); uintStorage[TOTAL_SUPPLY] = _supply; } function getTotalSupply() public view returns(uint256) { return uintStorage[TOTAL_SUPPLY]; } function _initRewardedOnCycle() private { _setRewardedOnCycle(0); } function _setRewardedOnCycle(uint256 _amount) private { require(_amount >= 0); uintStorage[REWARDED_THIS_CYCLE] = _amount; } function getRewardedOnCycle() public view returns(uint256) { return uintStorage[REWARDED_THIS_CYCLE]; } /** * returns yearly inflation rate (percentage) */ function getInflation() public pure returns(uint256) { return INFLATION; } /** * returns blocks per year (block time is 5 seconds) */ function getBlocksPerYear() public pure returns(uint256) { return BLOCKS_PER_YEAR; } function _setBlockRewardAmount() private { uintStorage[BLOCK_REWARD_AMOUNT] = (getTotalSupply().mul(getInflation().mul(DECIMALS).div(100))).div(getBlocksPerYear()).div(DECIMALS); } function getBlockRewardAmount() public view returns(uint256) { return uintStorage[BLOCK_REWARD_AMOUNT]; } function getBlockRewardAmountPerValidator(address _validator) public view returns(uint256) { IConsensus consensus = IConsensus(ProxyStorage(getProxyStorage()).getConsensus()); uint256 stakeAmount = consensus.stakeAmount(_validator); uint256 totalStakeAmount = consensus.totalStakeAmount(); uint256 currentValidatorsLength = consensus.currentValidatorsLength(); // this may arise in peculiar cases when the consensus totalStakeAmount wasn't calculated yet // for example at the first blocks after the contract was deployed if (totalStakeAmount == 0) { return getBlockRewardAmount(); } return getBlockRewardAmount().mul(stakeAmount).mul(currentValidatorsLength).div(totalStakeAmount); } function getProxyStorage() public view returns(address) { return addressStorage[PROXY_STORAGE]; } function shouldEmitRewardedOnCycle() public view returns(bool) { return IConsensus(ProxyStorage(getProxyStorage()).getConsensus()).isFinalized() && boolStorage[SHOULD_EMIT_REWARDED_ON_CYCLE]; } function _setShouldEmitRewardedOnCycle(bool _status) internal { boolStorage[SHOULD_EMIT_REWARDED_ON_CYCLE] = _status; } }
Contract ABI
[{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"BLOCKS_PER_YEAR","inputs":[],"constant":true},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"DECIMALS","inputs":[],"constant":true},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"INFLATION","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emitRewardedOnCycle","inputs":[],"constant":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"getBlockRewardAmount","inputs":[],"constant":true},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"getBlockRewardAmountPerValidator","inputs":[{"type":"address","name":"_validator"}],"constant":true},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":""}],"name":"getBlocksPerYear","inputs":[],"constant":true},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":""}],"name":"getInflation","inputs":[],"constant":true},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":""}],"name":"getProxyStorage","inputs":[],"constant":true},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"getRewardedOnCycle","inputs":[],"constant":true},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"getTotalSupply","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"uint256","name":"_supply"}],"constant":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":""}],"name":"isInitialized","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"onCycleEnd","inputs":[],"constant":false},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address[]","name":""},{"type":"uint256[]","name":""}],"name":"reward","inputs":[{"type":"address[]","name":"benefactors"},{"type":"uint16[]","name":"kind"}],"constant":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":""}],"name":"shouldEmitRewardedOnCycle","inputs":[],"constant":true},{"type":"event","name":"Rewarded","inputs":[{"type":"address[]","name":"receivers","indexed":false},{"type":"uint256[]","name":"rewards","indexed":false}],"anonymous":false},{"type":"event","name":"RewardedOnCycle","inputs":[{"type":"uint256","name":"amount","indexed":false}],"anonymous":false}]
Contract Creation Code
0x608060405234801561001057600080fd5b5061193e806100206000396000f3006080604052600436106100cc5763ffffffff60e060020a6000350416632e0f262581146100d1578063392e53cd146100f8578063537cc17c146101215780635c3be315146101365780635dba8c4a1461014b57806363037afc146101605780636d20d6ae14610181578063741de14814610196578063b1f0c8e1146101ab578063c4e41b22146101c2578063d37db1d2146101d7578063d56f4f28146101ec578063d5a9577114610201578063ec15a5e614610216578063f91c289814610247578063fe4b84df1461030c575b600080fd5b3480156100dd57600080fd5b506100e6610324565b60408051918252519081900360200190f35b34801561010457600080fd5b5061010d610330565b604080519115158252519081900360200190f35b34801561012d57600080fd5b506100e66103e8565b34801561014257600080fd5b5061010d61049d565b34801561015757600080fd5b506100e6610617565b34801561016c57600080fd5b506100e6600160a060020a036004351661068b565b34801561018d57600080fd5b506100e66108fe565b3480156101a257600080fd5b506100e6610903565b3480156101b757600080fd5b506101c061090a565b005b3480156101ce57600080fd5b506100e661099b565b3480156101e357600080fd5b506100e6610a0f565b3480156101f857600080fd5b506101c0610a16565b34801561020d57600080fd5b506100e6610b82565b34801561022257600080fd5b5061022b610b87565b60408051600160a060020a039092168252519081900360200190f35b34801561025357600080fd5b506102736024600480358281019290820135918135918201910135610c45565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156102b757818101518382015260200161029f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156102f65781810151838201526020016102de565b5050505090500194505050505060405180910390f35b34801561031857600080fd5b506101c0600435611310565b670de0b6b3a764000081565b60006006600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b602083106103a55780518252601f199092019160209182019101610386565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff16949350505050565b60006002600060405160200180807f72657761726465644f6e4379636c650000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b6020831061045d5780518252601f19909201916020918201910161043e565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054949350505050565b60006104a7610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156104e457600080fd5b505af11580156104f8573d6000803e3d6000fd5b505050506040513d602081101561050e57600080fd5b5051604080517f8d4e40830000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921691638d4e4083916004808201926020929091908290030181600087803b15801561056d57600080fd5b505af1158015610581573d6000803e3d6000fd5b505050506040513d602081101561059757600080fd5b5051801561061257506006600060405160200180807f73686f756c64456d697452657761726465644f6e4379636c65000000000000008152506019019050604051602081830303815290604052604051808280519060200190808383602083106103a55780518252601f199092019160209182019101610386565b905090565b60006002600060405160200180807f626c6f636b526577617264416d6f756e7400000000000000000000000000000081525060110190506040516020818303038152906040526040518082805190602001908083836020831061045d5780518252601f19909201916020918201910161043e565b600080600080600061069b610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156106d857600080fd5b505af11580156106ec573d6000803e3d6000fd5b505050506040513d602081101561070257600080fd5b5051604080517fbf135267000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519296509086169163bf135267916024808201926020929091908290030181600087803b15801561076c57600080fd5b505af1158015610780573d6000803e3d6000fd5b505050506040513d602081101561079657600080fd5b5051604080517f94409a560000000000000000000000000000000000000000000000000000000081529051919450600160a060020a038616916394409a56916004808201926020929091908290030181600087803b1580156107f757600080fd5b505af115801561080b573d6000803e3d6000fd5b505050506040513d602081101561082157600080fd5b5051604080517f40c9cdeb0000000000000000000000000000000000000000000000000000000081529051919350600160a060020a038616916340c9cdeb916004808201926020929091908290030181600087803b15801561088257600080fd5b505af1158015610896573d6000803e3d6000fd5b505050506040513d60208110156108ac57600080fd5b505190508115156108c6576108bf610617565b94506108f5565b6108f2826108e6836108da876108da610617565b9063ffffffff61142916565b9063ffffffff61146216565b94505b50505050919050565b600281565b6220148090565b610912610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561094f57600080fd5b505af1158015610963573d6000803e3d6000fd5b505050506040513d602081101561097957600080fd5b5051600160a060020a0316331461098f57600080fd5b6109996001611485565b565b60006002600060405160200180807f746f74616c537570706c79000000000000000000000000000000000000000000815250600b0190506040516020818303038152906040526040518082805190602001908083836020831061045d5780518252601f19909201916020918201910161043e565b6220148081565b610a1e610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a5b57600080fd5b505af1158015610a6f573d6000803e3d6000fd5b505050506040513d6020811015610a8557600080fd5b5051604080517ffacd743b0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a039092169163facd743b916024808201926020929091908290030181600087803b158015610aea57600080fd5b505af1158015610afe573d6000803e3d6000fd5b505050506040513d6020811015610b1457600080fd5b50511515610b2157600080fd5b610b2961049d565b1515610b3457600080fd5b7f5c0daed232a37723b040b8aa1c0b060b1d5fb3dea06a55fd30c35cab3e8fc3d7610b5d6103e8565b60408051918252519081900360200190a1610b786000611485565b6109996000611546565b600290565b60006004600060405160200180807f70726f787953746f726167650000000000000000000000000000000000000000815250600c0190506040516020818303038152906040526040518082805190602001908083835b60208310610bfc5780518252601f199092019160209182019101610bdd565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316949350505050565b606080600060608060608060006004600060405160200180807f53595354454d5f41444452455353000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b60208310610cc55780518252601f199092019160209182019101610ca6565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a031633149250610d1691505057600080fd5b8a8914610d2257600080fd5b60018b14610d2f57600080fd5b89896000818110610d3c57fe5b9050602002013561ffff1661ffff166000141515610d5957600080fd5b610d7e8c8c6000818110610d6957fe5b90506020020135600160a060020a031661068b565b9550610d88610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610dc557600080fd5b505af1158015610dd9573d6000803e3d6000fd5b505050506040513d6020811015610def57600080fd5b5051600160a060020a0316636a28f12f8d8d6000818110610e0c57fe5b90506020020135600160a060020a0316886040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015610e6f57600080fd5b505af1158015610e83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015610eac57600080fd5b810190808051640100000000811115610ec457600080fd5b82016020810184811115610ed757600080fd5b8151856020820283011164010000000082111715610ef457600080fd5b50509291906020018051640100000000811115610f1057600080fd5b82016020810184811115610f2357600080fd5b8151856020820283011164010000000082111715610f4057600080fd5b5050929190505050945094508451600101604051908082528060200260200182016040528015610f7a578160200160208202803883390190505b5092508251604051908082528060200260200182016040528015610fa8578160200160208202803883390190505b5091508b8b6000818110610fb857fe5b90506020020135600160a060020a0316836000815181101515610fd757fe5b600160a060020a039092166020928302909101909101528151869083906000908110610fff57fe5b602090810290910101525060015b845181116110eb57846001820381518110151561102657fe5b90602001906020020151838281518110151561103e57fe5b600160a060020a0390921660209283029091019091015283518490600019830190811061106757fe5b90602001906020020151828281518110151561107f57fe5b6020908102909101015281516110ca9083908390811061109b57fe5b906020019060200201518360008151811015156110b457fe5b602090810290910101519063ffffffff61160916565b8260008151811015156110d957fe5b6020908102909101015260010161100d565b61110b611106876110fa6103e8565b9063ffffffff61162016565b611546565b61111f61111a876110fa61099b565b611632565b61113761112a610903565b439063ffffffff6116b316565b1515611145576111456116d4565b61114d610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561118a57600080fd5b505af115801561119e573d6000803e3d6000fd5b505050506040513d60208110156111b457600080fd5b5051600160a060020a03166385cd84648d8d60008181106111d157fe5b90506020020135600160a060020a03166040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b15801561122c57600080fd5b505af1158015611240573d6000803e3d6000fd5b505050507fb747d4e9a0b39cc47496d84b42e4066ba8b8a0b89776528bcec4ac2997e224538383604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156112ab578181015183820152602001611293565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156112ea5781810151838201526020016112d2565b5050505090500194505050505060405180910390a150909a909950975050505050505050565b6004600060405160200180807f6f776e657200000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040526040518082805190602001908083835b602083106113835780518252601f199092019160209182019101611364565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316331492506113d491505057600080fd5b6113dc610330565b156113e657600080fd5b61140373fffffffffffffffffffffffffffffffffffffffe6117c2565b61140c81611632565b611414610b78565b61141c6116d4565b611426600161189f565b50565b60008083151561143c576000915061145b565b5082820282848281151561144c57fe5b041461145757600080fd5b8091505b5092915050565b60008080831161147157600080fd5b828481151561147c57fe5b04949350505050565b806006600060405160200180807f73686f756c64456d697452657761726465644f6e4379636c650000000000000081525060190190506040516020818303038152906040526040518082805190602001908083835b602083106114f95780518252601f1990920191602091820191016114da565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff19169415159490941790935550505050565b600081101561155457600080fd5b806002600060405160200180807f72657761726465644f6e4379636c650000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b602083106115c85780518252601f1990920191602091820191016115a9565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000209390935550505050565b6000808383111561161957600080fd5b5050900390565b60008282018381101561145757600080fd5b600081101561164057600080fd5b806002600060405160200180807f746f74616c537570706c79000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052604051808280519060200190808383602083106115c85780518252601f1990920191602091820191016115a9565b60008115156116c157600080fd5b81838115156116cc57fe5b069392505050565b61170f670de0b6b3a76400006108e66116eb610903565b6108e661170760646108e6670de0b6b3a76400006108da610b82565b6108da61099b565b6002600060405160200180807f626c6f636b526577617264416d6f756e7400000000000000000000000000000081525060110190506040516020818303038152906040526040518082805190602001908083835b602083106117825780518252601f199092019160209182019101611763565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002093909355505050565b806004600060405160200180807f53595354454d5f41444452455353000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b602083106118365780518252601f199092019160209182019101611817565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03959095169490941790935550505050565b806006600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d019050604051602081830303815290604052604051808280519060200190808383602083106114f95780518252601f1990920191602091820191016114da5600a165627a7a72305820f42af149f1f2399ef8c0b2dff2f03206614d03f430c27888862756f336634b880029
Deployed ByteCode
0x6080604052600436106100cc5763ffffffff60e060020a6000350416632e0f262581146100d1578063392e53cd146100f8578063537cc17c146101215780635c3be315146101365780635dba8c4a1461014b57806363037afc146101605780636d20d6ae14610181578063741de14814610196578063b1f0c8e1146101ab578063c4e41b22146101c2578063d37db1d2146101d7578063d56f4f28146101ec578063d5a9577114610201578063ec15a5e614610216578063f91c289814610247578063fe4b84df1461030c575b600080fd5b3480156100dd57600080fd5b506100e6610324565b60408051918252519081900360200190f35b34801561010457600080fd5b5061010d610330565b604080519115158252519081900360200190f35b34801561012d57600080fd5b506100e66103e8565b34801561014257600080fd5b5061010d61049d565b34801561015757600080fd5b506100e6610617565b34801561016c57600080fd5b506100e6600160a060020a036004351661068b565b34801561018d57600080fd5b506100e66108fe565b3480156101a257600080fd5b506100e6610903565b3480156101b757600080fd5b506101c061090a565b005b3480156101ce57600080fd5b506100e661099b565b3480156101e357600080fd5b506100e6610a0f565b3480156101f857600080fd5b506101c0610a16565b34801561020d57600080fd5b506100e6610b82565b34801561022257600080fd5b5061022b610b87565b60408051600160a060020a039092168252519081900360200190f35b34801561025357600080fd5b506102736024600480358281019290820135918135918201910135610c45565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156102b757818101518382015260200161029f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156102f65781810151838201526020016102de565b5050505090500194505050505060405180910390f35b34801561031857600080fd5b506101c0600435611310565b670de0b6b3a764000081565b60006006600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b602083106103a55780518252601f199092019160209182019101610386565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff16949350505050565b60006002600060405160200180807f72657761726465644f6e4379636c650000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b6020831061045d5780518252601f19909201916020918201910161043e565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054949350505050565b60006104a7610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156104e457600080fd5b505af11580156104f8573d6000803e3d6000fd5b505050506040513d602081101561050e57600080fd5b5051604080517f8d4e40830000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921691638d4e4083916004808201926020929091908290030181600087803b15801561056d57600080fd5b505af1158015610581573d6000803e3d6000fd5b505050506040513d602081101561059757600080fd5b5051801561061257506006600060405160200180807f73686f756c64456d697452657761726465644f6e4379636c65000000000000008152506019019050604051602081830303815290604052604051808280519060200190808383602083106103a55780518252601f199092019160209182019101610386565b905090565b60006002600060405160200180807f626c6f636b526577617264416d6f756e7400000000000000000000000000000081525060110190506040516020818303038152906040526040518082805190602001908083836020831061045d5780518252601f19909201916020918201910161043e565b600080600080600061069b610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156106d857600080fd5b505af11580156106ec573d6000803e3d6000fd5b505050506040513d602081101561070257600080fd5b5051604080517fbf135267000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519296509086169163bf135267916024808201926020929091908290030181600087803b15801561076c57600080fd5b505af1158015610780573d6000803e3d6000fd5b505050506040513d602081101561079657600080fd5b5051604080517f94409a560000000000000000000000000000000000000000000000000000000081529051919450600160a060020a038616916394409a56916004808201926020929091908290030181600087803b1580156107f757600080fd5b505af115801561080b573d6000803e3d6000fd5b505050506040513d602081101561082157600080fd5b5051604080517f40c9cdeb0000000000000000000000000000000000000000000000000000000081529051919350600160a060020a038616916340c9cdeb916004808201926020929091908290030181600087803b15801561088257600080fd5b505af1158015610896573d6000803e3d6000fd5b505050506040513d60208110156108ac57600080fd5b505190508115156108c6576108bf610617565b94506108f5565b6108f2826108e6836108da876108da610617565b9063ffffffff61142916565b9063ffffffff61146216565b94505b50505050919050565b600281565b6220148090565b610912610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561094f57600080fd5b505af1158015610963573d6000803e3d6000fd5b505050506040513d602081101561097957600080fd5b5051600160a060020a0316331461098f57600080fd5b6109996001611485565b565b60006002600060405160200180807f746f74616c537570706c79000000000000000000000000000000000000000000815250600b0190506040516020818303038152906040526040518082805190602001908083836020831061045d5780518252601f19909201916020918201910161043e565b6220148081565b610a1e610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a5b57600080fd5b505af1158015610a6f573d6000803e3d6000fd5b505050506040513d6020811015610a8557600080fd5b5051604080517ffacd743b0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a039092169163facd743b916024808201926020929091908290030181600087803b158015610aea57600080fd5b505af1158015610afe573d6000803e3d6000fd5b505050506040513d6020811015610b1457600080fd5b50511515610b2157600080fd5b610b2961049d565b1515610b3457600080fd5b7f5c0daed232a37723b040b8aa1c0b060b1d5fb3dea06a55fd30c35cab3e8fc3d7610b5d6103e8565b60408051918252519081900360200190a1610b786000611485565b6109996000611546565b600290565b60006004600060405160200180807f70726f787953746f726167650000000000000000000000000000000000000000815250600c0190506040516020818303038152906040526040518082805190602001908083835b60208310610bfc5780518252601f199092019160209182019101610bdd565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316949350505050565b606080600060608060608060006004600060405160200180807f53595354454d5f41444452455353000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b60208310610cc55780518252601f199092019160209182019101610ca6565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a031633149250610d1691505057600080fd5b8a8914610d2257600080fd5b60018b14610d2f57600080fd5b89896000818110610d3c57fe5b9050602002013561ffff1661ffff166000141515610d5957600080fd5b610d7e8c8c6000818110610d6957fe5b90506020020135600160a060020a031661068b565b9550610d88610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610dc557600080fd5b505af1158015610dd9573d6000803e3d6000fd5b505050506040513d6020811015610def57600080fd5b5051600160a060020a0316636a28f12f8d8d6000818110610e0c57fe5b90506020020135600160a060020a0316886040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015610e6f57600080fd5b505af1158015610e83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015610eac57600080fd5b810190808051640100000000811115610ec457600080fd5b82016020810184811115610ed757600080fd5b8151856020820283011164010000000082111715610ef457600080fd5b50509291906020018051640100000000811115610f1057600080fd5b82016020810184811115610f2357600080fd5b8151856020820283011164010000000082111715610f4057600080fd5b5050929190505050945094508451600101604051908082528060200260200182016040528015610f7a578160200160208202803883390190505b5092508251604051908082528060200260200182016040528015610fa8578160200160208202803883390190505b5091508b8b6000818110610fb857fe5b90506020020135600160a060020a0316836000815181101515610fd757fe5b600160a060020a039092166020928302909101909101528151869083906000908110610fff57fe5b602090810290910101525060015b845181116110eb57846001820381518110151561102657fe5b90602001906020020151838281518110151561103e57fe5b600160a060020a0390921660209283029091019091015283518490600019830190811061106757fe5b90602001906020020151828281518110151561107f57fe5b6020908102909101015281516110ca9083908390811061109b57fe5b906020019060200201518360008151811015156110b457fe5b602090810290910101519063ffffffff61160916565b8260008151811015156110d957fe5b6020908102909101015260010161100d565b61110b611106876110fa6103e8565b9063ffffffff61162016565b611546565b61111f61111a876110fa61099b565b611632565b61113761112a610903565b439063ffffffff6116b316565b1515611145576111456116d4565b61114d610b87565b600160a060020a031663179e740b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561118a57600080fd5b505af115801561119e573d6000803e3d6000fd5b505050506040513d60208110156111b457600080fd5b5051600160a060020a03166385cd84648d8d60008181106111d157fe5b90506020020135600160a060020a03166040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b15801561122c57600080fd5b505af1158015611240573d6000803e3d6000fd5b505050507fb747d4e9a0b39cc47496d84b42e4066ba8b8a0b89776528bcec4ac2997e224538383604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156112ab578181015183820152602001611293565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156112ea5781810151838201526020016112d2565b5050505090500194505050505060405180910390a150909a909950975050505050505050565b6004600060405160200180807f6f776e657200000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040526040518082805190602001908083835b602083106113835780518252601f199092019160209182019101611364565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316331492506113d491505057600080fd5b6113dc610330565b156113e657600080fd5b61140373fffffffffffffffffffffffffffffffffffffffe6117c2565b61140c81611632565b611414610b78565b61141c6116d4565b611426600161189f565b50565b60008083151561143c576000915061145b565b5082820282848281151561144c57fe5b041461145757600080fd5b8091505b5092915050565b60008080831161147157600080fd5b828481151561147c57fe5b04949350505050565b806006600060405160200180807f73686f756c64456d697452657761726465644f6e4379636c650000000000000081525060190190506040516020818303038152906040526040518082805190602001908083835b602083106114f95780518252601f1990920191602091820191016114da565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff19169415159490941790935550505050565b600081101561155457600080fd5b806002600060405160200180807f72657761726465644f6e4379636c650000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b602083106115c85780518252601f1990920191602091820191016115a9565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000209390935550505050565b6000808383111561161957600080fd5b5050900390565b60008282018381101561145757600080fd5b600081101561164057600080fd5b806002600060405160200180807f746f74616c537570706c79000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052604051808280519060200190808383602083106115c85780518252601f1990920191602091820191016115a9565b60008115156116c157600080fd5b81838115156116cc57fe5b069392505050565b61170f670de0b6b3a76400006108e66116eb610903565b6108e661170760646108e6670de0b6b3a76400006108da610b82565b6108da61099b565b6002600060405160200180807f626c6f636b526577617264416d6f756e7400000000000000000000000000000081525060110190506040516020818303038152906040526040518082805190602001908083835b602083106117825780518252601f199092019160209182019101611763565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002093909355505050565b806004600060405160200180807f53595354454d5f41444452455353000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b602083106118365780518252601f199092019160209182019101611817565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03959095169490941790935550505050565b806006600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d019050604051602081830303815290604052604051808280519060200190808383602083106114f95780518252601f1990920191602091820191016114da5600a165627a7a72305820f42af149f1f2399ef8c0b2dff2f03206614d03f430c27888862756f336634b880029