UNPKG

@marketprotocol/marketprotocol

Version:

Decentralized Derivatives Trading Protocol For The Ethereum Blockchain

333 lines 745 kB
{ "contractName": "MarketCollateralPool", "abi": [ { "constant": true, "inputs": [ { "name": "", "type": "address" } ], "name": "feesCollectedByTokenAddress", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "mktToken", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [], "name": "renounceOwnership", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "owner", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "isOwner", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "", "type": "address" } ], "name": "contractAddressToCollateralPoolBalance", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "marketContractRegistry", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "name": "marketContractRegistryAddress", "type": "address" }, { "name": "mktTokenAddress", "type": "address" } ], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "marketContract", "type": "address" }, { "indexed": true, "name": "user", "type": "address" }, { "indexed": true, "name": "feeToken", "type": "address" }, { "indexed": false, "name": "qtyMinted", "type": "uint256" }, { "indexed": false, "name": "collateralLocked", "type": "uint256" }, { "indexed": false, "name": "feesPaid", "type": "uint256" } ], "name": "TokensMinted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "marketContract", "type": "address" }, { "indexed": true, "name": "user", "type": "address" }, { "indexed": false, "name": "longQtyRedeemed", "type": "uint256" }, { "indexed": false, "name": "shortQtyRedeemed", "type": "uint256" }, { "indexed": false, "name": "collateralUnlocked", "type": "uint256" } ], "name": "TokensRedeemed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "previousOwner", "type": "address" }, { "indexed": true, "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "constant": false, "inputs": [ { "name": "marketContractAddress", "type": "address" }, { "name": "qtyToMint", "type": "uint256" }, { "name": "isAttemptToPayInMKT", "type": "bool" } ], "name": "mintPositionTokens", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "marketContractAddress", "type": "address" }, { "name": "qtyToRedeem", "type": "uint256" } ], "name": "redeemPositionTokens", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "marketContractAddress", "type": "address" }, { "name": "longQtyToRedeem", "type": "uint256" }, { "name": "shortQtyToRedeem", "type": "uint256" } ], "name": "settleAndClose", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "feeTokenAddress", "type": "address" }, { "name": "feeRecipient", "type": "address" } ], "name": "withdrawFees", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "mktTokenAddress", "type": "address" } ], "name": "setMKTTokenAddress", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "marketContractRegistryAddress", "type": "address" } ], "name": "setMarketContractRegistryAddress", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" } ], "metadata": "{\"compiler\":{\"version\":\"0.5.2+commit.1df8f40c\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"marketContractAddress\",\"type\":\"address\"},{\"name\":\"longQtyToRedeem\",\"type\":\"uint256\"},{\"name\":\"shortQtyToRedeem\",\"type\":\"uint256\"}],\"name\":\"settleAndClose\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"marketContractAddress\",\"type\":\"address\"},{\"name\":\"qtyToMint\",\"type\":\"uint256\"},{\"name\":\"isAttemptToPayInMKT\",\"type\":\"bool\"}],\"name\":\"mintPositionTokens\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"feesCollectedByTokenAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"mktTokenAddress\",\"type\":\"address\"}],\"name\":\"setMKTTokenAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"mktToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"marketContractAddress\",\"type\":\"address\"},{\"name\":\"qtyToRedeem\",\"type\":\"uint256\"}],\"name\":\"redeemPositionTokens\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"contractAddressToCollateralPoolBalance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"marketContractRegistry\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"marketContractRegistryAddress\",\"type\":\"address\"}],\"name\":\"setMarketContractRegistryAddress\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"feeTokenAddress\",\"type\":\"address\"},{\"name\":\"feeRecipient\",\"type\":\"address\"}],\"name\":\"withdrawFees\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"marketContractRegistryAddress\",\"type\":\"address\"},{\"name\":\"mktTokenAddress\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"marketContract\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"qtyMinted\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"collateralLocked\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"feesPaid\",\"type\":\"uint256\"}],\"name\":\"TokensMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"marketContract\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"longQtyRedeemed\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"shortQtyRedeemed\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"collateralUnlocked\",\"type\":\"uint256\"}],\"name\":\"TokensRedeemed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"}],\"devdoc\":{\"author\":\"Phil Elsasser <phil@marketprotocol.io>\",\"methods\":{\"isOwner()\":{\"return\":\"true if `msg.sender` is the owner of the contract.\"},\"mintPositionTokens(address,uint256,bool)\":{\"params\":{\"isAttemptToPayInMKT\":\"if possible, attempt to pay fee's in MKT rather than collateral tokens\",\"marketContractAddress\":\"address of the market contract to redeem tokens for\",\"qtyToMint\":\"quantity of long / short tokens to mint.\"}},\"owner()\":{\"return\":\"the address of the owner.\"},\"redeemPositionTokens(address,uint256)\":{\"params\":{\"marketContractAddress\":\"address of the market contract to redeem tokens for\",\"qtyToRedeem\":\"quantity of long / short tokens to redeem.\"}},\"renounceOwnership()\":{\"details\":\"Allows the current owner to relinquish control of the contract. It will not be possible to call the functions with the `onlyOwner` modifier anymore.\"},\"setMKTTokenAddress(address)\":{\"details\":\"allows the owner to update the mkt token address in use for fees\",\"params\":{\"mktTokenAddress\":\"address of new MKT token\"}},\"setMarketContractRegistryAddress(address)\":{\"details\":\"allows the owner to update the mkt token address in use for fees\",\"params\":{\"marketContractRegistryAddress\":\"address of new contract registry\"}},\"settleAndClose(address,uint256,uint256)\":{\"params\":{\"longQtyToRedeem\":\"qty to redeem of long tokens\",\"marketContractAddress\":\"address of the MARKET Contract being traded.\",\"shortQtyToRedeem\":\"qty to redeem of short tokens\"}},\"transferOwnership(address)\":{\"details\":\"Allows the current owner to transfer control of the contract to a newOwner.\",\"params\":{\"newOwner\":\"The address to transfer ownership to.\"}},\"withdrawFees(address,address)\":{\"details\":\"allows the owner to remove the fees paid into this contract for minting\",\"params\":{\"feeRecipient\":\"- Recipient address of fees\",\"feeTokenAddress\":\"- address of the erc20 token fees have been paid in\"}}},\"title\":\"MarketCollateralPool\"},\"userdoc\":{\"methods\":{\"mintPositionTokens(address,uint256,bool)\":{\"notice\":\"Called by a user that would like to mint a new set of long and short token for a specified market contract. This will transfer and lock the correct amount of collateral into the pool and issue them the requested qty of long and short tokens\"},\"redeemPositionTokens(address,uint256)\":{\"notice\":\"Called by a user that currently holds both short and long position tokens and would like to redeem them for their collateral.\"},\"renounceOwnership()\":{\"notice\":\"Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"}},\"notice\":\"This collateral pool houses all of the collateral for all market contracts currently in circulation. This pool facilitates locking of collateral and minting / redemption of position tokens for that collateral.\"}},\"settings\":{\"compilationTarget\":{\"/home/travis/build/MARKETProtocol/MARKETProtocol/contracts/MarketCollateralPool.sol\":\"MarketCollateralPool\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/home/travis/build/MARKETProtocol/MARKETProtocol/contracts/MarketCollateralPool.sol\":{\"keccak256\":\"0x0b6355543b299eada55a3faab81952dd24a4e95c07e1e6c1c1c7b97d574dce97\",\"urls\":[\"bzzr://cff209086041171eedb7d8f8f84220f1e5301538c472b52d46b549fb9aff43e9\"]},\"/home/travis/build/MARKETProtocol/MARKETProtocol/contracts/MarketContract.sol\":{\"keccak256\":\"0xb1e837f17c189abdf5e9f699be068f07d45618df3a6adece0d4a2f78879428be\",\"urls\":[\"bzzr://51deacf4c6dfbabc62017f9c407ce55002c3906e16b810ad9033eb8df6633f3f\"]},\"/home/travis/build/MARKETProtocol/MARKETProtocol/contracts/MarketContractRegistryInterface.sol\":{\"keccak256\":\"0x08e535462791c92fa3d508921433678237c3cc6b6e64c856c5edfb6653ce09e2\",\"urls\":[\"bzzr://790793564fa36ee77a10986b601db861f80b7ab82c51b8a4d7a41b97523eea45\"]},\"/home/travis/build/MARKETProtocol/MARKETProtocol/contracts/libraries/MathLib.sol\":{\"keccak256\":\"0x28e7ed8ea6e300e4d0dbf0e63b2414ba71bc1596b7142690c1bf4016e313abee\",\"urls\":[\"bzzr://6bb2953cfd96de25e614d77e8a4793a8bc11f9eae0d2d0fb9614488bca7e1754\"]},\"/home/travis/build/MARKETProtocol/MARKETProtocol/contracts/libraries/StringLib.sol\":{\"keccak256\":\"0xa1d7d76809600493055bdb04692a775fde71142a921f994568beb1fdb42a92c7\",\"urls\":[\"bzzr://dcc475bb3f21803b7d5fba4157f07c5fc642ea9a976eb118bac74a1cb0b91f4f\"]},\"/home/travis/build/MARKETProtocol/MARKETProtocol/contracts/tokens/PositionToken.sol\":{\"keccak256\":\"0xa1b6986878eedeb5014268a4257b0918473c348f6f39c1558bced6dcf0268f01\",\"urls\":[\"bzzr://9af5870494a1ac62401d92713525808c132a34e11f4dc6aa73f4174ada0201e8\"]},\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0xc2a200a877c4a9b2475c246c54ffecc69ffde3e11af83319c63c2dc5458bac80\",\"urls\":[\"bzzr://c8876e2c39b60f155d748d71d715c8f3903fae5a405ac599adcb6ad2f9a583f9\"]},\"openzeppelin-solidity/contracts/ownership/Ownable.sol\":{\"keccak256\":\"0xcb16adc00dcf0d75e0bdf94379f4d5a6d74dca7c74e4183b94e15721159f8a30\",\"urls\":[\"bzzr://b81e03f7203cd628cfed19255911a04a05e8670d248afb48a7b067dd03b4ff55\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x3dceb7e4aa237a56111c13f77d7efadeceda7271d62bfac94ac79afab7c1f411\",\"urls\":[\"bzzr://2f34152a5bec385352002c31bc89f5e9935f628f1923ccea45c2281e0084a4db\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x59e7df16169a498cb8837963b2f5461d88e63bd1eb6c7d58b814d76b84ccbe61\",\"urls\":[\"bzzr://e572c9c4e02e37349702451bf3b5dcbbc86a19da5a51695b5b3e1bfe1e7825dc\"]},\"openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol\":{\"keccak256\":\"0x7230c14d692aff375e4931d60ef73ac8a79c28b9e54c200a377b7dc613c81a78\",\"urls\":[\"bzzr://3538d7da02640c67ac909e84d90e799439f3b3195cf0de39fd173dacd5a98311\"]},\"openzeppelin-solidity/contracts/utils/Address.sol\":{\"keccak256\":\"0xea16b9933153c647242ba50b3e494fb133063d49f1fa81823f35a8c28754142e\",\"urls\":[\"bzzr://aa2b2eb534149525e194341c01cadf666668a1b7d679a268d10e23570a7e26b1\"]}},\"version\":1}", "bytecode": "0x608060405234801561001057600080fd5b50604051604080612c388339810180604052604081101561003057600080fd5b810190808051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a381600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050612a9e8061019a6000396000f3fe608060405234801561001057600080fd5b5060043610610107576000357c0100000000000000000000000000000000000000000000000000000000900480638f32d59b116100a9578063ceaaa91511610083578063ceaaa915146103c0578063e5ac125f1461040a578063f25552781461044e578063f2fde38b146104b257610107565b80638f32d59b146102f8578063c1b214111461031a578063ca7b1b4d1461036857610107565b806354de298e116100e557806354de298e146102165780636b4a8ae01461025a578063715018a6146102a45780638da5cb5b146102ae57610107565b806310198cb71461010c578063125bb6a9146101645780631f2af365146101be575b600080fd5b6101626004803603606081101561012257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506104f6565b005b6101bc6004803603606081101561017a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190505050610d3f565b005b610200600480360360208110156101d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611856565b6040518082815260200191505060405180910390f35b6102586004803603602081101561022c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061186e565b005b61026261194d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102ac611973565b005b6102b6611a45565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610300611a6e565b604051808215151515815260200191505060405180910390f35b6103666004803603604081101561033057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ac5565b005b6103aa6004803603602081101561037e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061202d565b6040518082815260200191505060405180910390f35b6103c8612045565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61044c6004803603602081101561042057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061206b565b005b6104b06004803603604081101561046457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061214a565b005b6104f4600480360360208110156104c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612334565b005b82600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad23de63826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156105b257600080fd5b505afa1580156105c6573d6000803e3d6000fd5b505050506040513d60208110156105dc57600080fd5b81019080805190602001909291905050501515610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f436f6e7472616374206973206e6f742077686974656c6973746564000000000081525060200191505060405180910390fd5b60008490508073ffffffffffffffffffffffffffffffffffffffff1663bd220dae6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156106c857600080fd5b505afa1580156106dc573d6000803e3d6000fd5b505050506040513d60208110156106f257600080fd5b8101908080519060200190929190505050151561075a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612a1b6025913960400191505060405180910390fd5b600084111561081f578073ffffffffffffffffffffffffffffffffffffffff1663c25c444485336040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561080657600080fd5b505af115801561081a573d6000803e3d6000fd5b505050505b60008311156108e4578073ffffffffffffffffffffffffffffffffffffffff16636d35946784336040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156108cb57600080fd5b505af11580156108df573d6000803e3d6000fd5b505050505b6000610b648273ffffffffffffffffffffffffffffffffffffffff1663c32b1dfa6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b81019080805190602001909291905050508373ffffffffffffffffffffffffffffffffffffffff1663b5471dee6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156109e857600080fd5b505afa1580156109fc573d6000803e3d6000fd5b505050506040513d6020811015610a1257600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff1663ca361d676040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610a8557600080fd5b505afa158015610a99573d6000803e3d6000fd5b505050506040513d6020811015610aaf57600080fd5b810190808051906020019092919050505088888773ffffffffffffffffffffffffffffffffffffffff1663f348e8b26040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610b2457600080fd5b505afa158015610b38573d6000803e3d6000fd5b505050506040513d6020811015610b4e57600080fd5b8101908080519060200190929190505050612353565b9050610bb881600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123ef90919063ffffffff16565b600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cc233828473ffffffffffffffffffffffffffffffffffffffff1663323bb7756040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610c6257600080fd5b505afa158015610c76573d6000803e3d6000fd5b505050506040513d6020811015610c8c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166124749092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f75b6073dcb0773119aa05ecb4a5866ef9323b20a5b4e795d5a436532deeae4f787878560405180848152602001838152602001828152602001935050505060405180910390a3505050505050565b82600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad23de63826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610dfb57600080fd5b505afa158015610e0f573d6000803e3d6000fd5b505050506040513d6020811015610e2557600080fd5b81019080805190602001909291905050501515610eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f436f6e7472616374206973206e6f742077686974656c6973746564000000000081525060200191505060405180910390fd5b60008490508073ffffffffffffffffffffffffffffffffffffffff16633270bb5b6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610f1157600080fd5b505afa158015610f25573d6000803e3d6000fd5b505050506040513d6020811015610f3b57600080fd5b8101908080519060200190929190505050151515610fc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f436f6e747261637420697320616c726561647920736574746c6564000000000081525060200191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663323bb7756040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561102557600080fd5b505afa158015611039573d6000803e3d6000fd5b505050506040513d602081101561104f57600080fd5b81019080805190602001909291905050509050600061110a868473ffffffffffffffffffffffffffffffffffffffff1663e158e02d6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156110ca57600080fd5b505afa1580156110de573d6000803e3d6000fd5b505050506040513d60208110156110f457600080fd5b8101908080519060200190929190505050612561565b905060008580156111b8575060008473ffffffffffffffffffffffffffffffffffffffff1663db3fa7716040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561117a57600080fd5b505afa15801561118e573d6000803e3d6000fd5b505050506040513d60208110156111a457600080fd5b810190808051906020019092919050505014155b80611312575085158015611269575060008473ffffffffffffffffffffffffffffffffffffffff1663db3fa7716040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561122b57600080fd5b505afa15801561123f573d6000803e3d6000fd5b505050506040513d602081101561125557600080fd5b810190808051906020019092919050505014155b8015611311575060008473ffffffffffffffffffffffffffffffffffffffff16635c7c70596040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156112d457600080fd5b505afa1580156112e8573d6000803e3d6000fd5b505050506040513d60208110156112fe57600080fd5b8101908080519060200190929190505050145b5b905060008060008315611443576113c58a8873ffffffffffffffffffffffffffffffffffffffff1663db3fa7716040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561138557600080fd5b505afa158015611399573d6000803e3d6000fd5b505050506040513d60208110156113af57600080fd5b8101908080519060200190929190505050612561565b9250849150600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061143e333085600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612608909392919063ffffffff16565b611504565b6114e98a8873ffffffffffffffffffffffffffffffffffffffff16635c7c70596040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156114a957600080fd5b505afa1580156114bd573d6000803e3d6000fd5b505050506040513d60208110156114d357600080fd5b8101908080519060200190929190505050612561565b92506114fe838661272a90919063ffffffff16565b91508590505b6115cd3330848a73ffffffffffffffffffffffffffffffffffffffff1663323bb7756040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561156c57600080fd5b505afa158015611580573d6000803e3d6000fd5b505050506040513d602081101561159657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16612608909392919063ffffffff16565b60008314151561166d5761162983600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461272a90919063ffffffff16565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6116bf85600360008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461272a90919063ffffffff16565b600360008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508673ffffffffffffffffffffffffffffffffffffffff1663cabd58348b336040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156117a557600080fd5b505af11580156117b9573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f1e551210cd64464d2a2d2b08a00acc53863e5e3c0b7c943a9a8fe11d71a71ae28d898860405180848152602001838152602001828152602001935050505060405180910390a45050505050505050505050565b60046020528060005260406000206000915090505481565b611876611a6e565b151561188157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611909576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806129f76024913960400191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61197b611a6e565b151561198657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b81600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad23de63826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b8157600080fd5b505afa158015611b95573d6000803e3d6000fd5b505050506040513d6020811015611bab57600080fd5b81019080805190602001909291905050501515611c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f436f6e7472616374206973206e6f742077686974656c6973746564000000000081525060200191505060405180910390fd5b60008390508073ffffffffffffffffffffffffffffffffffffffff1663c25c444484336040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015611cd857600080fd5b505af1158015611cec573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16636d35946784336040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015611d9357600080fd5b505af1158015611da7573d6000803e3d6000fd5b505050506000611e53848373ffffffffffffffffffffffffffffffffffffffff1663e158e02d6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611e1357600080fd5b505afa158015611e27573d6000803e3d6000fd5b505050506040513d6020811015611e3d57600080fd5b8101908080519060200190929190505050612561565b9050611ea781600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123ef90919063ffffffff16565b600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fb133828473ffffffffffffffffffffffffffffffffffffffff1663323bb7756040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611f5157600080fd5b505afa158015611f65573d6000803e3d6000fd5b505050506040513d6020811015611f7b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166124749092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75b6073dcb0773119aa05ecb4a5866ef9323b20a5b4e795d5a436532deeae4f786878560405180848152602001838152602001828152602001935050505060405180910390a35050505050565b60036020528060005260406000206000915090505481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612073611a6e565b151561207e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612106576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180612a406033913960400191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612152611a6e565b151561215d57600080fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415151561221a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4e6f206665657320617661696c61626c6520666f72207769746864726177616c81525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156122bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f742073656e64206665657320746f206e756c6c206164647265737381525060200191505060405180910390fd5b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061232f82828573ffffffffffffffffffffffffffffffffffffffff166124749092919063ffffffff16565b505050565b61233c611a6e565b151561234757600080fd5b612350816127b4565b50565b600080600090506000808611156123995788841115156123765760009050612383565b612380848a6123ef565b90505b6123966123908288612561565b88612561565b91505b60008511156123e05787841015156123b457600090506123c1565b6123be88856123ef565b90505b6123dd826123d86123d28489612561565b8a612561565b61272a565b91505b81925050509695505050505050565b6000828211151515612469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d6174684c69623a207375627472616374696f6e206f766572666c6f7700000081525060200191505060405180910390fd5b818303905092915050565b61255c838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb90507c0100000000000000000000000000000000000000000000000000000000028484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506128ae565b505050565b6000808314156125745760009050612602565b6000828402905082848281151561258757fe5b041415156125fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4d6174684c69623a206d756c7469706c69636174696f6e206f766572666c6f7781525060200191505060405180910390fd5b809150505b92915050565b612724848573ffffffffffffffffffffffffffffffffffffffff166323b872dd90507c010000000000000000000000000000000000000000000000000000000002858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506128ae565b50505050565b60008082840190508381101515156127aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4d6174684c69623a206164646974696f6e206f766572666c6f7700000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156127f057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6128cd8273ffffffffffffffffffffffffffffffffffffffff166129e3565b15156128d857600080fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831015156129295780518252602082019150602081019050602083039250612904565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461298b576040519150601f19603f3d011682016040523d82523d6000602084013e612990565b606091505b50915091508115156129a157600080fd5b6000815111156129dd578080602001905160208110156129c057600080fd5b810190808051906020019092919050505015156129dc57600080fd5b5b50505050565b600080823b90506000811191505091905056fe43616e6e6f7420736574204d4b5420546f6b656e204164647265737320546f204e756c6c436f6e7472616374206973206e6f74207061737420736574746c656d656e742064656c617943616e6e6f7420736574204d61726b657420436f6e7472616374205265676973747279204164647265737320546f204e756c6ca165627a7a72305820ae41a3d9f5676f4fd3607763d723cb29e1d2f155fc88ab36f87976ff74b86c7c0029", "deployedBytecode": "0x608060405234801561001057600080fd5b5060043610610107576000357c0100000000000000000000000000000000000000000000000000000000900480638f32d59b116100a9578063ceaaa91511610083578063ceaaa915146103c0578063e5ac125f1461040a578063f25552781461044e578063f2fde38b146104b257610107565b80638f32d59b146102f8578063c1b214111461031a578063ca7b1b4d1461036857610107565b806354de298e116100e557806354de298e146102165780636b4a8ae01461025a578063715018a6146102a45780638da5cb5b146102ae57610107565b806310198cb71461010c578063125bb6a9146101645780631f2af365146101be575b600080fd5b6101626004803603606081101561012257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506104f6565b005b6101bc6004803603606081101561017a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803515159060200190929190505050610d3f565b005b610200600480360360208110156101d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611856565b6040518082815260200191505060405180910390f35b6102586004803603602081101561022c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061186e565b005b61026261194d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102ac611973565b005b6102b6611a45565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610300611a6e565b604051808215151515815260200191505060405180910390f35b6103666004803603604081101561033057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ac5565b005b6103aa6004803603602081101561037e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061202d565b6040518082815260200191505060405180910390f35b6103c8612045565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61044c6004803603602081101561042057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061206b565b005b6104b06004803603604081101561046457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061214a565b005b6104f4600480360360208110156104c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612334565b005b82600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad23de63826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156105b257600080fd5b505afa1580156105c6573d6000803e3d6000fd5b505050506040513d60208110156105dc57600080fd5b81019080805190602001909291905050501515610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f436f6e7472616374206973206e6f742077686974656c6973746564000000000081525060200191505060405180910390fd5b60008490508073ffffffffffffffffffffffffffffffffffffffff1663bd220dae6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156106c857600080fd5b505afa1580156106dc573d6000803e3d6000fd5b505050506040513d60208110156106f257600080fd5b8101908080519060200190929190505050151561075a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612a1b6025913960400191505060405180910390fd5b600084111561081f578073ffffffffffffffffffffffffffffffffffffffff1663c25c444485336040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561080657600080fd5b505af115801561081a573d6000803e3d6000fd5b505050505b60008311156108e4578073ffffffffffffffffffffffffffffffffffffffff16636d35946784336040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156108cb57600080fd5b505af11580156108df573d6000803e3d6000fd5b505050505b6000610b648273ffffffffffffffffffffffffffffffffffffffff1663c32b1dfa6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561094b57600080fd5b505afa15801561095f573d6000803e3d6000fd5b505050506040513d602081101561097557600080fd5b81019080805190602001909291905050508373ffffffffffffffffffffffffffffffffffffffff1663b5471dee6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156109e857600080fd5b505afa1580156109fc573d6000803e3d6000fd5b505050506040513d6020811015610a1257600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff1663ca361d676040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610a8557600080fd5b505afa158015610a99573d6000803e3d6000fd5b505050506040513d6020811015610aaf57600080fd5b810190808051906020019092919050505088888773ffffffffffffffffffffffffffffffffffffffff1663f348e8b26040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610b2457600080fd5b505afa158015610b38573d6000803e3d6000fd5b505050506040513d6020811015610b4e57600080fd5b8101908080519060200190929190505050612353565b9050610bb881600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123ef90919063ffffffff16565b600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cc233828473ffffffffffffffffffffffffffffffffffffffff1663323bb7756040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610c6257600080fd5b505afa158015610c76573d6000803e3d6000fd5b505050506040513d6020811015610c8c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166124749092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f75b6073dcb0773119aa05ecb4a5866ef9323b20a5b4e795d5a436532deeae4f787878560405180848152602001838152602001828152602001935050505060405180910390a3505050505050565b82600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad23de63826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610dfb57600080fd5b505afa158015610e0f573d6000803e3d6000fd5b505050506040513d6020811015610e2557600080fd5b81019080805190602001909291905050501515610eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f436f6e7472616374206973206e6f742077686974656c6973746564000000000081525060200191505060405180910390fd5b60008490508073ffffffffffffffffffffffffffffffffffffffff16633270bb5b6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610f1157600080fd5b505afa158015610f25573d6000803e3d6000fd5b505050506040513d6020811015610f3b57600080fd5b8101908080519060200190929190505050151515610fc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f436f6e747261637420697320616c726561647920736574746c6564000000000081525060200191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663323bb7756040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561102557600080fd5b505afa158015611039573d6000803e3d6000fd5b505050506040513d602081101561104f57600080fd5b81019080805190602001909291905050509050600061110a868473ffffffffffffffffffffffffffffffffffffffff1663e158e02d6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156110ca57600080fd5b505afa1580156110de573d6000803e3d6000fd5b505050506040513d60208110156110f457600080fd5b8101908080519060200190929190505050612561565b905060008580156111b8575060008473ffffffffffffffffffffffffffffffffffffffff1663db3fa7716040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561117a57600080fd5b505afa15801561118e573d6000803e3d6000fd5b505050506040513d60208110156111a457600080fd5b810190808051906020019092919050505014155b80611312575085158015611269575060008473ffffffffffffffffffffffffffffffffffffffff1663db3fa7716040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561122b57600080fd5b505afa15801561123f573d6000803e3d6000fd5b505050506040513d602081101561125557600080fd5b810190808051906020019092919050505014155b8015611311575060008473ffffffffffffffffffffffffffffffffffffffff16635c7c70596040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156112d457600080fd5b505afa1580156112e8573d6000803e3d6000fd5b505050506040513d60208110156112fe57600080fd5b8101908080519060200190929190505050145b5b9050600080600083156114435761