UNPKG

@bitriel/governance

Version:

On-chain DAO governance for Bitriel Protocol

1,148 lines 150 kB
{ "_format": "hh-sol-artifact-1", "contractName": "BitrielGovernor", "sourceName": "contracts/BitrielGovernance.sol", "abi": [ { "inputs": [ { "internalType": "contract IVotes", "name": "_token", "type": "address" }, { "internalType": "contract TimelockController", "name": "_timelock", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "ProposalCanceled", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "proposer", "type": "address" }, { "indexed": false, "internalType": "address[]", "name": "targets", "type": "address[]" }, { "indexed": false, "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "indexed": false, "internalType": "string[]", "name": "signatures", "type": "string[]" }, { "indexed": false, "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, { "indexed": false, "internalType": "uint256", "name": "startBlock", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "endBlock", "type": "uint256" }, { "indexed": false, "internalType": "string", "name": "description", "type": "string" } ], "name": "ProposalCreated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "ProposalExecuted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "eta", "type": "uint256" } ], "name": "ProposalQueued", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "oldProposalThreshold", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newProposalThreshold", "type": "uint256" } ], "name": "ProposalThresholdSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "oldQuorumNumerator", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newQuorumNumerator", "type": "uint256" } ], "name": "QuorumNumeratorUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "oldTimelock", "type": "address" }, { "indexed": false, "internalType": "address", "name": "newTimelock", "type": "address" } ], "name": "TimelockChange", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "voter", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "indexed": false, "internalType": "uint8", "name": "support", "type": "uint8" }, { "indexed": false, "internalType": "uint256", "name": "weight", "type": "uint256" }, { "indexed": false, "internalType": "string", "name": "reason", "type": "string" } ], "name": "VoteCast", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "oldVotingDelay", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newVotingDelay", "type": "uint256" } ], "name": "VotingDelaySet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "oldVotingPeriod", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newVotingPeriod", "type": "uint256" } ], "name": "VotingPeriodSet", "type": "event" }, { "inputs": [], "name": "BALLOT_TYPEHASH", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "COUNTING_MODE", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "cancel", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "internalType": "uint8", "name": "support", "type": "uint8" } ], "name": "castVote", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "internalType": "uint8", "name": "support", "type": "uint8" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "castVoteBySig", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "internalType": "uint8", "name": "support", "type": "uint8" }, { "internalType": "string", "name": "reason", "type": "string" } ], "name": "castVoteWithReason", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "targets", "type": "address[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, { "internalType": "bytes32", "name": "descriptionHash", "type": "bytes32" } ], "name": "execute", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "execute", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "getActions", "outputs": [ { "internalType": "address[]", "name": "targets", "type": "address[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "string[]", "name": "signatures", "type": "string[]" }, { "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "internalType": "address", "name": "voter", "type": "address" } ], "name": "getReceipt", "outputs": [ { "components": [ { "internalType": "bool", "name": "hasVoted", "type": "bool" }, { "internalType": "uint8", "name": "support", "type": "uint8" }, { "internalType": "uint96", "name": "votes", "type": "uint96" } ], "internalType": "struct IGovernorCompatibilityBravo.Receipt", "name": "", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "blockNumber", "type": "uint256" } ], "name": "getVotes", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "hasVoted", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "targets", "type": "address[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, { "internalType": "bytes32", "name": "descriptionHash", "type": "bytes32" } ], "name": "hashProposal", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "latestProposalIds", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "proposalCount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "proposalDeadline", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "proposalEta", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "proposalSnapshot", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "proposalThreshold", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "proposals", "outputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "address", "name": "proposer", "type": "address" }, { "internalType": "uint256", "name": "eta", "type": "uint256" }, { "internalType": "uint256", "name": "startBlock", "type": "uint256" }, { "internalType": "uint256", "name": "endBlock", "type": "uint256" }, { "internalType": "uint256", "name": "forVotes", "type": "uint256" }, { "internalType": "uint256", "name": "againstVotes", "type": "uint256" }, { "internalType": "uint256", "name": "abstainVotes", "type": "uint256" }, { "internalType": "bool", "name": "canceled", "type": "bool" }, { "internalType": "bool", "name": "executed", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "targets", "type": "address[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, { "internalType": "string", "name": "description", "type": "string" } ], "name": "propose", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "targets", "type": "address[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "string[]", "name": "signatures", "type": "string[]" }, { "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, { "internalType": "string", "name": "description", "type": "string" } ], "name": "propose", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "targets", "type": "address[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, { "internalType": "bytes32", "name": "descriptionHash", "type": "bytes32" } ], "name": "queue", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "queue", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "blockNumber", "type": "uint256" } ], "name": "quorum", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "quorumDenominator", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "quorumNumerator", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "quorumVotes", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "relay", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "newProposalThreshold", "type": "uint256" } ], "name": "setProposalThreshold", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "newVotingDelay", "type": "uint256" } ], "name": "setVotingDelay", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "newVotingPeriod", "type": "uint256" } ], "name": "setVotingPeriod", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "state", "outputs": [ { "internalType": "enum IGovernor.ProposalState", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "timelock", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "token", "outputs": [ { "internalType": "contract IVotes", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "newQuorumNumerator", "type": "uint256" } ], "name": "updateQuorumNumerator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract TimelockController", "name": "newTimelock", "type": "address" } ], "name": "updateTimelock", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "version", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "votingDelay", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "votingPeriod", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "bytecode": "0x6101606040523480156200001257600080fd5b5060405162007f6e38038062007f6e8339818101604052810190620000389190620005b2565b80600483600161627060006040518060400160405280600f81526020017f4269747269656c476f7665726e6f720000000000000000000000000000000000815250806200008a620001f460201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000f38184846200023160201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050806000908051906020019062000157929190620004d4565b50506200016a836200026d60201b60201c565b6200017b82620002b460201b60201c565b6200018c816200034160201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050620001d9816200038860201b60201c565b50620001eb816200042a60201b60201c565b50505062000961565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200024e959493929190620006a1565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360025482604051620002a292919062000742565b60405180910390a18060028190555050565b60008111620002fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f19062000720565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600354826040516200032f92919062000742565b60405180910390a18060038190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600454826040516200037692919062000742565b60405180910390a18060048190555050565b62000398620004cb60201b60201c565b811115620003dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003d490620006fe565b60405180910390fd5b60006006549050816006819055507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200041e92919062000742565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516200047f92919062000674565b60405180910390a180600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006064905090565b828054620004e29062000804565b90600052602060002090601f01602090048101928262000506576000855562000552565b82601f106200052157805160ff191683800117855562000552565b8280016001018555821562000552579182015b828111156200055157825182559160200191906001019062000534565b5b50905062000561919062000565565b5090565b5b808211156200058057600081600090555060010162000566565b5090565b60008151905062000595816200092d565b92915050565b600081519050620005ac8162000947565b92915050565b60008060408385031215620005c657600080fd5b6000620005d68582860162000584565b9250506020620005e9858286016200059b565b9150509250929050565b620005fe8162000780565b82525050565b6200060f81620007a8565b82525050565b6000620006246043836200076f565b9150620006318262000869565b606082019050919050565b60006200064b6027836200076f565b91506200065882620008de565b604082019050919050565b6200066e81620007fa565b82525050565b60006040820190506200068b6000830185620005f3565b6200069a6020830184620005f3565b9392505050565b600060a082019050620006b8600083018862000604565b620006c7602083018762000604565b620006d6604083018662000604565b620006e5606083018562000663565b620006f46080830184620005f3565b9695505050505050565b60006020820190508181036000830152620007198162000615565b9050919050565b600060208201905081810360008301526200073b816200063c565b9050919050565b600060408201905062000759600083018562000663565b62000768602083018462000663565b9392505050565b600082825260208201905092915050565b60006200078d82620007da565b9050919050565b6000620007a182620007da565b9050919050565b6000819050919050565b6000620007bf8262000780565b9050919050565b6000620007d38262000794565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200081d57607f821691505b602082108114156200083457620008336200083a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b6200093881620007b2565b81146200094457600080fd5b50565b6200095281620007c6565b81146200095e57600080fd5b50565b60805160a05160c05160601c60e05161010051610120516101405160601c61759e620009d06000396000818161253b01528181613335015261343f015260006136c701526000613709015260006136e80152600061361d015260006136730152600061369c015261759e6000f3fe6080604052600436106102555760003560e01c806397c3d33411610139578063da95691a116100b6578063ea0217cf1161007a578063ea0217cf146109e3578063eb9019d414610a0c578063ece40cc114610a49578063f8ce560a14610a72578063fc0c546a14610aaf578063fe0d94c114610ada5761029b565b8063da95691a146108ea578063dd4e2ba514610927578063ddf0b00914610952578063deaaa7cc1461097b578063e23a9a52146109a65761029b565b8063c01f9e37116100fd578063c01f9e37146107f1578063c28bc2fa1461082e578063c59057e414610857578063d33219b414610894578063da35c664146108bf5761029b565b806397c3d3341461070a578063a7713a7014610735578063a890c91014610760578063ab58fb8e14610789578063b58131b0146107c65761029b565b8063328dd982116101d2578063438596321161019657806343859632146105c257806354fd4d50146105ff578063567813881461062a57806370b0f660146106675780637b3c71d3146106905780637d5e81e2146106cd5761029b565b8063328dd982146104b45780633932abb1146104f45780633bccf4fd1461051f5780633e4f49e61461055c57806340e58ee5146105995761029b565b8063160cbed711610219578063160cbed7146103a257806317977c61146103df57806324bc1a641461041c5780632656227d146104475780632d63f693146104775761029b565b8063013cf08b146102a057806301ffc9a7146102e657806302a251a31461032357806306f3f9e61461034e57806306fdde03146103775761029b565b3661029b573073ffffffffffffffffffffffffffffffffffffffff16610279610af6565b73ffffffffffffffffffffffffffffffffffffffff161461029957600080fd5b005b600080fd5b3480156102ac57600080fd5b506102c760048036038101906102c291906155a5565b610b05565b6040516102dd9a99989796959493929190616612565b60405180910390f35b3480156102f257600080fd5b5061030d60048036038101906103089190615553565b610c92565b60405161031a919061610f565b60405180910390f35b34801561032f57600080fd5b50610338610ca4565b6040516103459190616547565b60405180910390f35b34801561035a57600080fd5b50610375600480360381019061037091906155a5565b610cb3565b005b34801561038357600080fd5b5061038c610d3b565b604051610399919061624a565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906152a4565b610dcd565b6040516103d69190616547565b60405180910390f35b3480156103eb57600080fd5b50610406600480360381019061040191906151d3565b6110f1565b6040516104139190616547565b60405180910390f35b34801561042857600080fd5b50610431611109565b60405161043e9190616547565b60405180910390f35b610461600480360381019061045c91906152a4565b611125565b60405161046e9190616547565b60405180910390f35b34801561048357600080fd5b5061049e600480360381019061049991906155a5565b6112f0565b6040516104ab9190616547565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d691906155a5565b61135e565b6040516104eb94939291906160ae565b60405180910390f35b34801561050057600080fd5b5061050961161b565b6040516105169190616547565b60405180910390f35b34801561052b57600080fd5b50610546600480360381019061054191906156db565b61162a565b6040516105539190616547565b60405180910390f35b34801561056857600080fd5b50610583600480360381019061057e91906155a5565b6116b4565b604051610590919061622f565b60405180910390f35b3480156105a557600080fd5b506105c060048036038101906105bb91906155a5565b6116c6565b005b3480156105ce57600080fd5b506105e960048036038101906105e491906155f7565b611a5e565b6040516105f6919061610f565b60405180910390f35b34801561060b57600080fd5b50610614611acc565b604051610621919061624a565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c9190615633565b611b09565b60405161065e9190616547565b60405180910390f35b34801561067357600080fd5b5061068e600480360381019061068991906155a5565b611b3a565b005b34801561069c57600080fd5b506106b760048036038101906106b2919061566f565b611bc2565b6040516106c49190616547565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef919061534f565b611c2a565b6040516107019190616547565b60405180910390f35b34801561071657600080fd5b5061071f611ca0565b60405161072c9190616547565b60405180910390f35b34801561074157600080fd5b5061074a611ca9565b6040516107579190616547565b60405180910390f35b34801561076c57600080fd5b506107876004803603810190610782919061557c565b611cb3565b005b34801561079557600080fd5b506107b060048036038101906107ab91906155a5565b611d3b565b6040516107bd9190616547565b60405180910390f35b3480156107d257600080fd5b506107db611e17565b6040516107e89190616547565b60405180910390f35b3480156107fd57600080fd5b50610818600480360381019061081391906155a5565b611e26565b6040516108259190616547565b60405180910390f35b34801561083a57600080fd5b5061085560048036038101906108509190615238565b611e94565b005b34801561086357600080fd5b5061087e600480360381019061087991906152a4565b611f66565b60405161088b9190616547565b60405180910390f35b3480156108a057600080fd5b506108a9611fa2565b6040516108b69190615f09565b60405180910390f35b3480156108cb57600080fd5b506108d4611fcc565b6040516108e19190616547565b60405180910390f35b3480156108f657600080fd5b50610911600480360381019061090c9190615412565b611fd2565b60405161091e9190616547565b60405180910390f35b34801561093357600080fd5b5061093c612009565b604051610949919061624a565b60405180910390f35b34801561095e57600080fd5b50610979600480360381019061097491906155a5565b612046565b005b34801561098757600080fd5b506109906122fb565b60405161099d919061612a565b60405180910390f35b3480156109b257600080fd5b506109cd60048036038101906109c891906155f7565b61231f565b6040516109da919061652c565b60405180910390f35b3480156109ef57600080fd5b50610a0a6004803603810190610a0591906155a5565b612403565b005b348015610a1857600080fd5b50610a336004803603810190610a2e91906151fc565b61248b565b604051610a409190616547565b60405180910390f35b348015610a5557600080fd5b50610a706004803603810190610a6b91906155a5565b61249f565b005b348015610a7e57600080fd5b50610a996004803603810190610a9491906155a5565b612527565b604051610aa69190616547565b60405180910390f35b348015610abb57600080fd5b50610ac4612539565b604051610ad19190616214565b60405180910390f35b610af46004803603810190610aef91906155a5565b61255d565b005b6000610b00612812565b905090565b6000806000806000806000806000808a9950610b208b611d3b565b9750610b2b8b6112f0565b9650610b368b611e26565b95506000600560008d815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1699508060050154955080600601549450806007015493506000610b968d6116b4565b905060026007811115610bd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816007811115610c0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b149350600780811115610c47577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816007811115610c80577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14925050509193959799509193959799565b6000610c9d8261283c565b9050919050565b6000610cae6128b6565b905090565b610cbb610af6565b73ffffffffffffffffffffffffffffffffffffffff16610cd96128c0565b73ffffffffffffffffffffffffffffffffffffffff1614610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d269061628c565b60405180910390fd5b610d38816128c8565b50565b606060008054610d4a90616c8c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7690616c8c565b8015610dc35780601f10610d9857610100808354040283529160200191610dc3565b820191906000526020600020905b815481529060010190602001808311610da657829003601f168201915b5050505050905090565b600080610ddc86868686611f66565b905060046007811115610e18577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b610e21826116b4565b6007811115610e59577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e909061644c565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0357600080fd5b505afa158015610f17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b91906155ce565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401610fa1959493929190615fd0565b60206040518083038186803b158015610fb957600080fd5b505afa158015610fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff1919061552a565b6008600084815260200190815260200160002081905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b815260040161106e96959493929190616038565b600060405180830381600087803b15801561108857600080fd5b505af115801561109c573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426110ce919061699d565b6040516110dc9291906166ae565b60405180910390a18192505050949350505050565b600a6020528060005260406000206000915090505481565b600061112060014361111b9190616abc565b612527565b905090565b60008061113486868686611f66565b90506000611141826116b4565b90506004600781111561117d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160078111156111b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14806112325750600560078111156111f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816007811115611230577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b145b611271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112689061644c565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f826040516112ce9190616547565b60405180910390a16112e3828888888861295d565b8192505050949350505050565b600061134d600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612971565b67ffffffffffffffff169050919050565b6060806060806000600560008781526020019081526020016000209050806001018160020182600301836004018380548060200260200160405190810160405280929190818152602001828054801561140c57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116113c2575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561145e57602002820191906000526020600020905b81548152602001906001019080831161144a575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156115325783829060005260206000200180546114a590616c8c565b80601f01602080910402602001604051908101604052809291908181526020018280546114d190616c8c565b801561151e5780601f106114f35761010080835404028352916020019161151e565b820191906000526020600020905b81548152906001019060200180831161150157829003601f168201915b505050505081526020019060010190611486565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561160557838290600052602060002001805461157890616c8c565b80601f01602080910402602001604051908101604052809291908181526020018280546115a490616c8c565b80156115f15780601f106115c6576101008083540402835291602001916115f1565b820191906000526020600020905b8154815290600101906020018083116115d457829003601f168201915b505050505081526020019060010190611559565b5050505090509450945094509450509193509193565b600061162561297f565b905090565b60008061168b6116837f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f898960405160200161166893929190616198565b60405160208183030381529060405280519060200120612989565b8686866129a3565b90506116a8878288604051806020016040528060008152506129ce565b91505095945050505050565b60006116bf82612b6e565b9050919050565b60006005600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166117206128c0565b73ffffffffffffffffffffffffffffffffffffffff1614806117815750611745611e17565b61177f8260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660014361177a9190616abc565b61248b565b105b6117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b7906164ec565b60405180910390fd5b611a598160010180548060200260200160405190810160405280929190818152602001828054801561184757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117fd575b50505050508260020180548060200260200160405190810160405280929190818152602001828054801561189a57602002820191906000526020600020905b815481526020019060010190808311611886575b5050505050611a4f84600301805480602002602001604051908101604052809291908181526020016000905b828210156119725783829060005260206000200180546118e590616c8c565b80601f016020809104026020016040519081016040528092919081815260200182805461191190616c8c565b801561195e5780601f106119335761010080835404028352916020019161195e565b820191906000526020600020905b81548152906001019060200180831161194157829003601f168201915b5050505050815260200190600101906118c6565b5050505085600401805480602002602001604051908101604052809291908181526020016000905b82821015611a465783829060005260206000200180546119b990616c8c565b80601f01602080910402602001604051908101604052809291908181526020018280546119e590616c8c565b8015611a325780601f10611a0757610100808354040283529160200191611a32565b820191906000526020600020905b815481529060010190602001808311611a1557829003601f168201915b50505050508152602001906001019061199a565b50505050612dac565b8460090154612fcc565b505050565b60006005600084815260200190815260200160002060080160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16905092915050565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600080611b146128c0565b9050611b31848285604051806020016040528060008152506129ce565b91505092915050565b611b42610af6565b73ffffffffffffffffffffffffffffffffffffffff16611b606128c0565b73ffffffffffffffffffffffffffffffffffffffff1614611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad9061628c565b60405180910390fd5b611bbf81612fe4565b50565b600080611bcd6128c0565b9050611c1f86828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506129ce565b915050949350505050565b600060096000815480929190611c3f90616cef565b9190505550600954600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c9685858585613029565b9050949350505050565b60006064905090565b6000600654905090565b611cbb610af6565b73ffffffffffffffffffffffffffffffffffffffff16611cd96128c0565b73ffffffffffffffffffffffffffffffffffffffff1614611d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d269061628c565b60405180910390fd5b611d38816130ca565b50565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c443560086000868152602001908152602001600020546040518263ffffffff1660e01b8152600401611dac919061612a565b60206040518083038186803b158015611dc457600080fd5b505afa158015611dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfc91906155ce565b905060018114611e0c5780611e0f565b60005b915050919050565b6000611e21613169565b905090565b6000611e83600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612971565b67ffffffffffffffff169050919050565b611e9c610af6565b73ffffffffffffffffffffffffffffffffffffffff16611eba6128c0565b73ffffffffffffffffffffffffffffffffffffffff1614611f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f079061628c565b60405180910390fd5b611f5f8483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505085613173565b5050505050565b600084848484604051602001611f7f9493929190615f76565b6040516020818303038152906040528051906020012060001c9050949350505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b6000611fe9611fdf6128c0565b87878787876131a2565b611ffe8686611ff88787612dac565b85611c2a565b905095945050505050565b60606040518060400160405280601a81526020017f737570706f72743d627261766f2671756f72756d3d627261766f000000000000815250905090565b60006005600083815260200190815260200160002090506122f6816001018054806020026020016040519081016040528092919081815260200182805480156120e457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161209a575b50505050508260020180548060200260200160405190810160405280929190818152602001828054801561213757602002820191906000526020600020905b815481526020019060010190808311612123575b50505050506122ec84600301805480602002602001604051908101604052809291908181526020016000905b8282101561220f57838290600052602060002001805461218290616c8c565b80601f01602080910402602001604051908101604052809291908181526020018280546121ae90616c8c565b80156121fb5780601f106121d0576101008083540402835291602001916121fb565b820191906000526020600020905b8154815290600101906020018083116121de57829003601f168201915b505050505081526020019060010190612163565b5050505085600401805480602002602001604051908101604052809291908181526020016000905b828210156122e357838290600052602060002001805461225690616c8c565b80601f016020809104026020016040519081016040528092919081815260200182805461228290616c8c565b80156122cf5780601f106122a4576101008083540402835291602001916122cf565b820191906000526020600020905b8154815290600101906020018083116122b257829003601f168201915b505050505081526020019060010190612237565b50505050612dac565b8460090154610dcd565b505050565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b61232761496a565b6005600084815260200190815260200160002060080160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681525050905092915050565b61240b610af6565b73ffffffffffffffffffffffffffffffffffffffff166124296128c0565b73ffffffffffffffffffffffffffffffffffffffff161461247f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124769061628c565b60405180910390fd5b612488816132a9565b50565b60006124978383613331565b905092915050565b6124a7610af6565b73ffffffffffffffffffffffffffffffffffffffff166124c56128c0565b73ffffffffffffffffffffffffffffffffffffffff161461251b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125129061628c565b60405180910390fd5b612524816133e6565b50565b60006125328261342b565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600060056000838152602001908152602001600020905061280d816001018054806020026020016040519081016040528092919081815260200182805480156125fb57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116125b1575b50505050508260020180548060200260200160405190810160405280929190818152602001828054801561264e57602002820191906000526020600020905b81548152602001906001019080831161263a575b505050505061280384600301805480602002602001604051908101604052809291908181526020016000905b8282101561272657838290600052602060002001805461269990616c8c565b80601f01602080910402602001604051908101604052809291908181526020018280546126c590616c8c565b80156127125780601f106126e757610100808354040283529160200191612712565b820191906000526020600020905b8154815290600101906020018083116126f557829003601f168201915b50505050508152602001906001019061267a565b5050505085600401805480602002602001604051908101604052809291908181526020016000905b828210156127fa57838290600052602060002001805461276d90616c8c565b80601f016020809104026020016040519081016040528092919081815260200182805461279990616c8c565b80156127e65780601f106127bb576101008083540402835291602001916127e6565b820191906000526020600020905b8154815290600101906020018083116127c957829003601f168201915b50505050508152602001906001019061274e565b50505050612dac565b8460090154611125565b505050565b6000600760009054906101000a900