- Contract name:
- DIDRegistry
- Optimization enabled
- false
- Compiler version
- v0.6.12+commit.27d51765
- EVM Version
- petersburg
- Verified at
- 2022-10-24T01:59:23.782683Z
Constructor Arguments
0000000000000000000000000000000000000000000000000000000000000e10
Arg [0] (uint256) : 3600
Contract source code
//SPDX-License-Identifier: UNLICENSED pragma solidity >=0.6.0 <0.7.0; library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { 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; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } interface IDIDRegistry { struct DIDConfig { uint currentController; bool automaticRotation; uint keyRotationTime; } event DIDControllerChanged( address indexed identity, address controller, uint previousChange ); event DIDAttributeChanged( address indexed identity, bytes name, bytes value, uint validTo, uint previousChange ); function addController(address identity, address controller) external; function removeController(address identity, address controller) external; function changeController(address identity, address newController) external; function changeControllerSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, address newController) external; function setAttribute(address identity, bytes memory name, bytes memory value, uint validity) external; function setAttributeSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes memory name, bytes memory value, uint validity) external; function revokeAttribute(address identity, bytes memory name, bytes memory value) external; function revokeAttributeSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes memory name, bytes memory value) external; function enableKeyRotation (address identity, uint keyRotationTime) external; function disableKeyRotation (address identity) external; } contract DIDRegistry is IDIDRegistry { using SafeMath for uint256; mapping(address => address[]) public controllers; mapping(address => DIDConfig) private configs; mapping(address => uint) public changed; mapping(address => uint) public nonce; uint private minKeyRotationTime; constructor( uint _minKeyRotationTime ) public { minKeyRotationTime = _minKeyRotationTime; } modifier onlyController(address identity, address actor) { require(actor == identityController(identity)); _; } function getControllers() public view returns (address[] memory) { return controllers[msg.sender]; } function identityController(address identity) public view returns (address) { uint len = controllers[identity].length; if (len == 0) return identity; if (len == 1) return controllers[identity][0]; DIDConfig storage config = configs[identity]; address controller = address(0); if( config.automaticRotation ){ uint currentController = block.timestamp.div( config.keyRotationTime ).mod( len ); controller = controllers[identity][currentController]; } else { if( config.currentController >= len ){ controller = controllers[identity][0]; } else { controller = controllers[identity][config.currentController]; } } if (controller != address(0)) return controller; return identity; } function checkSignature(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes32 hash) internal returns (address) { address signer = ecrecover(hash, sigV, sigR, sigS); require(signer == identityController(identity)); nonce[signer]++; return signer; } function setCurrentController(address identity, uint index) internal { DIDConfig storage config = configs[identity]; config.currentController = index; } function _getControllerIndex(address identity, address controller) internal view returns (int) { for (uint i = 0; i < controllers[identity].length; i++) { if (controllers[identity][i] == controller) { return int(i); } } return - 1; } function addController(address identity, address actor, address newController) internal onlyController(identity, actor) { int controllerIndex = _getControllerIndex(identity, newController); if (controllerIndex < 0) { if( controllers[identity].length == 0 ){ controllers[identity].push( identity ); } controllers[identity].push( newController ); } } function removeController(address identity, address actor, address controller) internal onlyController(identity, actor) { require( controllers[identity].length > 1, 'You need at least two controllers to delete' ); require( identityController(identity) != controller , 'You cannot delete current controller' ); int controllerIndex = _getControllerIndex(identity, controller); require( controllerIndex >= 0, 'Controller not exist' ); uint len = controllers[identity].length; address lastController = controllers[identity][len - 1]; controllers[identity][uint(controllerIndex)] = lastController; if( lastController == identityController(identity) ){ configs[identity].currentController = uint(controllerIndex); } delete controllers[identity][len - 1]; controllers[identity].pop(); } function changeController(address identity, address actor, address newController) internal onlyController(identity, actor) { int controllerIndex = _getControllerIndex(identity, newController); require( controllerIndex >= 0, 'Controller not exist' ); if (controllerIndex >= 0) { setCurrentController(identity, uint(controllerIndex)); emit DIDControllerChanged(identity, newController, changed[identity]); changed[identity] = block.number; } } function enableKeyRotation(address identity, address actor, uint keyRotationTime) internal onlyController(identity, actor) { require( keyRotationTime >= minKeyRotationTime, 'Invalid minimum key rotation time' ); configs[identity].automaticRotation = true; configs[identity].keyRotationTime = keyRotationTime; } function disableKeyRotation(address identity, address actor) internal onlyController(identity, actor) { configs[identity].automaticRotation = false; } function addController(address identity, address controller) external override { addController(identity, msg.sender, controller); } function removeController(address identity, address controller) external override { removeController(identity, msg.sender, controller); } function changeController(address identity, address newController) external override { changeController(identity, msg.sender, newController); } function changeControllerSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, address newController) external override { bytes32 hash = keccak256(abi.encodePacked(byte(0x19), byte(0), this, nonce[identityController(identity)], identity, "changeController", newController)); changeController(identity, checkSignature(identity, sigV, sigR, sigS, hash), newController); } function setAttribute(address identity, address actor, bytes memory name, bytes memory value, uint validity) internal onlyController(identity, actor) { emit DIDAttributeChanged(identity, name, value, block.timestamp + validity, changed[identity]); changed[identity] = block.number; } function setAttribute(address identity, bytes memory name, bytes memory value, uint validity) external override { setAttribute(identity, msg.sender, name, value, validity); } function setAttributeSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes memory name, bytes memory value, uint validity) external override { bytes32 hash = keccak256(abi.encodePacked(byte(0x19), byte(0), this, nonce[identityController(identity)], identity, "setAttribute", name, value, validity)); setAttribute(identity, checkSignature(identity, sigV, sigR, sigS, hash), name, value, validity); } function revokeAttribute(address identity, address actor, bytes memory name, bytes memory value) internal onlyController(identity, actor) { emit DIDAttributeChanged(identity, name, value, 0, changed[identity]); changed[identity] = block.number; } function revokeAttribute(address identity, bytes memory name, bytes memory value) external override { revokeAttribute(identity, msg.sender, name, value); } function revokeAttributeSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes memory name, bytes memory value) external override { bytes32 hash = keccak256(abi.encodePacked(byte(0x19), byte(0), this, nonce[identityController(identity)], identity, "revokeAttribute", name, value)); revokeAttribute(identity, checkSignature(identity, sigV, sigR, sigS, hash), name, value); } function enableKeyRotation(address identity, uint keyRotationTime) external override { enableKeyRotation(identity, msg.sender, keyRotationTime); } function disableKeyRotation(address identity) external override { disableKeyRotation(identity, msg.sender); } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"uint256","name":"_minKeyRotationTime","internalType":"uint256"}]},{"type":"event","name":"DIDAttributeChanged","inputs":[{"type":"address","name":"identity","internalType":"address","indexed":true},{"type":"bytes","name":"name","internalType":"bytes","indexed":false},{"type":"bytes","name":"value","internalType":"bytes","indexed":false},{"type":"uint256","name":"validTo","internalType":"uint256","indexed":false},{"type":"uint256","name":"previousChange","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DIDControllerChanged","inputs":[{"type":"address","name":"identity","internalType":"address","indexed":true},{"type":"address","name":"controller","internalType":"address","indexed":false},{"type":"uint256","name":"previousChange","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addController","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"address","name":"controller","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeController","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"address","name":"newController","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeControllerSigned","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"uint8","name":"sigV","internalType":"uint8"},{"type":"bytes32","name":"sigR","internalType":"bytes32"},{"type":"bytes32","name":"sigS","internalType":"bytes32"},{"type":"address","name":"newController","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"changed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"controllers","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disableKeyRotation","inputs":[{"type":"address","name":"identity","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableKeyRotation","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"uint256","name":"keyRotationTime","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getControllers","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"identityController","inputs":[{"type":"address","name":"identity","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonce","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeController","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"address","name":"controller","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeAttribute","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"bytes","name":"name","internalType":"bytes"},{"type":"bytes","name":"value","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeAttributeSigned","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"uint8","name":"sigV","internalType":"uint8"},{"type":"bytes32","name":"sigR","internalType":"bytes32"},{"type":"bytes32","name":"sigS","internalType":"bytes32"},{"type":"bytes","name":"name","internalType":"bytes"},{"type":"bytes","name":"value","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAttribute","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"bytes","name":"name","internalType":"bytes"},{"type":"bytes","name":"value","internalType":"bytes"},{"type":"uint256","name":"validity","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAttributeSigned","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"uint8","name":"sigV","internalType":"uint8"},{"type":"bytes32","name":"sigR","internalType":"bytes32"},{"type":"bytes32","name":"sigS","internalType":"bytes32"},{"type":"bytes","name":"name","internalType":"bytes"},{"type":"bytes","name":"value","internalType":"bytes"},{"type":"uint256","name":"validity","internalType":"uint256"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b506040516129c43803806129c48339818101604052602081101561003357600080fd5b810190808051906020019092919050505080600481905550506129698061005b6000396000f3fe608060405234801561001057600080fd5b50600436106100f45760003560e01c8063921605e111610097578063ccbfa49611610066578063ccbfa4961461077a578063dff0d6f4146108f6578063f96d0f9f14610a89578063ffb628e214610ae1576100f4565b8063921605e1146104b85780639478c0d114610506578063b4e8a6c41461057e578063c7b2864d146105dd576100f4565b80633e11e378116100d35780633e11e378146102055780634303951b1461026957806370ae92d2146102ee5780638dd8305614610346576100f4565b8062bb9412146100f957806322b6be681461015d5780632bb88442146101a1575b600080fd5b61015b6004803603604081101561010f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b4f565b005b61019f6004803603602081101561017357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b5e565b005b610203600480360360408110156101b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b6b565b005b6102676004803603604081101561021b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b7a565b005b6102ec600480360360a081101561027f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b89565b005b6103306004803603602081101561030457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d01565b6040518082815260200191505060405180910390f35b6104b66004803603606081101561035c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561039957600080fd5b8201836020820111156103ab57600080fd5b803590602001918460018302840111640100000000831117156103cd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561043057600080fd5b82018360208201111561044257600080fd5b8035906020019184600183028401116401000000008311171561046457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610d19565b005b610504600480360360408110156104ce57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d2a565b005b6105526004803603604081101561051c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d39565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610586610d84565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105c95780820151818401526020810190506105ae565b505050509050019250505060405180910390f35b610778600480360360e08110156105f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561065157600080fd5b82018360208201111561066357600080fd5b8035906020019184600183028401116401000000008311171561068557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156106e857600080fd5b8201836020820111156106fa57600080fd5b8035906020019184600183028401116401000000008311171561071c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050610e4e565b005b6108f46004803603608081101561079057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156107cd57600080fd5b8201836020820111156107df57600080fd5b8035906020019184600183028401116401000000008311171561080157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561086457600080fd5b82018360208201111561087657600080fd5b8035906020019184600183028401116401000000008311171561089857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611057565b005b610a87600480360360c081101561090c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561096a57600080fd5b82018360208201111561097c57600080fd5b8035906020019184600183028401116401000000008311171561099e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a0157600080fd5b820183602082011115610a1357600080fd5b80359060200191846001830284011164010000000083111715610a3557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061106a565b005b610acb60048036036020811015610a9f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611269565b6040518082815260200191505060405180910390f35b610b2360048036036020811015610af757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611281565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b5a8233836115b3565b5050565b610b68813361179e565b50565b610b76823383611841565b5050565b610b85823383611d05565b5050565b6000601960f81b600060f81b3060036000610ba38b611281565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054898660405160200180877effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018573ffffffffffffffffffffffffffffffffffffffff1660601b81526014018481526020018373ffffffffffffffffffffffffffffffffffffffff1660601b8152601401807f6368616e6765436f6e74726f6c6c6572000000000000000000000000000000008152506010018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019650505050505050604051602081830303815290604052805190602001209050610cf986610cf38888888887611ed6565b84611d05565b505050505050565b60036020528060005260406000206000915090505481565b610d2583338484611fdb565b505050565b610d358233836121d9565b5050565b60006020528160005260406000208181548110610d5257fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610e4457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610dfa575b5050505050905090565b6000601960f81b600060f81b3060036000610e688d611281565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548b88888860405160200180897effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101887effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018773ffffffffffffffffffffffffffffffffffffffff1660601b81526014018681526020018573ffffffffffffffffffffffffffffffffffffffff1660601b8152601401807f7365744174747269627574650000000000000000000000000000000000000000815250600c0184805190602001908083835b60208310610f995780518252602082019150602081019050602083039250610f76565b6001836020036101000a03801982511681845116808217855250505050505090500183805190602001908083835b60208310610fea5780518252602082019150602081019050602083039250610fc7565b6001836020036101000a0380198251168184511680821785525050505050509050018281526020019850505050505050505060405160208183030381529060405280519060200120905061104d886110458a8a8a8a87611ed6565b86868661231e565b5050505050505050565b611064843385858561231e565b50505050565b6000601960f81b600060f81b30600360006110848c611281565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548a878760405160200180887effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101877effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1660601b8152601401807f7265766f6b654174747269627574650000000000000000000000000000000000815250600f0183805190602001908083835b602083106111b45780518252602082019150602081019050602083039250611191565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061120557805182526020820191506020810190506020830392506111e2565b6001836020036101000a038019825116818451168082178552505050505050905001975050505050505050604051602081830303815290604052805190602001209050611260876112598989898987611ed6565b8585611fdb565b50505050505050565b60026020528060005260406000206000915090505481565b6000806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114156112da57829150506115ae565b6001811415611360576000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154811061132d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150506115ae565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160010160009054906101000a900460ff16156114655760006113e7846113d985600201544261251e90919063ffffffff16565b61256890919063ffffffff16565b90506000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061143257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050611568565b828260000154106114ec576000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815481106114ba57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611567565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082600001548154811061153957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115a7578093505050506115ae565b8493505050505b919050565b82826115be82611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115f557600080fd5b600061160186856125b2565b905060008112156117965760008060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014156116f6576000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020869080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050505050565b81816117a982611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117e057600080fd5b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555050505050565b828261184c82611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461188357600080fd5b60016000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490501161191d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180612909602b913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1661193d86611281565b73ffffffffffffffffffffffffffffffffffffffff1614156119aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806128c46024913960400191505060405180910390fd5b60006119b686856125b2565b90506000811215611a2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726f6c6c6572206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b60008060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001830381548110611ac357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050806000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611b3a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b8b88611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c065782600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001830381548110611c5257fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480611cc657fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555050505050505050565b8282611d1082611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d4757600080fd5b6000611d5386856125b2565b90506000811215611dcc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726f6c6c6572206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b60008112611ece57611dde86826126eb565b8573ffffffffffffffffffffffffffffffffffffffff167f2a7278c7e47d91c392e2d4f854ebe76d04458b3f431d27ef2e64707e68615e4885600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a243600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050505050565b60008060018387878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611f33573d6000803e3d6000fd5b505050602060405103519050611f4887611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f7f57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055508091505095945050505050565b8383611fe682611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461201d57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff167f011b18dd995a3172c6dbe3b65ce383beec725369bb7cc6c16721013f9f993a7885856000600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051808060200180602001858152602001848152602001838103835287818151815260200191508051906020019080838360005b838110156120e95780820151818401526020810190506120ce565b50505050905090810190601f1680156121165780820380516001836020036101000a031916815260200191505b50838103825286818151815260200191508051906020019080838360005b8381101561214f578082015181840152602081019050612134565b50505050905090810190601f16801561217c5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a243600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050505050565b82826121e482611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461221b57600080fd5b600454831015612276576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806128e86021913960400191505060405180910390fd5b60018060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555082600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050505050565b848461232982611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461236057600080fd5b8673ffffffffffffffffffffffffffffffffffffffff167f011b18dd995a3172c6dbe3b65ce383beec725369bb7cc6c16721013f9f993a788686864201600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051808060200180602001858152602001848152602001838103835287818151815260200191508051906020019080838360005b8381101561242d578082015181840152602081019050612412565b50505050905090810190601f16801561245a5780820380516001836020036101000a031916815260200191505b50838103825286818151815260200191508051906020019080838360005b83811015612493578082015181840152602081019050612478565b50505050905090810190601f1680156124c05780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a243600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050565b600061256083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061273c565b905092915050565b60006125aa83836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815250612802565b905092915050565b600080600090505b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156126c0578273ffffffffffffffffffffffffffffffffffffffff166000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061266357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126b357809150506126e5565b80806001019150506125ba565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505b92915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050818160000181905550505050565b600080831182906127e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127ad578082015181840152602081019050612792565b50505050905090810190601f1680156127da5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816127f457fe5b049050809150509392505050565b60008083141582906128af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612874578082015181840152602081019050612859565b50505050905090810190601f1680156128a15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508284816128b957fe5b069050939250505056fe596f752063616e6e6f742064656c6574652063757272656e7420636f6e74726f6c6c6572496e76616c6964206d696e696d756d206b657920726f746174696f6e2074696d65596f75206e656564206174206c656173742074776f20636f6e74726f6c6c65727320746f2064656c657465a2646970667358221220ee33115d049a7fc56e559eaf6a21aa2d82386b6b6b7410aaa2231c6e86c4a55964736f6c634300060c00330000000000000000000000000000000000000000000000000000000000000e10
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100f45760003560e01c8063921605e111610097578063ccbfa49611610066578063ccbfa4961461077a578063dff0d6f4146108f6578063f96d0f9f14610a89578063ffb628e214610ae1576100f4565b8063921605e1146104b85780639478c0d114610506578063b4e8a6c41461057e578063c7b2864d146105dd576100f4565b80633e11e378116100d35780633e11e378146102055780634303951b1461026957806370ae92d2146102ee5780638dd8305614610346576100f4565b8062bb9412146100f957806322b6be681461015d5780632bb88442146101a1575b600080fd5b61015b6004803603604081101561010f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b4f565b005b61019f6004803603602081101561017357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b5e565b005b610203600480360360408110156101b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b6b565b005b6102676004803603604081101561021b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b7a565b005b6102ec600480360360a081101561027f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b89565b005b6103306004803603602081101561030457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d01565b6040518082815260200191505060405180910390f35b6104b66004803603606081101561035c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561039957600080fd5b8201836020820111156103ab57600080fd5b803590602001918460018302840111640100000000831117156103cd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561043057600080fd5b82018360208201111561044257600080fd5b8035906020019184600183028401116401000000008311171561046457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610d19565b005b610504600480360360408110156104ce57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d2a565b005b6105526004803603604081101561051c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d39565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610586610d84565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105c95780820151818401526020810190506105ae565b505050509050019250505060405180910390f35b610778600480360360e08110156105f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561065157600080fd5b82018360208201111561066357600080fd5b8035906020019184600183028401116401000000008311171561068557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156106e857600080fd5b8201836020820111156106fa57600080fd5b8035906020019184600183028401116401000000008311171561071c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050610e4e565b005b6108f46004803603608081101561079057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156107cd57600080fd5b8201836020820111156107df57600080fd5b8035906020019184600183028401116401000000008311171561080157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561086457600080fd5b82018360208201111561087657600080fd5b8035906020019184600183028401116401000000008311171561089857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611057565b005b610a87600480360360c081101561090c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561096a57600080fd5b82018360208201111561097c57600080fd5b8035906020019184600183028401116401000000008311171561099e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a0157600080fd5b820183602082011115610a1357600080fd5b80359060200191846001830284011164010000000083111715610a3557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061106a565b005b610acb60048036036020811015610a9f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611269565b6040518082815260200191505060405180910390f35b610b2360048036036020811015610af757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611281565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b5a8233836115b3565b5050565b610b68813361179e565b50565b610b76823383611841565b5050565b610b85823383611d05565b5050565b6000601960f81b600060f81b3060036000610ba38b611281565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054898660405160200180877effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018573ffffffffffffffffffffffffffffffffffffffff1660601b81526014018481526020018373ffffffffffffffffffffffffffffffffffffffff1660601b8152601401807f6368616e6765436f6e74726f6c6c6572000000000000000000000000000000008152506010018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019650505050505050604051602081830303815290604052805190602001209050610cf986610cf38888888887611ed6565b84611d05565b505050505050565b60036020528060005260406000206000915090505481565b610d2583338484611fdb565b505050565b610d358233836121d9565b5050565b60006020528160005260406000208181548110610d5257fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610e4457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610dfa575b5050505050905090565b6000601960f81b600060f81b3060036000610e688d611281565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548b88888860405160200180897effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101887effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018773ffffffffffffffffffffffffffffffffffffffff1660601b81526014018681526020018573ffffffffffffffffffffffffffffffffffffffff1660601b8152601401807f7365744174747269627574650000000000000000000000000000000000000000815250600c0184805190602001908083835b60208310610f995780518252602082019150602081019050602083039250610f76565b6001836020036101000a03801982511681845116808217855250505050505090500183805190602001908083835b60208310610fea5780518252602082019150602081019050602083039250610fc7565b6001836020036101000a0380198251168184511680821785525050505050509050018281526020019850505050505050505060405160208183030381529060405280519060200120905061104d886110458a8a8a8a87611ed6565b86868661231e565b5050505050505050565b611064843385858561231e565b50505050565b6000601960f81b600060f81b30600360006110848c611281565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548a878760405160200180887effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101877effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1660601b8152601401807f7265766f6b654174747269627574650000000000000000000000000000000000815250600f0183805190602001908083835b602083106111b45780518252602082019150602081019050602083039250611191565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061120557805182526020820191506020810190506020830392506111e2565b6001836020036101000a038019825116818451168082178552505050505050905001975050505050505050604051602081830303815290604052805190602001209050611260876112598989898987611ed6565b8585611fdb565b50505050505050565b60026020528060005260406000206000915090505481565b6000806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114156112da57829150506115ae565b6001811415611360576000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154811061132d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150506115ae565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160010160009054906101000a900460ff16156114655760006113e7846113d985600201544261251e90919063ffffffff16565b61256890919063ffffffff16565b90506000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061143257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050611568565b828260000154106114ec576000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815481106114ba57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611567565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082600001548154811061153957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115a7578093505050506115ae565b8493505050505b919050565b82826115be82611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115f557600080fd5b600061160186856125b2565b905060008112156117965760008060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014156116f6576000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020869080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050505050565b81816117a982611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117e057600080fd5b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555050505050565b828261184c82611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461188357600080fd5b60016000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490501161191d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180612909602b913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1661193d86611281565b73ffffffffffffffffffffffffffffffffffffffff1614156119aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806128c46024913960400191505060405180910390fd5b60006119b686856125b2565b90506000811215611a2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726f6c6c6572206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b60008060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001830381548110611ac357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050806000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110611b3a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b8b88611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c065782600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055505b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001830381548110611c5257fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480611cc657fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555050505050505050565b8282611d1082611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d4757600080fd5b6000611d5386856125b2565b90506000811215611dcc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f436f6e74726f6c6c6572206e6f7420657869737400000000000000000000000081525060200191505060405180910390fd5b60008112611ece57611dde86826126eb565b8573ffffffffffffffffffffffffffffffffffffffff167f2a7278c7e47d91c392e2d4f854ebe76d04458b3f431d27ef2e64707e68615e4885600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a243600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050505050565b60008060018387878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611f33573d6000803e3d6000fd5b505050602060405103519050611f4887611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f7f57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919060010191905055508091505095945050505050565b8383611fe682611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461201d57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff167f011b18dd995a3172c6dbe3b65ce383beec725369bb7cc6c16721013f9f993a7885856000600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051808060200180602001858152602001848152602001838103835287818151815260200191508051906020019080838360005b838110156120e95780820151818401526020810190506120ce565b50505050905090810190601f1680156121165780820380516001836020036101000a031916815260200191505b50838103825286818151815260200191508051906020019080838360005b8381101561214f578082015181840152602081019050612134565b50505050905090810190601f16801561217c5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a243600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050505050565b82826121e482611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461221b57600080fd5b600454831015612276576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806128e86021913960400191505060405180910390fd5b60018060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555082600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050505050565b848461232982611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461236057600080fd5b8673ffffffffffffffffffffffffffffffffffffffff167f011b18dd995a3172c6dbe3b65ce383beec725369bb7cc6c16721013f9f993a788686864201600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051808060200180602001858152602001848152602001838103835287818151815260200191508051906020019080838360005b8381101561242d578082015181840152602081019050612412565b50505050905090810190601f16801561245a5780820380516001836020036101000a031916815260200191505b50838103825286818151815260200191508051906020019080838360005b83811015612493578082015181840152602081019050612478565b50505050905090810190601f1680156124c05780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a243600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050565b600061256083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061273c565b905092915050565b60006125aa83836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815250612802565b905092915050565b600080600090505b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156126c0578273ffffffffffffffffffffffffffffffffffffffff166000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061266357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126b357809150506126e5565b80806001019150506125ba565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505b92915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050818160000181905550505050565b600080831182906127e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127ad578082015181840152602081019050612792565b50505050905090810190601f1680156127da5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816127f457fe5b049050809150509392505050565b60008083141582906128af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612874578082015181840152602081019050612859565b50505050905090810190601f1680156128a15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508284816128b957fe5b069050939250505056fe596f752063616e6e6f742064656c6574652063757272656e7420636f6e74726f6c6c6572496e76616c6964206d696e696d756d206b657920726f746174696f6e2074696d65596f75206e656564206174206c656173742074776f20636f6e74726f6c6c65727320746f2064656c657465a2646970667358221220ee33115d049a7fc56e559eaf6a21aa2d82386b6b6b7410aaa2231c6e86c4a55964736f6c634300060c0033