[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "allowance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientAllowance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC20InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC20InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC20InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" } ], "name": "ERC20InvalidSpender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "OwnableInvalidOwner", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "OwnableUnauthorizedAccount", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "buyer", "type": "address" }, { "indexed": true, "internalType": "address", "name": "stablecoinAddress", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "stableAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tusdMinted", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "taxAmount", "type": "uint256" } ], "name": "Buy", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "seller", "type": "address" }, { "indexed": true, "internalType": "address", "name": "stablecoinAddress", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "tusdBurned", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "stableAmountReturned", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "taxAmount", "type": "uint256" } ], "name": "Sell", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "stablecoinAddress", "type": "address" } ], "name": "StablecoinAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "stablecoinAddress", "type": "address" } ], "name": "StablecoinRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "newTaxPool", "type": "address" } ], "name": "TaxPoolUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [ { "internalType": "address", "name": "stablecoinAddress", "type": "address" } ], "name": "addStablecoin", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "allowedStablecoins", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "burnFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "stablecoinAddress", "type": "address" }, { "internalType": "uint256", "name": "stableAmount", "type": "uint256" } ], "name": "buy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "buyTaxRate", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getApprovedStablecoins", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getBackingRatio", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getStablecoinReserves", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "stablecoinAddress", "type": "address" } ], "name": "removeStablecoin", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "stablecoinAddress", "type": "address" }, { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "sell", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "sellTaxRate", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_taxPool", "type": "address" } ], "name": "setTaxPool", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "taxPool", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "taxPoolRate", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "transferTaxRate", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "treasuryRate", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "stablecoinAddress", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "withdrawFromReserve", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
6080604052606360095560c8600a5560c8600b556064600c556064600d55348015610028575f80fd5b50336040518060400160405280600881526020017f54796c65725553440000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f545553440000000000000000000000000000000000000000000000000000000081525081600390816100a5919061043a565b5080600490816100b5919061043a565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610128575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161011f9190610548565b60405180910390fd5b6101378161013d60201b60201c565b50610561565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061027b57607f821691505b60208210810361028e5761028d610237565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026102f07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826102b5565b6102fa86836102b5565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61033e61033961033484610312565b61031b565b610312565b9050919050565b5f819050919050565b61035783610324565b61036b61036382610345565b8484546102c1565b825550505050565b5f90565b61037f610373565b61038a81848461034e565b505050565b5b818110156103ad576103a25f82610377565b600181019050610390565b5050565b601f8211156103f2576103c381610294565b6103cc846102a6565b810160208510156103db578190505b6103ef6103e7856102a6565b83018261038f565b50505b505050565b5f82821c905092915050565b5f6104125f19846008026103f7565b1980831691505092915050565b5f61042a8383610403565b9150826002028217905092915050565b61044382610200565b67ffffffffffffffff81111561045c5761045b61020a565b5b6104668254610264565b6104718282856103b1565b5f60209050601f8311600181146104a2575f8415610490578287015190505b61049a858261041f565b865550610501565b601f1984166104b086610294565b5f5b828110156104d7578489015182556001820191506020850194506020810190506104b2565b868310156104f457848901516104f0601f891682610403565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61053282610509565b9050919050565b61054281610528565b82525050565b5f60208201905061055b5f830184610539565b92915050565b61312f8061056e5f395ff3fe608060405234801561000f575f80fd5b50600436106101d8575f3560e01c80636c197ff511610102578063b12cbc76116100a0578063dd62ed3e1161006f578063dd62ed3e1461051f578063e4b725161461054f578063f2fde38b1461056d578063ffa3209914610589576101d8565b8063b12cbc76146104ab578063b65d08b0146104c9578063c721a39a146104e7578063cce7ec1314610503576101d8565b806379cc6790116100dc57806379cc6790146104235780638da5cb5b1461043f57806395d89b411461045d578063a9059cbb1461047b576101d8565b80636c197ff5146103cd57806370a08231146103e9578063715018a614610419576101d8565b806323b872dd1161017a5780633b947d2b116101495780633b947d2b1461035957806342966c6814610375578063674bcf1014610391578063691f224f146103af576101d8565b806323b872dd146102d157806324024efd1461030157806327f576d11461031f578063313ce5671461033b576101d8565b8063095ea7b3116101b6578063095ea7b31461024657806318160ddd146102765780631bfccde71461029457806323675236146102b2576101d8565b806303e7f2aa146101dc5780630418945a1461020c57806306fdde0314610228575b5f80fd5b6101f660048036038101906101f19190612653565b6105a7565b6040516102039190612698565b60405180910390f35b61022660048036038101906102219190612653565b6105c4565b005b6102306107bf565b60405161023d9190612721565b60405180910390f35b610260600480360381019061025b9190612774565b61084f565b60405161026d9190612698565b60405180910390f35b61027e610871565b60405161028b91906127c1565b60405180910390f35b61029c61087a565b6040516102a991906127c1565b60405180910390f35b6102ba610880565b6040516102c8929190612948565b60405180910390f35b6102eb60048036038101906102e6919061297d565b610a54565b6040516102f89190612698565b60405180910390f35b610309610b54565b60405161031691906127c1565b60405180910390f35b61033960048036038101906103349190612774565b610b5a565b005b610343610d6c565b60405161035091906129e8565b60405180910390f35b610373600480360381019061036e9190612653565b610d74565b005b61038f600480360381019061038a9190612a01565b611019565b005b61039961102d565b6040516103a69190612a2c565b60405180910390f35b6103b76110b8565b6040516103c491906127c1565b60405180910390f35b6103e760048036038101906103e29190612774565b6110be565b005b61040360048036038101906103fe9190612653565b611482565b60405161041091906127c1565b60405180910390f35b6104216114c7565b005b61043d60048036038101906104389190612774565b6114da565b005b6104476114fa565b6040516104549190612a5b565b60405180910390f35b610465611522565b6040516104729190612721565b60405180910390f35b61049560048036038101906104909190612774565b6115b2565b6040516104a29190612698565b60405180910390f35b6104b36116af565b6040516104c09190612a5b565b60405180910390f35b6104d16116d4565b6040516104de91906127c1565b60405180910390f35b61050160048036038101906104fc9190612653565b6116da565b005b61051d60048036038101906105189190612774565b6117d6565b005b61053960048036038101906105349190612a74565b611b9f565b60405161054691906127c1565b60405180910390f35b610557611c21565b60405161056491906127c1565b60405180910390f35b61058760048036038101906105829190612653565b611c27565b005b610591611cab565b60405161059e91906127c1565b60405180910390f35b6006602052805f5260405f205f915054906101000a900460ff1681565b6105cc611dda565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361063a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063190612afc565b60405180910390fd5b60065f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156106c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bb90612b64565b60405180910390fd5b600160065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600781908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f3db297c09c19972ba6a701ff373ab97e21ff1e4992e863c7abe44e9b2fed084760405160405180910390a250565b6060600380546107ce90612baf565b80601f01602080910402602001604051908101604052809291908181526020018280546107fa90612baf565b80156108455780601f1061081c57610100808354040283529160200191610845565b820191905f5260205f20905b81548152906001019060200180831161082857829003601f168201915b5050505050905090565b5f80610859611e61565b9050610866818585611e68565b600191505092915050565b5f600254905090565b600d5481565b6060805f60078054905067ffffffffffffffff8111156108a3576108a2612bdf565b5b6040519080825280602002602001820160405280156108d15781602001602082028036833780820191505090505b5090505f5b6007805490508110156109c257600781815481106108f7576108f6612c0c565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109579190612a5b565b602060405180830381865afa158015610972573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109969190612c4d565b8282815181106109a9576109a8612c0c565b5b60200260200101818152505080806001019150506108d6565b5060078181805480602002602001604051908101604052809291908181526020018280548015610a4457602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116109fb575b5050505050915092509250509091565b5f8073ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adb90612cc2565b60405180910390fd5b5f61271060095484610af69190612d0d565b610b009190612d7b565b90505f8184610b0f9190612dab565b9050610b3d8660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611e7a565b50610b49868683611e7a565b925050509392505050565b600b5481565b610b62611dda565b5f8111610ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9b90612e28565b60405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2490612e90565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c679190612a5b565b602060405180830381865afa158015610c82573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca69190612c4d565b905081811015610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce290612ef8565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610d26929190612f16565b6020604051808303815f875af1158015610d42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d669190612f67565b50505050565b5f6006905090565b610d7c611dda565b60065f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90612e90565b60405180910390fd5b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f5b600780549050811015610fd2578173ffffffffffffffffffffffffffffffffffffffff1660078281548110610e9357610e92612c0c565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610fc55760076001600780549050610eea9190612dab565b81548110610efb57610efa612c0c565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660078281548110610f3757610f36612c0c565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506007805480610f8e57610f8d612f92565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610fd2565b8080600101915050610e5b565b508073ffffffffffffffffffffffffffffffffffffffff167f3302a1b37f04242bb55603f5449e7ecd690a35eef08ba1353c48c20e2aae9cda60405160405180910390a250565b61102a611024611e61565b82611ea8565b50565b606060078054806020026020016040519081016040528092919081815260200182805480156110ae57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611065575b5050505050905090565b600a5481565b5f8111611100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f790612e28565b60405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090612e90565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90612cc2565b60405180910390fd5b5f612710600b548361122a9190612d0d565b6112349190612d7b565b90505f600b54600c54836112489190612d0d565b6112529190612d7b565b90505f81836112619190612dab565b90505f83856112709190612dab565b905061127c3386611ea8565b8573ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016112b7929190612f16565b6020604051808303815f875af11580156112d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f79190612f67565b508573ffffffffffffffffffffffffffffffffffffffff1663a9059cbb30856040518363ffffffff1660e01b8152600401611333929190612f16565b6020604051808303815f875af115801561134f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113739190612f67565b508573ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b81526004016113d0929190612f16565b6020604051808303815f875af11580156113ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114109190612f67565b508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f01fbb57444511e3de5b26ac09ad6bec45c3f9a1e59dd4a0f2b13a240d18476ce87848860405161147293929190612fbf565b60405180910390a3505050505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6114cf611dda565b6114d85f611f27565b565b6114ec826114e6611e61565b83611fea565b6114f68282611ea8565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461153190612baf565b80601f016020809104026020016040519081016040528092919081815260200182805461155d90612baf565b80156115a85780601f1061157f576101008083540402835291602001916115a8565b820191905f5260205f20905b81548152906001019060200180831161158b57829003601f168201915b5050505050905090565b5f8073ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990612cc2565b60405180910390fd5b5f612710600954846116549190612d0d565b61165e9190612d7b565b90505f818461166d9190612dab565b905061169a60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361207c565b506116a5858261207c565b9250505092915050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b6116e2611dda565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611750576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117479061303e565b60405180910390fd5b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f4a6115f75e72b5147eab85c541ccbab75211975352afe6a09cdbf8444f86f6cb60405160405180910390a250565b5f8111611818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180f90612e28565b60405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166118a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189890612e90565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790612cc2565b60405180910390fd5b5f612710600a54836119429190612d0d565b61194c9190612d7b565b90505f600a54600c54836119609190612d0d565b61196a9190612d7b565b90505f81836119799190612dab565b90505f83856119889190612dab565b90508573ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016119c79392919061305c565b6020604051808303815f875af11580156119e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a079190612f67565b508573ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401611a459392919061305c565b6020604051808303815f875af1158015611a61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a859190612f67565b508573ffffffffffffffffffffffffffffffffffffffff166323b872dd3360085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518463ffffffff1660e01b8152600401611ae49392919061305c565b6020604051808303815f875af1158015611b00573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b249190612f67565b50611b2f338261209e565b8573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ef93dbdb72854b6b6fb35433086556f2635fc83c37080c667496fecfa650fb4878488604051611b8f93929190612fbf565b60405180910390a3505050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600c5481565b611c2f611dda565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c9f575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611c969190612a5b565b60405180910390fd5b611ca881611f27565b50565b5f805f90505f5b600780549050811015611d96575f60078281548110611cd457611cd3612c0c565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d389190612a5b565b602060405180830381865afa158015611d53573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d779190612c4d565b90508084611d859190613091565b935050508080600101915050611cb2565b505f611da0610871565b90505f8103611db3575f92505050611dd7565b80670de0b6b3a764000083611dc89190612d0d565b611dd29190612d7b565b925050505b90565b611de2611e61565b73ffffffffffffffffffffffffffffffffffffffff16611e006114fa565b73ffffffffffffffffffffffffffffffffffffffff1614611e5f57611e23611e61565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611e569190612a5b565b60405180910390fd5b565b5f33905090565b611e75838383600161211d565b505050565b5f80611e84611e61565b9050611e91858285611fea565b611e9c8585856122ec565b60019150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f18575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611f0f9190612a5b565b60405180910390fd5b611f23825f836123dc565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f611ff58484611b9f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120765781811015612067578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161205e939291906130c4565b60405180910390fd5b61207584848484035f61211d565b5b50505050565b5f80612086611e61565b90506120938185856122ec565b600191505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361210e575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016121059190612a5b565b60405180910390fd5b6121195f83836123dc565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361218d575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016121849190612a5b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121fd575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016121f49190612a5b565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156122e6578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516122dd91906127c1565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361235c575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016123539190612a5b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123cc575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016123c39190612a5b565b60405180910390fd5b6123d78383836123dc565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361242c578060025f8282546124209190613091565b925050819055506124fa565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156124b5578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016124ac939291906130c4565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612541578060025f828254039250508190555061258b565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516125e891906127c1565b60405180910390a3505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612622826125f9565b9050919050565b61263281612618565b811461263c575f80fd5b50565b5f8135905061264d81612629565b92915050565b5f60208284031215612668576126676125f5565b5b5f6126758482850161263f565b91505092915050565b5f8115159050919050565b6126928161267e565b82525050565b5f6020820190506126ab5f830184612689565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6126f3826126b1565b6126fd81856126bb565b935061270d8185602086016126cb565b612716816126d9565b840191505092915050565b5f6020820190508181035f83015261273981846126e9565b905092915050565b5f819050919050565b61275381612741565b811461275d575f80fd5b50565b5f8135905061276e8161274a565b92915050565b5f806040838503121561278a576127896125f5565b5b5f6127978582860161263f565b92505060206127a885828601612760565b9150509250929050565b6127bb81612741565b82525050565b5f6020820190506127d45f8301846127b2565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61280c81612618565b82525050565b5f61281d8383612803565b60208301905092915050565b5f602082019050919050565b5f61283f826127da565b61284981856127e4565b9350612854836127f4565b805f5b8381101561288457815161286b8882612812565b975061287683612829565b925050600181019050612857565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6128c381612741565b82525050565b5f6128d483836128ba565b60208301905092915050565b5f602082019050919050565b5f6128f682612891565b612900818561289b565b935061290b836128ab565b805f5b8381101561293b57815161292288826128c9565b975061292d836128e0565b92505060018101905061290e565b5085935050505092915050565b5f6040820190508181035f8301526129608185612835565b9050818103602083015261297481846128ec565b90509392505050565b5f805f60608486031215612994576129936125f5565b5b5f6129a18682870161263f565b93505060206129b28682870161263f565b92505060406129c386828701612760565b9150509250925092565b5f60ff82169050919050565b6129e2816129cd565b82525050565b5f6020820190506129fb5f8301846129d9565b92915050565b5f60208284031215612a1657612a156125f5565b5b5f612a2384828501612760565b91505092915050565b5f6020820190508181035f830152612a448184612835565b905092915050565b612a5581612618565b82525050565b5f602082019050612a6e5f830184612a4c565b92915050565b5f8060408385031215612a8a57612a896125f5565b5b5f612a978582860161263f565b9250506020612aa88582860161263f565b9150509250929050565b7f496e76616c696420737461626c65636f696e20616464726573730000000000005f82015250565b5f612ae6601a836126bb565b9150612af182612ab2565b602082019050919050565b5f6020820190508181035f830152612b1381612ada565b9050919050565b7f537461626c65636f696e20616c726561647920616c6c6f7765640000000000005f82015250565b5f612b4e601a836126bb565b9150612b5982612b1a565b602082019050919050565b5f6020820190508181035f830152612b7b81612b42565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612bc657607f821691505b602082108103612bd957612bd8612b82565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050612c478161274a565b92915050565b5f60208284031215612c6257612c616125f5565b5b5f612c6f84828501612c39565b91505092915050565b7f54617820706f6f6c206e6f7420736574000000000000000000000000000000005f82015250565b5f612cac6010836126bb565b9150612cb782612c78565b602082019050919050565b5f6020820190508181035f830152612cd981612ca0565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612d1782612741565b9150612d2283612741565b9250828202612d3081612741565b91508282048414831517612d4757612d46612ce0565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612d8582612741565b9150612d9083612741565b925082612da057612d9f612d4e565b5b828204905092915050565b5f612db582612741565b9150612dc083612741565b9250828203905081811115612dd857612dd7612ce0565b5b92915050565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f5f82015250565b5f612e126020836126bb565b9150612e1d82612dde565b602082019050919050565b5f6020820190508181035f830152612e3f81612e06565b9050919050565b7f537461626c65636f696e206e6f7420616c6c6f776564000000000000000000005f82015250565b5f612e7a6016836126bb565b9150612e8582612e46565b602082019050919050565b5f6020820190508181035f830152612ea781612e6e565b9050919050565b7f496e73756666696369656e742062616c616e636520696e2072657365727665005f82015250565b5f612ee2601f836126bb565b9150612eed82612eae565b602082019050919050565b5f6020820190508181035f830152612f0f81612ed6565b9050919050565b5f604082019050612f295f830185612a4c565b612f3660208301846127b2565b9392505050565b612f468161267e565b8114612f50575f80fd5b50565b5f81519050612f6181612f3d565b92915050565b5f60208284031215612f7c57612f7b6125f5565b5b5f612f8984828501612f53565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f606082019050612fd25f8301866127b2565b612fdf60208301856127b2565b612fec60408301846127b2565b949350505050565b7f496e76616c69642074617820706f6f6c206164647265737300000000000000005f82015250565b5f6130286018836126bb565b915061303382612ff4565b602082019050919050565b5f6020820190508181035f8301526130558161301c565b9050919050565b5f60608201905061306f5f830186612a4c565b61307c6020830185612a4c565b61308960408301846127b2565b949350505050565b5f61309b82612741565b91506130a683612741565b92508282019050808211156130be576130bd612ce0565b5b92915050565b5f6060820190506130d75f830186612a4c565b6130e460208301856127b2565b6130f160408301846127b2565b94935050505056fea264697066735822122065aa19d991aac491c25db0ec65be158e35ecf37e1b804a30d46e2d8bb846a79464736f6c634300081a0033