{"contractName":"FixedProductMarketMaker","abi":[{"constant":true,"inputs":[{"name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"conditionalTokens","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"collateralToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"conditionIds","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"funder","type":"address"},{"indexed":false,"name":"amountsAdded","type":"uint256[]"},{"indexed":false,"name":"sharesMinted","type":"uint256"}],"name":"FPMMFundingAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"funder","type":"address"},{"indexed":false,"name":"amountsRemoved","type":"uint256[]"},{"indexed":false,"name":"collateralRemovedFromFeePool","type":"uint256"},{"indexed":false,"name":"sharesBurnt","type":"uint256"}],"name":"FPMMFundingRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"},{"indexed":false,"name":"investmentAmount","type":"uint256"},{"indexed":false,"name":"feeAmount","type":"uint256"},{"indexed":true,"name":"outcomeIndex","type":"uint256"},{"indexed":false,"name":"outcomeTokensBought","type":"uint256"}],"name":"FPMMBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"seller","type":"address"},{"indexed":false,"name":"returnAmount","type":"uint256"},{"indexed":false,"name":"feeAmount","type":"uint256"},{"indexed":true,"name":"outcomeIndex","type":"uint256"},{"indexed":false,"name":"outcomeTokensSold","type":"uint256"}],"name":"FPMMSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"constant":true,"inputs":[],"name":"collectedFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"feesWithdrawableBy","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"withdrawFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addedFunds","type":"uint256"},{"name":"distributionHint","type":"uint256[]"}],"name":"addFunding","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"sharesToBurn","type":"uint256"}],"name":"removeFunding","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"},{"name":"from","type":"address"},{"name":"id","type":"uint256"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"},{"name":"from","type":"address"},{"name":"ids","type":"uint256[]"},{"name":"values","type":"uint256[]"},{"name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"investmentAmount","type":"uint256"},{"name":"outcomeIndex","type":"uint256"}],"name":"calcBuyAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"returnAmount","type":"uint256"},{"name":"outcomeIndex","type":"uint256"}],"name":"calcSellAmount","outputs":[{"name":"outcomeTokenSellAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"investmentAmount","type":"uint256"},{"name":"outcomeIndex","type":"uint256"},{"name":"minOutcomeTokensToBuy","type":"uint256"}],"name":"buy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"returnAmount","type":"uint256"},{"name":"outcomeIndex","type":"uint256"},{"name":"maxOutcomeTokensToSell","type":"uint256"}],"name":"sell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}],"metadata":"{\"compiler\":{\"version\":\"0.5.10+commit.5a6ea5b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"account\",\"type\":\"address\"}],\"name\":\"withdrawFees\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"account\",\"type\":\"address\"}],\"name\":\"feesWithdrawableBy\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"sender\",\"type\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"investmentAmount\",\"type\":\"uint256\"},{\"name\":\"outcomeIndex\",\"type\":\"uint256\"},{\"name\":\"minOutcomeTokensToBuy\",\"type\":\"uint256\"}],\"name\":\"buy\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"returnAmount\",\"type\":\"uint256\"},{\"name\":\"outcomeIndex\",\"type\":\"uint256\"}],\"name\":\"calcSellAmount\",\"outputs\":[{\"name\":\"outcomeTokenSellAmount\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"conditionalTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"collectedFees\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"collateralToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"operator\",\"type\":\"address\"},{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"ids\",\"type\":\"uint256[]\"},{\"name\":\"values\",\"type\":\"uint256[]\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"returnAmount\",\"type\":\"uint256\"},{\"name\":\"outcomeIndex\",\"type\":\"uint256\"},{\"name\":\"maxOutcomeTokensToSell\",\"type\":\"uint256\"}],\"name\":\"sell\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"addedFunds\",\"type\":\"uint256\"},{\"name\":\"distributionHint\",\"type\":\"uint256[]\"}],\"name\":\"addFunding\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"conditionIds\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"fee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"sharesToBurn\",\"type\":\"uint256\"}],\"name\":\"removeFunding\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"operator\",\"type\":\"address\"},{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"id\",\"type\":\"uint256\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"investmentAmount\",\"type\":\"uint256\"},{\"name\":\"outcomeIndex\",\"type\":\"uint256\"}],\"name\":\"calcBuyAmount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"funder\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amountsAdded\",\"type\":\"uint256[]\"},{\"indexed\":false,\"name\":\"sharesMinted\",\"type\":\"uint256\"}],\"name\":\"FPMMFundingAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"funder\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amountsRemoved\",\"type\":\"uint256[]\"},{\"indexed\":false,\"name\":\"collateralRemovedFromFeePool\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"sharesBurnt\",\"type\":\"uint256\"}],\"name\":\"FPMMFundingRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"investmentAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"feeAmount\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"outcomeIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"outcomeTokensBought\",\"type\":\"uint256\"}],\"name\":\"FPMMBuy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"returnAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"feeAmount\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"outcomeIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"outcomeTokensSold\",\"type\":\"uint256\"}],\"name\":\"FPMMSell\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}.     * Requirements:     * - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller.     * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.     * Emits an {Approval} event indicating the updated allowance.     * Requirements:     * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller.     * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.     * Emits an {Approval} event indicating the updated allowance.     * Requirements:     * - `spender` cannot be the zero address.\"},\"supportsInterface(bytes4)\":{\"details\":\"See `IERC165.supportsInterface`.     * Time complexity O(1), guaranteed to always use less than 30 000 gas.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}.     * Requirements:     * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}.     * Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20};     * Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for `sender`'s tokens of at least `amount`.\"}}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/alan/src/github.com/gnosis/conditional-tokens-market-makers/contracts/FixedProductMarketMaker.sol\":\"FixedProductMarketMaker\"},\"evmVersion\":\"petersburg\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/home/alan/src/github.com/gnosis/conditional-tokens-market-makers/contracts/ERC20.sol\":{\"keccak256\":\"0x40a58d43f7c61c93c3e31fa2e398cbbd2768635703066fc37fc98ec19c1da70f\",\"urls\":[\"bzzr://535a311aa4c5d1d4c082822608b7d41eecdc45e4be9df6dc190f158546c809d9\",\"dweb:/ipfs/QmUacDZ7YZ7spzy2XsQuaZeMnKNTQuJUs7cXgQAjbGNScW\"]},\"/home/alan/src/github.com/gnosis/conditional-tokens-market-makers/contracts/FixedProductMarketMaker.sol\":{\"keccak256\":\"0x68003703f48a2b244f5f0fe19473bb1602791d1277882ab3a159af3b1a31daec\",\"urls\":[\"bzzr://4d0cb66cc5c935d8631414bd811452c0eb2901bf6ef794350ebc393085b075fe\",\"dweb:/ipfs/QmdZskHkHDANmxM4XVcXLLeUjRJTuUKpWYYRFbR1FseVwv\"]},\"@gnosis.pm/conditional-tokens-contracts/contracts/CTHelpers.sol\":{\"keccak256\":\"0x921eadb1d6cd0e742448334fb84c39b358a18cdeb7c6badbb89cae847d44a201\",\"urls\":[\"bzzr://54ea8cd3a2ef100710306ce15475573542ad5235ced471d59fa1744cfaea51c8\",\"dweb:/ipfs/Qme871evGa1PBSBnV9PisLhYnFnnahLmBuy5KakLSUKRPF\"]},\"@gnosis.pm/conditional-tokens-contracts/contracts/ConditionalTokens.sol\":{\"keccak256\":\"0x11a610a3fa07ac8a59a09a76fdb944f058fdb06d3414fe49995595e68cd17d41\",\"urls\":[\"bzzr://aec70f70bf6166a9ae46146c7d293156967b345273a250667732f6f8a4355342\",\"dweb:/ipfs/QmWUFR7eKVsMS61UCK1yY2bQQhcqEQHAAmJ2FJ3GozWV8k\"]},\"@gnosis.pm/conditional-tokens-contracts/contracts/ERC1155/ERC1155.sol\":{\"keccak256\":\"0xd8e6583f45a98380ff10a5656a7ae7ba6a275e0d051043e5842f0d541abd7caa\",\"urls\":[\"bzzr://978cc82d056d10d8cc14b02f35801b10c0c2f87b0adbf6c41bbd622e20ab8cee\",\"dweb:/ipfs/QmYWqCK6moph6oeBEUc1nDaGz4GRdGXmykwKD5rykVbhcU\"]},\"@gnosis.pm/conditional-tokens-contracts/contracts/ERC1155/ERC1155TokenReceiver.sol\":{\"keccak256\":\"0x5d1e709c759b9bd72865c8608582d66fc338fde3a77f41abb04ae943915a5695\",\"urls\":[\"bzzr://55e5a597486430ad437bb8c8f0c93cf573b833fa84ccf64a25afaa01c761b839\",\"dweb:/ipfs/QmQ727N1676jG9F5iwakSG2RNeV82TVBGJHgHPmHxib8ah\"]},\"@gnosis.pm/conditional-tokens-contracts/contracts/ERC1155/IERC1155.sol\":{\"keccak256\":\"0x4971631d7de74464fed3e0abac04553e917be5e8cd10b3f825e2e7c39ccc2734\",\"urls\":[\"bzzr://e1e88dfe7440ceab59d4cd604d12e5dc93409a3c5058e497763703027ea7b9e6\",\"dweb:/ipfs/QmRzsL1o6iVEFmqBYCo3XpM4kpvbK7iSJWssXHQ3gHb5uq\"]},\"@gnosis.pm/conditional-tokens-contracts/contracts/ERC1155/IERC1155TokenReceiver.sol\":{\"keccak256\":\"0xca815b5ca57df8f1056b962c2728d6a1e56fc7d9a7869ccee8f5a1ac6075b75d\",\"urls\":[\"bzzr://61df3e61bf24c80714e326ffdc274aaefc342241de3e72374131f613cddbd042\",\"dweb:/ipfs/QmPnF3rGuY2H3Gifvha4dW7fJPptP7wJerHzjz4dpzfTJW\"]},\"openzeppelin-solidity/contracts/introspection/ERC165.sol\":{\"keccak256\":\"0xac2eacd7e7762e275442f28f21d821544df5aae2ed7698af13be8c41b7005e2e\",\"urls\":[\"bzzr://43e901f6f210568ebc1d3591da3ce6a9d10796b854767a9c6e3da10305a8a332\",\"dweb:/ipfs/QmQhfx2Ufr8a2gFXm3KogL66xGgAuAWMwcamkWFKGG6Vya\"]},\"openzeppelin-solidity/contracts/introspection/IERC165.sol\":{\"keccak256\":\"0x661553e43d7c4fbb2de504e5999fd5c104d367488350ed5bf023031bd1ba5ac5\",\"urls\":[\"bzzr://fc2ba15143ce3a00268ecd15fc98eb2469b18bfe27a64bbab0ac6446f161c739\",\"dweb:/ipfs/QmV7wjtRf11ibUHh4g8JjuhMpy68pPhV95L2y46UBoRfsZ\"]},\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x4ccf2d7b51873db1ccfd54ca2adae5eac3b184f9699911ed4490438419f1c690\",\"urls\":[\"bzzr://1604f5b6d6e916c154efd8c6720cda069e5ba32dfa0a9dedf2b42e5b02d07f89\",\"dweb:/ipfs/QmV3yVktya1s617QmuzQR2CfuJgUi3dR2xEZY9ecmqZ2G1\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x90e8c2521653bbb1768b05889c5760031e688d9cd361f167489b89215e201b95\",\"urls\":[\"bzzr://aa8b45b57edafc3d67bc5d916327ea16807fae33f753ca163ae0c4061b789766\",\"dweb:/ipfs/QmP5NaEwZthQeM2ESz4WTT3osrP7jhbvu7ocbttBi2JAw6\"]},\"openzeppelin-solidity/contracts/utils/Address.sol\":{\"keccak256\":\"0xf3358e5819ca73357abd6c90bdfffd0474af54364897f6b3e3234c4b71fbe9a1\",\"urls\":[\"bzzr://f7f6da60a184233fd666ac44e6fb2bd51ca6ebdc4867a310d368049aa4e62786\",\"dweb:/ipfs/Qmb3kNCoBUZdah1AgBBD4zMk898j5Qw8ahT1w5cCMYp5Y3\"]}},\"version\":1}","bytecode":"0x6080604052620000387f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b036200007216565b6200006c7f4e2312e0000000000000000000000000000000000000000000000000000000006001600160e01b036200007216565b62000141565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200010457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152600360205260409020805460ff19166001179055565b612b3c80620001516000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063a457c2d7116100c3578063d8c55af71161007c578063d8c55af71461056e578063dd62ed3e1461058b578063ddca3f43146105b9578063e03031a6146105c1578063f23a6e61146105de578063f55c79d01461067157610158565b8063a457c2d71461032c578063a9059cbb14610358578063b2016bd414610384578063bc197c811461038c578063d3c9727c146104d0578063d5f15a46146104f957610158565b80633950935111610115578063395093511461026257806340993b261461028e5780634343116a146102b75780635bd9e299146102da57806370a08231146102fe5780639003adfe1461032457610158565b806301ffc9a71461015d578063095ea7b314610198578063164e68de146101c457806316dbd776146101ec57806318160ddd1461022457806323b872dd1461022c575b600080fd5b6101846004803603602081101561017357600080fd5b50356001600160e01b031916610694565b604080519115158252519081900360200190f35b610184600480360360408110156101ae57600080fd5b506001600160a01b0381351690602001356106b3565b6101ea600480360360208110156101da57600080fd5b50356001600160a01b03166106ca565b005b6102126004803603602081101561020257600080fd5b50356001600160a01b0316610838565b60408051918252519081900360200190f35b61021261088c565b6101846004803603606081101561024257600080fd5b506001600160a01b03813581169160208101359091169060400135610892565b6101846004803603604081101561027857600080fd5b506001600160a01b0381351690602001356108e9565b6101ea600480360360608110156102a457600080fd5b5080359060208101359060400135610925565b610212600480360360408110156102cd57600080fd5b5080359060200135610c8b565b6102e2610e62565b604080516001600160a01b039092168252519081900360200190f35b6102126004803603602081101561031457600080fd5b50356001600160a01b0316610e71565b610212610e8c565b6101846004803603604081101561034257600080fd5b506001600160a01b038135169060200135610eaa565b6101846004803603604081101561036e57600080fd5b506001600160a01b038135169060200135610ee6565b6102e2610ef3565b6104b3600480360360a08110156103a257600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156103d557600080fd5b8201836020820111156103e757600080fd5b803590602001918460208302840111600160201b8311171561040857600080fd5b919390929091602081019035600160201b81111561042557600080fd5b82018360208201111561043757600080fd5b803590602001918460208302840111600160201b8311171561045857600080fd5b919390929091602081019035600160201b81111561047557600080fd5b82018360208201111561048757600080fd5b803590602001918460018302840111600160201b831117156104a857600080fd5b509092509050610f02565b604080516001600160e01b03199092168252519081900360200190f35b6101ea600480360360608110156104e657600080fd5b5080359060208101359060400135610f46565b6101ea6004803603604081101561050f57600080fd5b81359190810190604081016020820135600160201b81111561053057600080fd5b82018360208201111561054257600080fd5b803590602001918460208302840111600160201b8311171561056357600080fd5b5090925090506111e2565b6102126004803603602081101561058457600080fd5b5035611897565b610212600480360360408110156105a157600080fd5b506001600160a01b03813581169160200135166118b5565b6102126118e0565b6101ea600480360360208110156105d757600080fd5b50356118e6565b6104b3600480360360a08110156105f457600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561063357600080fd5b82018360208201111561064557600080fd5b803590602001918460018302840111600160201b8311171561066657600080fd5b509092509050611c3e565b6102126004803603604081101561068757600080fd5b5080359060200135611c6d565b6001600160e01b03191660009081526003602052604090205460ff1690565b60006106c0338484611e0a565b5060015b92915050565b60006106d461088c565b6106ef6106e084610e71565b6008549063ffffffff611ef616565b816106f657fe5b6001600160a01b0384166000908152600c60205260408120549290910492509061072790839063ffffffff611f4f16565b90508015610833576001600160a01b0383166000908152600c60205260409020829055600d5461075d908263ffffffff611fac16565b600d556005546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156107b657600080fd5b505af11580156107ca573d6000803e3d6000fd5b505050506040513d60208110156107e057600080fd5b5051610833576040805162461bcd60e51b815260206004820152601a60248201527f7769746864726177616c207472616e73666572206661696c6564000000000000604482015290519081900360640190fd5b505050565b60008061084361088c565b61084f6106e085610e71565b8161085657fe5b6001600160a01b0385166000908152600c6020526040902054919004915061088590829063ffffffff611f4f16565b9392505050565b60025490565b600061089f848484612006565b6001600160a01b0384166000908152600160209081526040808320338085529252909120546108df9186916108da908663ffffffff611f4f16565b611e0a565b5060019392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106c09185906108da908663ffffffff611fac16565b60006109318484611c6d565b905081811015610988576040805162461bcd60e51b815260206004820152601e60248201527f6d696e696d756d2062757920616d6f756e74206e6f7420726561636865640000604482015290519081900360640190fd5b600554604080516323b872dd60e01b81523360048201523060248201526044810187905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156109e257600080fd5b505af11580156109f6573d6000803e3d6000fd5b505050506040513d6020811015610a0c57600080fd5b5051610a56576040805162461bcd60e51b815260206004820152601460248201527318dbdcdd081d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b6000670de0b6b3a7640000610a7660075487611ef690919063ffffffff16565b81610a7d57fe5b049050610a9581600854611fac90919063ffffffff16565b6008556000610aaa868363ffffffff611f4f16565b600554600480546040805163095ea7b360e01b81526001600160a01b039283169381019390935260248301859052519394509091169163095ea7b3916044808201926020929091908290030181600087803b158015610b0857600080fd5b505af1158015610b1c573d6000803e3d6000fd5b505050506040513d6020811015610b3257600080fd5b5051610b85576040805162461bcd60e51b815260206004820152601a60248201527f617070726f76616c20666f722073706c697473206661696c6564000000000000604482015290519081900360640190fd5b610b8e81612153565b600454600b80546001600160a01b039092169163f242432a9130913391908a908110610bb657fe5b6000918252602082200154604080516001600160e01b031960e088901b1681526001600160a01b03958616600482015293909416602484015260448301526064820188905260a0608483015260a48201819052915160e4808301939282900301818387803b158015610c2757600080fd5b505af1158015610c3b573d6000803e3d6000fd5b5050604080518981526020810186905280820187905290518893503392507f4f62630f51608fc8a7603a9391a5101e58bd7c276139366fc107dc3b67c3dcf89181900360600190a3505050505050565b600b546000908210610cdc576040805162461bcd60e51b81526020600482015260156024820152740d2dcecc2d8d2c840deeae8c6dedaca40d2dcc8caf605b1b604482015290519081900360640190fd5b6060610ce66122e2565b90506000610d07600754670de0b6b3a7640000611f4f90919063ffffffff16565b610d1f86670de0b6b3a764000063ffffffff611ef616565b81610d2657fe5b0490506000828581518110610d3757fe5b602002602001015190506000610d5e670de0b6b3a764000083611ef690919063ffffffff16565b905060005b8451811015610dc957868114610dc1576000858281518110610d8157fe5b60200260200101519050610dbd610da18683611f4f90919063ffffffff16565b610db1858463ffffffff611ef616565b9063ffffffff6124b116565b9250505b600101610d63565b5060008111610e1f576040805162461bcd60e51b815260206004820152601b60248201527f6d7573742068617665206e6f6e2d7a65726f2062616c616e6365730000000000604482015290519081900360640190fd5b610e5782610e4b610e3e84670de0b6b3a764000063ffffffff6124b116565b869063ffffffff611fac16565b9063ffffffff611f4f16565b979650505050505050565b6004546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6000610ea5600d54600854611f4f90919063ffffffff16565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106c09185906108da908663ffffffff611f4f16565b60006106c0338484612006565b6005546001600160a01b031681565b60006001600160a01b03891630148015610f2357506001600160a01b038816155b15610f36575063bc197c8160e01b610f3a565b5060005b98975050505050505050565b6000610f528484610c8b565b905081811115610fa9576040805162461bcd60e51b815260206004820152601c60248201527f6d6178696d756d2073656c6c20616d6f756e7420657863656564656400000000604482015290519081900360640190fd5b600454600b80546001600160a01b039092169163f242432a91339130919088908110610fd157fe5b6000918252602082200154604080516001600160e01b031960e088901b1681526001600160a01b03958616600482015293909416602484015260448301526064820186905260a0608483015260a48201819052915160e4808301939282900301818387803b15801561104257600080fd5b505af1158015611056573d6000803e3d6000fd5b505050506000611079600754670de0b6b3a7640000611f4f90919063ffffffff16565b60075461108d90879063ffffffff611ef616565b8161109457fe5b0490506110ac81600854611fac90919063ffffffff16565b60085560006110c1868363ffffffff611fac16565b90506110cc816124e1565b6005546040805163a9059cbb60e01b81523360048201526024810189905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561112057600080fd5b505af1158015611134573d6000803e3d6000fd5b505050506040513d602081101561114a57600080fd5b5051611196576040805162461bcd60e51b81526020600482015260166024820152751c995d1d5c9b881d1c985b9cd9995c8819985a5b195960521b604482015290519081900360640190fd5b60408051878152602081018490528082018590529051869133917fadcf2a240ed9300d681d9a3f5382b6c1beed1b7e46643e0c7b42cbe6e2d766b49181900360600190a3505050505050565b60008311611237576040805162461bcd60e51b815260206004820152601860248201527f66756e64696e67206d757374206265206e6f6e2d7a65726f0000000000000000604482015290519081900360640190fd5b600b546040805182815260208084028201019091526060918015611265578160200160208202803883390190505b509050600061127261088c565b9050600081156113925783156112b95760405162461bcd60e51b8152600401808060200182810382526032815260200180612a4b6032913960400191505060405180910390fd5b60606112c36122e2565b90506000805b82518110156112ff5760008382815181106112e057fe5b60200260200101519050808310156112f6578092505b506001016112c9565b5060005b825181101561136f5760008261133585848151811061131e57fe5b60200260200101518c611ef690919063ffffffff16565b8161133c57fe5b04905061134f8a8263ffffffff611f4f16565b87838151811061135b57fe5b602090810291909101015250600101611303565b5080611381898663ffffffff611ef616565b8161138857fe5b04925050506114e1565b83156114de57600b5484146113e0576040805162461bcd60e51b815260206004820152600f60248201526e3434b73a103632b733ba341037b33360891b604482015290519081900360640190fd5b6000805b858110156114185760008787838181106113fa57fe5b9050602002013590508083101561140f578092505b506001016113e4565b5060005b858110156114db5760008261144c89898581811061143657fe5b905060200201358b611ef690919063ffffffff16565b8161145357fe5b049050600081116114ab576040805162461bcd60e51b815260206004820152601e60248201527f6d7573742068696e7420612076616c696420646973747269627574696f6e0000604482015290519081900360640190fd5b6114bb898263ffffffff611f4f16565b8683815181106114c757fe5b60209081029190910101525060010161141c565b50505b50845b600554604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561153b57600080fd5b505af115801561154f573d6000803e3d6000fd5b505050506040513d602081101561156557600080fd5b50516115b8576040805162461bcd60e51b815260206004820152601760248201527f66756e64696e67207472616e73666572206661696c6564000000000000000000604482015290519081900360640190fd5b600554600480546040805163095ea7b360e01b81526001600160a01b0392831693810193909352602483018a90525192169163095ea7b3916044808201926020929091908290030181600087803b15801561161257600080fd5b505af1158015611626573d6000803e3d6000fd5b505050506040513d602081101561163c57600080fd5b505161168f576040805162461bcd60e51b815260206004820152601a60248201527f617070726f76616c20666f722073706c697473206661696c6564000000000000604482015290519081900360640190fd5b61169886612153565b6116a23382612658565b60048054604051631759616b60e11b815230928101838152336024830181905260a060448401908152600b805460a486018190526001600160a01b0390961696632eb2c2d6969095939491938b93916064820191608481019160c4909101908790801561172e57602002820191906000526020600020905b81548152602001906001019080831161171a575b50508481038352855181528551602091820191808801910280838360005b8381101561176457818101518382015260200161174c565b50505050905001848103825260008152602001602001975050505050505050600060405180830381600087803b15801561179d57600080fd5b505af11580156117b1573d6000803e3d6000fd5b506000925050505b8351811015611807576117e88482815181106117d157fe5b602002602001015188611f4f90919063ffffffff16565b8482815181106117f457fe5b60209081029190910101526001016117b9565b50336001600160a01b03167fec2dc3e5a3bb9aa0a1deb905d2bd23640d07f107e6ceb484024501aad964a95184836040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b8381101561187b578181015183820152602001611863565b50505050905001935050505060405180910390a2505050505050565b600681815481106118a457fe5b600091825260209091200154905081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60075481565b60606118f06122e2565b90506060815160405190808252806020026020018201604052801561191f578160200160208202803883390190505b509050600061192c61088c565b905060005b835181101561198857816119618686848151811061194b57fe5b6020026020010151611ef690919063ffffffff16565b8161196857fe5b0483828151811061197557fe5b6020908102919091010152600101611931565b50600554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156119d457600080fd5b505afa1580156119e8573d6000803e3d6000fd5b505050506040513d60208110156119fe57600080fd5b50519050611a0c3386612754565b600554604080516370a0823160e01b81523060048201529051611a91926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a5857600080fd5b505afa158015611a6c573d6000803e3d6000fd5b505050506040513d6020811015611a8257600080fd5b5051829063ffffffff611f4f16565b60048054604051631759616b60e11b815230928101838152336024830181905260a060448401908152600b805460a486018190529798506001600160a01b0390951696632eb2c2d69695929492938b939092916064820191608481019160c49091019087908015611b2157602002820191906000526020600020905b815481526020019060010190808311611b0d575b50508481038352855181528551602091820191808801910280838360005b83811015611b57578181015183820152602001611b3f565b50505050905001848103825260008152602001602001975050505050505050600060405180830381600087803b158015611b9057600080fd5b505af1158015611ba4573d6000803e3d6000fd5b50505050336001600160a01b03167f8b4b2c8ebd04c47fc8bce136a85df9b93fcb1f47c8aa296457d4391519d190e78483886040518080602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611c22578181015183820152602001611c0a565b5050505090500194505050505060405180910390a25050505050565b60006001600160a01b038716301415611c5f575063f23a6e6160e01b611c63565b5060005b9695505050505050565b600b546000908210611cbe576040805162461bcd60e51b81526020600482015260156024820152740d2dcecc2d8d2c840deeae8c6dedaca40d2dcc8caf605b1b604482015290519081900360640190fd5b6060611cc86122e2565b90506000611d03670de0b6b3a7640000611ced60075488611ef690919063ffffffff16565b81611cf457fe5b8791900463ffffffff611f4f16565b90506000828581518110611d1357fe5b602002602001015190506000611d3a670de0b6b3a764000083611ef690919063ffffffff16565b905060005b8451811015611d8957868114611d81576000858281518110611d5d57fe5b60200260200101519050611d7d610da18683611fac90919063ffffffff16565b9250505b600101611d3f565b5060008111611ddf576040805162461bcd60e51b815260206004820152601b60248201527f6d7573742068617665206e6f6e2d7a65726f2062616c616e6365730000000000604482015290519081900360640190fd5b610e57611dfa82670de0b6b3a764000063ffffffff6124b116565b610e4b848663ffffffff611fac16565b6001600160a01b038316611e4f5760405162461bcd60e51b8152600401808060200182810382526024815260200180612ae46024913960400191505060405180910390fd5b6001600160a01b038216611e945760405162461bcd60e51b8152600401808060200182810382526022815260200180612a296022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082611f05575060006106c4565b82820282848281611f1257fe5b04146108855760405162461bcd60e51b8152600401808060200182810382526021815260200180612a7d6021913960400191505060405180910390fd5b600082821115611fa6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015610885576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b03831661204b5760405162461bcd60e51b8152600401808060200182810382526025815260200180612abf6025913960400191505060405180910390fd5b6001600160a01b0382166120905760405162461bcd60e51b8152600401808060200182810382526023815260200180612a066023913960400191505060405180910390fd5b61209b838383612842565b6001600160a01b0383166000908152602081905260409020546120c4908263ffffffff611f4f16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546120f9908263ffffffff611fac16565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600654600019015b600081126122de5760606121856009838154811061217557fe5b90600052602060002001546129a1565b905060005b600a838154811061219757fe5b6000918252602090912001548110156122d357600454600554600a80546001600160a01b03938416936372ce427593169190879081106121d357fe5b9060005260206000200184815481106121e857fe5b90600052602060002001546006878154811061220057fe5b906000526020600020015486896040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b0316815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b8381101561228657818101518382015260200161226e565b505050509050019650505050505050600060405180830381600087803b1580156122af57600080fd5b505af11580156122c3573d6000803e3d6000fd5b50506001909201915061218a9050565b50506000190161215b565b5050565b606080600b80549050604051908082528060200260200182016040528015612314578160200160208202803883390190505b50905060005b600b54811015612351573082828151811061233157fe5b6001600160a01b039092166020928302919091019091015260010161231a565b5060048054604080516313849cfd60e21b81529283019081528351604484015283516001600160a01b0390921692634e1273f4928592600b929091829160248101916064909101906020808801910280838360005b838110156123be5781810151838201526020016123a6565b50505050905001838103825284818154815260200191508054801561240257602002820191906000526020600020905b8154815260200190600101908083116123ee575b505094505050505060006040518083038186803b15801561242257600080fd5b505afa158015612436573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561245f57600080fd5b810190808051600160201b81111561247657600080fd5b8201602081018481111561248957600080fd5b81518560208202830111600160201b821117156124a557600080fd5b50909550505050505090565b600082156124d0578160018403816124c557fe5b0460010190506106c4565b8183816124d957fe5b049392505050565b60005b6006548110156122de5760606125006009838154811061217557fe5b905060005b600a838154811061251257fe5b60009182526020909120015481101561264e57600454600554600a80546001600160a01b0393841693639e7212ad931691908790811061254e57fe5b90600052602060002001848154811061256357fe5b90600052602060002001546006878154811061257b57fe5b906000526020600020015486896040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b0316815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156126015781810151838201526020016125e9565b505050509050019650505050505050600060405180830381600087803b15801561262a57600080fd5b505af115801561263e573d6000803e3d6000fd5b5050600190920191506125059050565b50506001016124e4565b6001600160a01b0382166126b3576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6126bf60008383612842565b6002546126d2908263ffffffff611fac16565b6002556001600160a01b0382166000908152602081905260409020546126fe908263ffffffff611fac16565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166127995760405162461bcd60e51b8152600401808060200182810382526021815260200180612a9e6021913960400191505060405180910390fd5b6127a582600083612842565b6001600160a01b0382166000908152602081905260409020546127ce908263ffffffff611f4f16565b6001600160a01b0383166000908152602081905260409020556002546127fa908263ffffffff611f4f16565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b0383161561285a5761285a836106ca565b600061286461088c565b905060008115612890576008548290612883908563ffffffff611ef616565b8161288a57fe5b04612892565b825b90506001600160a01b03851615612900576001600160a01b0385166000908152600c60205260409020546128cc908263ffffffff611f4f16565b6001600160a01b0386166000908152600c6020526040902055600d546128f8908263ffffffff611f4f16565b600d55612917565b600854612913908263ffffffff611fac16565b6008555b6001600160a01b03841615612983576001600160a01b0384166000908152600c602052604090205461294f908263ffffffff611fac16565b6001600160a01b0385166000908152600c6020526040902055600d5461297b908263ffffffff611fac16565b600d5561299a565b600854612996908263ffffffff611f4f16565b6008555b5050505050565b6060816040519080825280602002602001820160405280156129cd578160200160208202803883390190505b50905060005b828110156129ff57806001901b8282815181106129ec57fe5b60209081029190910101526001016129d3565b5091905056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737363616e6e6f742075736520646973747269627574696f6e2068696e7420616674657220696e697469616c2066756e64696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a723058201aac63dc06a17d8f7ea486dfbf3ed5b1306b107d0d7a9060b6a110567ffb46f864736f6c634300050a0032","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101585760003560e01c8063a457c2d7116100c3578063d8c55af71161007c578063d8c55af71461056e578063dd62ed3e1461058b578063ddca3f43146105b9578063e03031a6146105c1578063f23a6e61146105de578063f55c79d01461067157610158565b8063a457c2d71461032c578063a9059cbb14610358578063b2016bd414610384578063bc197c811461038c578063d3c9727c146104d0578063d5f15a46146104f957610158565b80633950935111610115578063395093511461026257806340993b261461028e5780634343116a146102b75780635bd9e299146102da57806370a08231146102fe5780639003adfe1461032457610158565b806301ffc9a71461015d578063095ea7b314610198578063164e68de146101c457806316dbd776146101ec57806318160ddd1461022457806323b872dd1461022c575b600080fd5b6101846004803603602081101561017357600080fd5b50356001600160e01b031916610694565b604080519115158252519081900360200190f35b610184600480360360408110156101ae57600080fd5b506001600160a01b0381351690602001356106b3565b6101ea600480360360208110156101da57600080fd5b50356001600160a01b03166106ca565b005b6102126004803603602081101561020257600080fd5b50356001600160a01b0316610838565b60408051918252519081900360200190f35b61021261088c565b6101846004803603606081101561024257600080fd5b506001600160a01b03813581169160208101359091169060400135610892565b6101846004803603604081101561027857600080fd5b506001600160a01b0381351690602001356108e9565b6101ea600480360360608110156102a457600080fd5b5080359060208101359060400135610925565b610212600480360360408110156102cd57600080fd5b5080359060200135610c8b565b6102e2610e62565b604080516001600160a01b039092168252519081900360200190f35b6102126004803603602081101561031457600080fd5b50356001600160a01b0316610e71565b610212610e8c565b6101846004803603604081101561034257600080fd5b506001600160a01b038135169060200135610eaa565b6101846004803603604081101561036e57600080fd5b506001600160a01b038135169060200135610ee6565b6102e2610ef3565b6104b3600480360360a08110156103a257600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156103d557600080fd5b8201836020820111156103e757600080fd5b803590602001918460208302840111600160201b8311171561040857600080fd5b919390929091602081019035600160201b81111561042557600080fd5b82018360208201111561043757600080fd5b803590602001918460208302840111600160201b8311171561045857600080fd5b919390929091602081019035600160201b81111561047557600080fd5b82018360208201111561048757600080fd5b803590602001918460018302840111600160201b831117156104a857600080fd5b509092509050610f02565b604080516001600160e01b03199092168252519081900360200190f35b6101ea600480360360608110156104e657600080fd5b5080359060208101359060400135610f46565b6101ea6004803603604081101561050f57600080fd5b81359190810190604081016020820135600160201b81111561053057600080fd5b82018360208201111561054257600080fd5b803590602001918460208302840111600160201b8311171561056357600080fd5b5090925090506111e2565b6102126004803603602081101561058457600080fd5b5035611897565b610212600480360360408110156105a157600080fd5b506001600160a01b03813581169160200135166118b5565b6102126118e0565b6101ea600480360360208110156105d757600080fd5b50356118e6565b6104b3600480360360a08110156105f457600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561063357600080fd5b82018360208201111561064557600080fd5b803590602001918460018302840111600160201b8311171561066657600080fd5b509092509050611c3e565b6102126004803603604081101561068757600080fd5b5080359060200135611c6d565b6001600160e01b03191660009081526003602052604090205460ff1690565b60006106c0338484611e0a565b5060015b92915050565b60006106d461088c565b6106ef6106e084610e71565b6008549063ffffffff611ef616565b816106f657fe5b6001600160a01b0384166000908152600c60205260408120549290910492509061072790839063ffffffff611f4f16565b90508015610833576001600160a01b0383166000908152600c60205260409020829055600d5461075d908263ffffffff611fac16565b600d556005546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156107b657600080fd5b505af11580156107ca573d6000803e3d6000fd5b505050506040513d60208110156107e057600080fd5b5051610833576040805162461bcd60e51b815260206004820152601a60248201527f7769746864726177616c207472616e73666572206661696c6564000000000000604482015290519081900360640190fd5b505050565b60008061084361088c565b61084f6106e085610e71565b8161085657fe5b6001600160a01b0385166000908152600c6020526040902054919004915061088590829063ffffffff611f4f16565b9392505050565b60025490565b600061089f848484612006565b6001600160a01b0384166000908152600160209081526040808320338085529252909120546108df9186916108da908663ffffffff611f4f16565b611e0a565b5060019392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106c09185906108da908663ffffffff611fac16565b60006109318484611c6d565b905081811015610988576040805162461bcd60e51b815260206004820152601e60248201527f6d696e696d756d2062757920616d6f756e74206e6f7420726561636865640000604482015290519081900360640190fd5b600554604080516323b872dd60e01b81523360048201523060248201526044810187905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156109e257600080fd5b505af11580156109f6573d6000803e3d6000fd5b505050506040513d6020811015610a0c57600080fd5b5051610a56576040805162461bcd60e51b815260206004820152601460248201527318dbdcdd081d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b6000670de0b6b3a7640000610a7660075487611ef690919063ffffffff16565b81610a7d57fe5b049050610a9581600854611fac90919063ffffffff16565b6008556000610aaa868363ffffffff611f4f16565b600554600480546040805163095ea7b360e01b81526001600160a01b039283169381019390935260248301859052519394509091169163095ea7b3916044808201926020929091908290030181600087803b158015610b0857600080fd5b505af1158015610b1c573d6000803e3d6000fd5b505050506040513d6020811015610b3257600080fd5b5051610b85576040805162461bcd60e51b815260206004820152601a60248201527f617070726f76616c20666f722073706c697473206661696c6564000000000000604482015290519081900360640190fd5b610b8e81612153565b600454600b80546001600160a01b039092169163f242432a9130913391908a908110610bb657fe5b6000918252602082200154604080516001600160e01b031960e088901b1681526001600160a01b03958616600482015293909416602484015260448301526064820188905260a0608483015260a48201819052915160e4808301939282900301818387803b158015610c2757600080fd5b505af1158015610c3b573d6000803e3d6000fd5b5050604080518981526020810186905280820187905290518893503392507f4f62630f51608fc8a7603a9391a5101e58bd7c276139366fc107dc3b67c3dcf89181900360600190a3505050505050565b600b546000908210610cdc576040805162461bcd60e51b81526020600482015260156024820152740d2dcecc2d8d2c840deeae8c6dedaca40d2dcc8caf605b1b604482015290519081900360640190fd5b6060610ce66122e2565b90506000610d07600754670de0b6b3a7640000611f4f90919063ffffffff16565b610d1f86670de0b6b3a764000063ffffffff611ef616565b81610d2657fe5b0490506000828581518110610d3757fe5b602002602001015190506000610d5e670de0b6b3a764000083611ef690919063ffffffff16565b905060005b8451811015610dc957868114610dc1576000858281518110610d8157fe5b60200260200101519050610dbd610da18683611f4f90919063ffffffff16565b610db1858463ffffffff611ef616565b9063ffffffff6124b116565b9250505b600101610d63565b5060008111610e1f576040805162461bcd60e51b815260206004820152601b60248201527f6d7573742068617665206e6f6e2d7a65726f2062616c616e6365730000000000604482015290519081900360640190fd5b610e5782610e4b610e3e84670de0b6b3a764000063ffffffff6124b116565b869063ffffffff611fac16565b9063ffffffff611f4f16565b979650505050505050565b6004546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6000610ea5600d54600854611f4f90919063ffffffff16565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106c09185906108da908663ffffffff611f4f16565b60006106c0338484612006565b6005546001600160a01b031681565b60006001600160a01b03891630148015610f2357506001600160a01b038816155b15610f36575063bc197c8160e01b610f3a565b5060005b98975050505050505050565b6000610f528484610c8b565b905081811115610fa9576040805162461bcd60e51b815260206004820152601c60248201527f6d6178696d756d2073656c6c20616d6f756e7420657863656564656400000000604482015290519081900360640190fd5b600454600b80546001600160a01b039092169163f242432a91339130919088908110610fd157fe5b6000918252602082200154604080516001600160e01b031960e088901b1681526001600160a01b03958616600482015293909416602484015260448301526064820186905260a0608483015260a48201819052915160e4808301939282900301818387803b15801561104257600080fd5b505af1158015611056573d6000803e3d6000fd5b505050506000611079600754670de0b6b3a7640000611f4f90919063ffffffff16565b60075461108d90879063ffffffff611ef616565b8161109457fe5b0490506110ac81600854611fac90919063ffffffff16565b60085560006110c1868363ffffffff611fac16565b90506110cc816124e1565b6005546040805163a9059cbb60e01b81523360048201526024810189905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561112057600080fd5b505af1158015611134573d6000803e3d6000fd5b505050506040513d602081101561114a57600080fd5b5051611196576040805162461bcd60e51b81526020600482015260166024820152751c995d1d5c9b881d1c985b9cd9995c8819985a5b195960521b604482015290519081900360640190fd5b60408051878152602081018490528082018590529051869133917fadcf2a240ed9300d681d9a3f5382b6c1beed1b7e46643e0c7b42cbe6e2d766b49181900360600190a3505050505050565b60008311611237576040805162461bcd60e51b815260206004820152601860248201527f66756e64696e67206d757374206265206e6f6e2d7a65726f0000000000000000604482015290519081900360640190fd5b600b546040805182815260208084028201019091526060918015611265578160200160208202803883390190505b509050600061127261088c565b9050600081156113925783156112b95760405162461bcd60e51b8152600401808060200182810382526032815260200180612a4b6032913960400191505060405180910390fd5b60606112c36122e2565b90506000805b82518110156112ff5760008382815181106112e057fe5b60200260200101519050808310156112f6578092505b506001016112c9565b5060005b825181101561136f5760008261133585848151811061131e57fe5b60200260200101518c611ef690919063ffffffff16565b8161133c57fe5b04905061134f8a8263ffffffff611f4f16565b87838151811061135b57fe5b602090810291909101015250600101611303565b5080611381898663ffffffff611ef616565b8161138857fe5b04925050506114e1565b83156114de57600b5484146113e0576040805162461bcd60e51b815260206004820152600f60248201526e3434b73a103632b733ba341037b33360891b604482015290519081900360640190fd5b6000805b858110156114185760008787838181106113fa57fe5b9050602002013590508083101561140f578092505b506001016113e4565b5060005b858110156114db5760008261144c89898581811061143657fe5b905060200201358b611ef690919063ffffffff16565b8161145357fe5b049050600081116114ab576040805162461bcd60e51b815260206004820152601e60248201527f6d7573742068696e7420612076616c696420646973747269627574696f6e0000604482015290519081900360640190fd5b6114bb898263ffffffff611f4f16565b8683815181106114c757fe5b60209081029190910101525060010161141c565b50505b50845b600554604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561153b57600080fd5b505af115801561154f573d6000803e3d6000fd5b505050506040513d602081101561156557600080fd5b50516115b8576040805162461bcd60e51b815260206004820152601760248201527f66756e64696e67207472616e73666572206661696c6564000000000000000000604482015290519081900360640190fd5b600554600480546040805163095ea7b360e01b81526001600160a01b0392831693810193909352602483018a90525192169163095ea7b3916044808201926020929091908290030181600087803b15801561161257600080fd5b505af1158015611626573d6000803e3d6000fd5b505050506040513d602081101561163c57600080fd5b505161168f576040805162461bcd60e51b815260206004820152601a60248201527f617070726f76616c20666f722073706c697473206661696c6564000000000000604482015290519081900360640190fd5b61169886612153565b6116a23382612658565b60048054604051631759616b60e11b815230928101838152336024830181905260a060448401908152600b805460a486018190526001600160a01b0390961696632eb2c2d6969095939491938b93916064820191608481019160c4909101908790801561172e57602002820191906000526020600020905b81548152602001906001019080831161171a575b50508481038352855181528551602091820191808801910280838360005b8381101561176457818101518382015260200161174c565b50505050905001848103825260008152602001602001975050505050505050600060405180830381600087803b15801561179d57600080fd5b505af11580156117b1573d6000803e3d6000fd5b506000925050505b8351811015611807576117e88482815181106117d157fe5b602002602001015188611f4f90919063ffffffff16565b8482815181106117f457fe5b60209081029190910101526001016117b9565b50336001600160a01b03167fec2dc3e5a3bb9aa0a1deb905d2bd23640d07f107e6ceb484024501aad964a95184836040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b8381101561187b578181015183820152602001611863565b50505050905001935050505060405180910390a2505050505050565b600681815481106118a457fe5b600091825260209091200154905081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60075481565b60606118f06122e2565b90506060815160405190808252806020026020018201604052801561191f578160200160208202803883390190505b509050600061192c61088c565b905060005b835181101561198857816119618686848151811061194b57fe5b6020026020010151611ef690919063ffffffff16565b8161196857fe5b0483828151811061197557fe5b6020908102919091010152600101611931565b50600554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156119d457600080fd5b505afa1580156119e8573d6000803e3d6000fd5b505050506040513d60208110156119fe57600080fd5b50519050611a0c3386612754565b600554604080516370a0823160e01b81523060048201529051611a91926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a5857600080fd5b505afa158015611a6c573d6000803e3d6000fd5b505050506040513d6020811015611a8257600080fd5b5051829063ffffffff611f4f16565b60048054604051631759616b60e11b815230928101838152336024830181905260a060448401908152600b805460a486018190529798506001600160a01b0390951696632eb2c2d69695929492938b939092916064820191608481019160c49091019087908015611b2157602002820191906000526020600020905b815481526020019060010190808311611b0d575b50508481038352855181528551602091820191808801910280838360005b83811015611b57578181015183820152602001611b3f565b50505050905001848103825260008152602001602001975050505050505050600060405180830381600087803b158015611b9057600080fd5b505af1158015611ba4573d6000803e3d6000fd5b50505050336001600160a01b03167f8b4b2c8ebd04c47fc8bce136a85df9b93fcb1f47c8aa296457d4391519d190e78483886040518080602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611c22578181015183820152602001611c0a565b5050505090500194505050505060405180910390a25050505050565b60006001600160a01b038716301415611c5f575063f23a6e6160e01b611c63565b5060005b9695505050505050565b600b546000908210611cbe576040805162461bcd60e51b81526020600482015260156024820152740d2dcecc2d8d2c840deeae8c6dedaca40d2dcc8caf605b1b604482015290519081900360640190fd5b6060611cc86122e2565b90506000611d03670de0b6b3a7640000611ced60075488611ef690919063ffffffff16565b81611cf457fe5b8791900463ffffffff611f4f16565b90506000828581518110611d1357fe5b602002602001015190506000611d3a670de0b6b3a764000083611ef690919063ffffffff16565b905060005b8451811015611d8957868114611d81576000858281518110611d5d57fe5b60200260200101519050611d7d610da18683611fac90919063ffffffff16565b9250505b600101611d3f565b5060008111611ddf576040805162461bcd60e51b815260206004820152601b60248201527f6d7573742068617665206e6f6e2d7a65726f2062616c616e6365730000000000604482015290519081900360640190fd5b610e57611dfa82670de0b6b3a764000063ffffffff6124b116565b610e4b848663ffffffff611fac16565b6001600160a01b038316611e4f5760405162461bcd60e51b8152600401808060200182810382526024815260200180612ae46024913960400191505060405180910390fd5b6001600160a01b038216611e945760405162461bcd60e51b8152600401808060200182810382526022815260200180612a296022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082611f05575060006106c4565b82820282848281611f1257fe5b04146108855760405162461bcd60e51b8152600401808060200182810382526021815260200180612a7d6021913960400191505060405180910390fd5b600082821115611fa6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015610885576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b03831661204b5760405162461bcd60e51b8152600401808060200182810382526025815260200180612abf6025913960400191505060405180910390fd5b6001600160a01b0382166120905760405162461bcd60e51b8152600401808060200182810382526023815260200180612a066023913960400191505060405180910390fd5b61209b838383612842565b6001600160a01b0383166000908152602081905260409020546120c4908263ffffffff611f4f16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546120f9908263ffffffff611fac16565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600654600019015b600081126122de5760606121856009838154811061217557fe5b90600052602060002001546129a1565b905060005b600a838154811061219757fe5b6000918252602090912001548110156122d357600454600554600a80546001600160a01b03938416936372ce427593169190879081106121d357fe5b9060005260206000200184815481106121e857fe5b90600052602060002001546006878154811061220057fe5b906000526020600020015486896040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b0316815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b8381101561228657818101518382015260200161226e565b505050509050019650505050505050600060405180830381600087803b1580156122af57600080fd5b505af11580156122c3573d6000803e3d6000fd5b50506001909201915061218a9050565b50506000190161215b565b5050565b606080600b80549050604051908082528060200260200182016040528015612314578160200160208202803883390190505b50905060005b600b54811015612351573082828151811061233157fe5b6001600160a01b039092166020928302919091019091015260010161231a565b5060048054604080516313849cfd60e21b81529283019081528351604484015283516001600160a01b0390921692634e1273f4928592600b929091829160248101916064909101906020808801910280838360005b838110156123be5781810151838201526020016123a6565b50505050905001838103825284818154815260200191508054801561240257602002820191906000526020600020905b8154815260200190600101908083116123ee575b505094505050505060006040518083038186803b15801561242257600080fd5b505afa158015612436573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561245f57600080fd5b810190808051600160201b81111561247657600080fd5b8201602081018481111561248957600080fd5b81518560208202830111600160201b821117156124a557600080fd5b50909550505050505090565b600082156124d0578160018403816124c557fe5b0460010190506106c4565b8183816124d957fe5b049392505050565b60005b6006548110156122de5760606125006009838154811061217557fe5b905060005b600a838154811061251257fe5b60009182526020909120015481101561264e57600454600554600a80546001600160a01b0393841693639e7212ad931691908790811061254e57fe5b90600052602060002001848154811061256357fe5b90600052602060002001546006878154811061257b57fe5b906000526020600020015486896040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b0316815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156126015781810151838201526020016125e9565b505050509050019650505050505050600060405180830381600087803b15801561262a57600080fd5b505af115801561263e573d6000803e3d6000fd5b5050600190920191506125059050565b50506001016124e4565b6001600160a01b0382166126b3576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6126bf60008383612842565b6002546126d2908263ffffffff611fac16565b6002556001600160a01b0382166000908152602081905260409020546126fe908263ffffffff611fac16565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166127995760405162461bcd60e51b8152600401808060200182810382526021815260200180612a9e6021913960400191505060405180910390fd5b6127a582600083612842565b6001600160a01b0382166000908152602081905260409020546127ce908263ffffffff611f4f16565b6001600160a01b0383166000908152602081905260409020556002546127fa908263ffffffff611f4f16565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b0383161561285a5761285a836106ca565b600061286461088c565b905060008115612890576008548290612883908563ffffffff611ef616565b8161288a57fe5b04612892565b825b90506001600160a01b03851615612900576001600160a01b0385166000908152600c60205260409020546128cc908263ffffffff611f4f16565b6001600160a01b0386166000908152600c6020526040902055600d546128f8908263ffffffff611f4f16565b600d55612917565b600854612913908263ffffffff611fac16565b6008555b6001600160a01b03841615612983576001600160a01b0384166000908152600c602052604090205461294f908263ffffffff611fac16565b6001600160a01b0385166000908152600c6020526040902055600d5461297b908263ffffffff611fac16565b600d5561299a565b600854612996908263ffffffff611f4f16565b6008555b5050505050565b6060816040519080825280602002602001820160405280156129cd578160200160208202803883390190505b50905060005b828110156129ff57806001901b8282815181106129ec57fe5b60209081029190910101526001016129d3565b5091905056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737363616e6e6f742075736520646973747269627574696f6e2068696e7420616674657220696e697469616c2066756e64696e67536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a723058201aac63dc06a17d8f7ea486dfbf3ed5b1306b107d0d7a9060b6a110567ffb46f864736f6c634300050a0032","sourceMap":"738:12336:3:-;;;718:40:20;-1:-1:-1;;;718:18:20;:40::i;:::-;231:162:13;-1:-1:-1;;;231:18:13;:162::i;:::-;738:12336:3;;1442:190:20;-1:-1:-1;;;;;;1517:25:20;;;;;1509:66;;;;;-1:-1:-1;;;1509:66:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1585:33:20;;;;;:20;:33;;;;;:40;;-1:-1:-1;;1585:40:20;-1:-1:-1;1585:40:20;;;1442:190::o;738:12336:3:-;;;;;;;","deployedSourceMap":"738:12336:3:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;738:12336:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;915:133:20;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;915:133:20;-1:-1:-1;;;;;;915:133:20;;:::i;:::-;;;;;;;;;;;;;;;;;;2625:147:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2625:147:1;;;;;;;;:::i;3734:483:3:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3734:483:3;-1:-1:-1;;;;;3734:483:3;;:::i;:::-;;3515:213;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3515:213:3;-1:-1:-1;;;;;3515:213:3;;:::i;:::-;;;;;;;;;;;;;;;;1686:89:1;;;:::i;3230:252::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3230:252:1;;;;;;;;;;;;;;;;;:::i;3877:203::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3877:203:1;;;;;;;;:::i;11229:998:3:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11229:998:3;;;;;;;;;;;;:::i;10257:966::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10257:966:3;;;;;;;:::i;1546:42::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1546:42:3;;;;;;;;;;;;;;1833:108:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1833:108:1;-1:-1:-1;;;;;1833:108:1;;:::i;3394:115:3:-;;;:::i;4567:213:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4567:213:1;;;;;;;;:::i;2144:153::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2144:153:1;;;;;;;;:::i;1594:29:3:-;;;:::i;8885:385::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;8885:385:3;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5:28;;2:2;;;46:1;43;36:12;2:2;8885:385:3;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8885:385:3;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;8885:385:3;;;;;;;;;;;-1:-1:-1;5:28;;2:2;;;46:1;43;36:12;2:2;8885:385:3;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8885:385:3;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;8885:385:3;;;;;;;;;;;-1:-1:-1;5:28;;2:2;;;46:1;43;36:12;2:2;8885:385:3;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8885:385:3;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;8885:385:3;;-1:-1:-1;8885:385:3;-1:-1:-1;8885:385:3;:::i;:::-;;;;-1:-1:-1;;;;;;8885:385:3;;;;;;;;;;;;;;;12233:839;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12233:839:3;;;;;;;;;;;;:::i;5147:2524::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5147:2524:3;;;;;;;;;;;;;;-1:-1:-1;5:28;;2:2;;;46:1;43;36:12;2:2;5147:2524:3;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5147:2524:3;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;5147:2524:3;;-1:-1:-1;5147:2524:3;-1:-1:-1;5147:2524:3;:::i;1629:29::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1629:29:3;;:::i;2355:132:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2355:132:1;;;;;;;;;;:::i;1664:15:3:-;;;:::i;7677:867::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7677:867:3;;:::i;8550:329::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;8550:329:3;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8550:329:3;;;;;;-1:-1:-1;5:28;;2:2;;;46:1;43;36:12;2:2;8550:329:3;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8550:329:3;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;8550:329:3;;-1:-1:-1;8550:329:3;-1:-1:-1;8550:329:3;:::i;9276:975::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9276:975:3;;;;;;;:::i;915:133:20:-;-1:-1:-1;;;;;;1008:33:20;985:4;1008:33;;;:20;:33;;;;;;;;;915:133::o;2625:147:1:-;2691:4;2707:37;2716:10;2728:7;2737:6;2707:8;:37::i;:::-;-1:-1:-1;2761:4:1;2625:147;;;;;:::o;3734:483:3:-;3790:14;3847:13;:11;:13::i;:::-;3807:37;3825:18;3835:7;3825:9;:18::i;:::-;3807:13;;;:37;:17;:37;:::i;:::-;:53;;;;;-1:-1:-1;;;;;3910:22:3;;3870:23;3910:22;;;:13;:22;;;;;;3807:53;;;;;-1:-1:-1;3870:23:3;3896:37;;3807:53;;3896:13;:37::i;:::-;3870:63;-1:-1:-1;3946:22:3;;3943:268;;-1:-1:-1;;;;;3983:22:3;;;;;;:13;:22;;;;;:34;;;4052:18;;:42;;4075:18;4052:22;:42::i;:::-;4031:18;:63;4116:15;;:53;;;-1:-1:-1;;;4116:53:3;;-1:-1:-1;;;;;4116:53:3;;;;;;;;;;;;;;;:15;;;;;-1:-1:-1;;4116:53:3;;;;;;;;;;;;;;-1:-1:-1;4116:15:3;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;4116:53:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4116:53:3;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4116:53:3;4108:92;;;;;-1:-1:-1;;;4108:92:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;3734:483;;;:::o;3515:213::-;3581:4;3597:14;3654:13;:11;:13::i;:::-;3614:37;3632:18;3642:7;3632:9;:18::i;3614:37::-;:53;;;;;-1:-1:-1;;;;;3698:22:3;;;;;;:13;:22;;;;;;3614:53;;;;-1:-1:-1;3684:37:3;;3614:53;;3684:13;:37::i;:::-;3677:44;3515:213;-1:-1:-1;;;3515:213:3:o;1686:89:1:-;1756:12;;1686:89;:::o;3230:252::-;3319:4;3335:36;3345:6;3353:9;3364:6;3335:9;:36::i;:::-;-1:-1:-1;;;;;3410:19:1;;;;;;-1:-1:-1;3410:19:1;;;;;;;;3398:10;3410:31;;;;;;;;;3381:73;;3410:19;;:43;;3446:6;3410:35;:43::i;:::-;3381:8;:73::i;:::-;-1:-1:-1;3471:4:1;3230:252;;;;;:::o;3877:203::-;3982:10;3957:4;4003:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;4003:32:1;;;;;;;;;;3957:4;;3973:79;;4003:32;;:48;;4040:10;4003:36;:48::i;11229:998:3:-;11331:23;11357:45;11371:16;11389:12;11357:13;:45::i;:::-;11331:71;;11442:21;11420:18;:43;;11412:86;;;;;-1:-1:-1;;;11412:86:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;11517:15;;:73;;;-1:-1:-1;;;11517:73:3;;11546:10;11517:73;;;;11566:4;11517:73;;;;;;;;;;;;-1:-1:-1;;;;;11517:15:3;;;;-1:-1:-1;;11517:73:3;;;;;;;;;;;;;;;-1:-1:-1;11517:15:3;:73;;;5:2:-1;;;;30:1;27;20:12;5:2;11517:73:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11517:73:3;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11517:73:3;11509:106;;;;;-1:-1:-1;;;11509:106:3;;;;;;;;;;;;-1:-1:-1;;;11509:106:3;;;;;;;;;;;;;;;11626:14;1533:6;11643:25;11664:3;;11643:16;:20;;:25;;;;:::i;:::-;:31;;;;;;11626:48;;11700:28;11718:9;11700:13;;:17;;:28;;;;:::i;:::-;11684:13;:44;11738:30;11771:31;:16;11792:9;11771:31;:20;:31;:::i;:::-;11820:15;;11852:17;;;11820:78;;;-1:-1:-1;;;11820:78:3;;-1:-1:-1;;;;;11852:17:3;;;11820:78;;;;;;;;;;;;;;;;-1:-1:-1;11820:15:3;;;;-1:-1:-1;;11820:78:3;;;;;;;;;;;;;;;-1:-1:-1;11820:15:3;:78;;;5:2:-1;;;;30:1;27;20:12;5:2;11820:78:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11820:78:3;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11820:78:3;11812:117;;;;;-1:-1:-1;;;11812:117:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;11939:60;11973:25;11939:33;:60::i;:::-;12010:17;;12072:11;:25;;-1:-1:-1;;;;;12010:17:3;;;;:34;;12053:4;;12060:10;;12072:11;12084:12;;12072:25;;;;;;;;;;;;;;;12010:112;;;-1:-1:-1;;;;;;;12010:112:3;;;;;;-1:-1:-1;;;;;12010:112:3;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12010:112:3;;;;;;;;;;;;;;;;;12072:25;12010:112;;;;;12072:25;12010:112;;;;5:2:-1;;;;30:1;27;20:12;5:2;12010:112:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;12138:82:3;;;;;;;;;;;;;;;;;;;;12187:12;;-1:-1:-1;12146:10:3;;-1:-1:-1;12138:82:3;;;;;;;;;11229:998;;;;;;:::o;10257:966::-;10402:11;:18;10340:27;;10387:33;;10379:67;;;;;-1:-1:-1;;;10379:67:3;;;;;;;;;;;;-1:-1:-1;;;10379:67:3;;;;;;;;;;;;;;;10457:26;10486:17;:15;:17::i;:::-;10457:46;;10513:25;10565:12;10573:3;;1533:6;10565:7;;:12;;;;:::i;:::-;10541:21;:12;1533:6;10541:21;:16;:21;:::i;:::-;:36;;;;;;10513:64;;10587:25;10615:12;10628;10615:26;;;;;;;;;;;;;;10587:54;;10651:25;10679:29;1533:6;10679:20;:24;;:29;;;;:::i;:::-;10651:57;-1:-1:-1;10722:6:3;10718:322;10738:12;:19;10734:1;:23;10718:322;;;10786:12;10781:1;:17;10778:252;;10818:16;10837:12;10850:1;10837:15;;;;;;;;;;;;;;10818:34;;10893:122;10960:37;10976:20;10960:11;:15;;:37;;;;:::i;:::-;10893;:20;10918:11;10893:37;:24;:37;:::i;:::-;:45;:122;:45;:122;:::i;:::-;10870:145;;10778:252;;10759:3;;10718:322;;;;11080:1;11057:20;:24;11049:64;;;;;-1:-1:-1;;;11049:64:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;11131:85;11195:20;11131:59;11156:33;:20;1533:6;11156:33;:28;:33;:::i;:::-;11131:20;;:59;:24;:59;:::i;:::-;:63;:85;:63;:85;:::i;:::-;11124:92;10257:966;-1:-1:-1;;;;;;;10257:966:3:o;1546:42::-;;;-1:-1:-1;;;;;1546:42:3;;:::o;1833:108:1:-;-1:-1:-1;;;;;1916:18:1;1890:7;1916:18;;;;;;;;;;;;1833:108::o;3394:115:3:-;3442:4;3465:37;3483:18;;3465:13;;:17;;:37;;;;:::i;:::-;3458:44;;3394:115;:::o;4567:213:1:-;4677:10;4652:4;4698:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;4698:32:1;;;;;;;;;;4652:4;;4668:84;;4698:32;;:53;;4735:15;4698:36;:53::i;2144:153::-;2213:4;2229:40;2239:10;2251:9;2262:6;2229:9;:40::i;1594:29:3:-;;;-1:-1:-1;;;;;1594:29:3;;:::o;8885:385::-;9101:6;-1:-1:-1;;;;;9127:25:3;;9147:4;9127:25;:47;;;;-1:-1:-1;;;;;;9156:18:3;;;9127:47;9123:121;;;-1:-1:-1;;;;9190:43:3;;9123:121;-1:-1:-1;9260:3:3;8885:385;;;;;;;;;;;:::o;12233:839::-;12333:24;12360:42;12375:12;12389;12360:14;:42::i;:::-;12333:69;;12443:22;12420:19;:45;;12412:86;;;;;-1:-1:-1;;;12412:86:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;12509:17;;12571:11;:25;;-1:-1:-1;;;;;12509:17:3;;;;:34;;12544:10;;12564:4;;12571:11;12583:12;;12571:25;;;;;;;;;;;;;;;12509:113;;;-1:-1:-1;;;;;;;12509:113:3;;;;;;-1:-1:-1;;;;;12509:113:3;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12509:113:3;;;;;;;;;;;;;;;;;12571:25;12509:113;;;;;12571:25;12509:113;;;;5:2:-1;;;;30:1;27;20:12;5:2;12509:113:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12509:113:3;;;;12633:14;12675:12;12683:3;;1533:6;12675:7;;:12;;;;:::i;:::-;12667:3;;12650:21;;:12;;:21;:16;:21;:::i;:::-;:38;;;;;;12633:55;;12714:28;12732:9;12714:13;;:17;;:28;;;;:::i;:::-;12698:13;:44;12752:25;12780:27;:12;12797:9;12780:27;:16;:27;:::i;:::-;12752:55;;12817:56;12852:20;12817:34;:56::i;:::-;12892:15;;:50;;;-1:-1:-1;;;12892:50:3;;12917:10;12892:50;;;;;;;;;;;;-1:-1:-1;;;;;12892:15:3;;;;-1:-1:-1;;12892:50:3;;;;;;;;;;;;;;;-1:-1:-1;12892:15:3;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;12892:50:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12892:50:3;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12892:50:3;12884:85;;;;;-1:-1:-1;;;12884:85:3;;;;;;;;;;;;-1:-1:-1;;;12884:85:3;;;;;;;;;;;;;;;12985:80;;;;;;;;;;;;;;;;;;;;13031:12;;12994:10;;12985:80;;;;;;;;;12233:839;;;;;;:::o;5147:2524::-;5270:1;5257:10;:14;5249:51;;;;;-1:-1:-1;;;5249:51:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;5354:11;:18;5343:30;;;;;;;;;;;;;;;;5311:29;;5343:30;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;5343:30:3;;5311:62;;5383:20;5406:13;:11;:13::i;:::-;5383:36;-1:-1:-1;5429:15:3;5457:19;;5454:1503;;5500:28;;5492:91;;;;-1:-1:-1;;;5492:91:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5597:26;5626:17;:15;:17::i;:::-;5597:46;-1:-1:-1;5657:15:3;;5690:192;5710:12;:19;5706:1;:23;5690:192;;;5754:12;5769;5782:1;5769:15;;;;;;;;;;;;;;5754:30;;5818:7;5805:10;:20;5802:65;;;5860:7;5847:20;;5802:65;-1:-1:-1;5731:3:3;;5690:192;;;-1:-1:-1;5900:6:3;5896:204;5916:12;:19;5912:1;:23;5896:204;;;5960:14;6011:10;5977:31;5992:12;6005:1;5992:15;;;;;;;;;;;;;;5977:10;:14;;:31;;;;:::i;:::-;:44;;;;;;;-1:-1:-1;6060:25:3;:10;5977:44;6060:25;:14;:25;:::i;:::-;6039:15;6055:1;6039:18;;;;;;;;;;;;;;;;;:46;-1:-1:-1;5937:3:3;;5896:204;;;-1:-1:-1;6161:10:3;6127:31;:10;6142:15;6127:31;:14;:31;:::i;:::-;:44;;;;;;6114:57;;5454:1503;;;;;6205:27;;6202:707;;6287:11;:18;6260:45;;6252:73;;;;;-1:-1:-1;;;6252:73:3;;;;;;;;;;;;-1:-1:-1;;;6252:73:3;;;;;;;;;;;;;;;6343:12;;6377:201;6393:27;;;6377:201;;;6449:9;6461:16;;6478:1;6461:19;;;;;;;;;;;;;6449:31;;6515:4;6505:7;:14;6502:57;;;6555:4;6545:14;;6502:57;-1:-1:-1;6422:3:3;;6377:201;;;-1:-1:-1;6600:6:3;6596:299;6612:27;;;6596:299;;;6668:14;6723:7;6685:35;6700:16;;6717:1;6700:19;;;;;;;;;;;;;6685:10;:14;;:35;;;;:::i;:::-;:45;;;;;;6668:62;;6772:1;6760:9;:13;6752:56;;;;;-1:-1:-1;;;6752:56:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;6851:25;:10;6866:9;6851:25;:14;:25;:::i;:::-;6830:15;6846:1;6830:18;;;;;;;;;;;;;;;;;:46;-1:-1:-1;6641:3:3;;6596:299;;;;6202:707;;-1:-1:-1;6936:10:3;5454:1503;6975:15;;:67;;;-1:-1:-1;;;6975:67:3;;7004:10;6975:67;;;;7024:4;6975:67;;;;;;;;;;;;-1:-1:-1;;;;;6975:15:3;;;;-1:-1:-1;;6975:67:3;;;;;;;;;;;;;;;-1:-1:-1;6975:15:3;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;6975:67:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6975:67:3;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6975:67:3;6967:103;;;;;-1:-1:-1;;;6967:103:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;7088:15;;7120:17;;;7088:63;;;-1:-1:-1;;;7088:63:3;;-1:-1:-1;;;;;7120:17:3;;;7088:63;;;;;;;;;;;;;;:15;;;-1:-1:-1;;7088:63:3;;;;;;;;;;;;;;;-1:-1:-1;7088:15:3;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;7088:63:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7088:63:3;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7088:63:3;7080:102;;;;;-1:-1:-1;;;7080:102:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;7192:45;7226:10;7192:33;:45::i;:::-;7248:29;7254:10;7266;7248:5;:29::i;:::-;7288:17;;;:100;;-1:-1:-1;;;7288:100:3;;7336:4;7288:100;;;;;;7343:10;7288:100;;;;;;;;;;;;;7355:11;7288:100;;;;;;;;-1:-1:-1;;;;;7288:17:3;;;;:39;;7336:4;;7343:10;;7355:11;;7368:15;;7288:100;;;;;;;;;;;;;;7355:11;;7288:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7288:100:3;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7288:100:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7288:100:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;7467:6:3;;-1:-1:-1;;;7462:130:3;7483:15;:22;7479:1;:26;7462:130;;;7547:34;7562:15;7578:1;7562:18;;;;;;;;;;;;;;7547:10;:14;;:34;;;;:::i;:::-;7526:15;7542:1;7526:18;;;;;;;;;;;;;;;;;:55;7507:3;;7462:130;;;-1:-1:-1;7607:57:3;;;;;;;;;;;;;;;;;;;;;;;;7624:10;;7607:57;;7636:15;;7653:10;;7607:57;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7607:57:3;;;;;;;;;;;;;;;;;;5147:2524;;;;;;:::o;1629:29::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1629:29:3;:::o;2355:132:1:-;-1:-1:-1;;;;;2453:18:1;;;2427:7;2453:18;;;-1:-1:-1;2453:18:1;;;;;;;;:27;;;;;;;;;;;;;2355:132::o;1664:15:3:-;;;;:::o;7677:867::-;7750:26;7779:17;:15;:17::i;:::-;7750:46;;7807:25;7846:12;:19;7835:31;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;7835:31:3;;7807:59;;7877:20;7900:13;:11;:13::i;:::-;7877:36;-1:-1:-1;7927:6:3;7923:139;7943:12;:19;7939:1;:23;7923:139;;;8036:15;8000:33;8020:12;8000;8013:1;8000:15;;;;;;;;;;;;;;:19;;:33;;;;:::i;:::-;:51;;;;;;7983:11;7995:1;7983:14;;;;;;;;;;;;;;;;;:68;7964:3;;7923:139;;;-1:-1:-1;8108:15:3;;:40;;;-1:-1:-1;;;8108:40:3;;8142:4;8108:40;;;;;;-1:-1:-1;;;;;;;8108:15:3;;-1:-1:-1;;8108:40:3;;;;;;;;;;;;;;:15;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;8108:40:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8108:40:3;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8108:40:3;;-1:-1:-1;8159:31:3;8165:10;8177:12;8159:5;:31::i;:::-;8277:15;;:40;;;-1:-1:-1;;;8277:40:3;;8311:4;8277:40;;;;;;8231:96;;-1:-1:-1;;;;;8277:15:3;;-1:-1:-1;;8277:40:3;;;;;;;;;;;;;;:15;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;8277:40:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8277:40:3;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8277:40:3;8231:28;;:96;:32;:96;:::i;:::-;8338:17;;;:96;;-1:-1:-1;;;8338:96:3;;8386:4;8338:96;;;;;;8393:10;8338:96;;;;;;;;;;;;;8405:11;8338:96;;;;;;;;8200:127;;-1:-1:-1;;;;;;8338:17:3;;;;:39;;8386:4;8393:10;;8405:11;;8418;;8338:96;;;;;;;;;;;;;;;;8405:11;;8338:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8338:96:3;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;8338:96:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8338:96:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8338:96:3;;;;8469:10;-1:-1:-1;;;;;8450:87:3;;8481:11;8494:28;8524:12;8450:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;8450:87:3;;;;;;;;;;;;;;;;;;;7677:867;;;;;:::o;8550:329::-;8737:6;-1:-1:-1;;;;;8763:25:3;;8783:4;8763:25;8759:94;;;-1:-1:-1;;;;8804:38:3;;8759:94;-1:-1:-1;8869:3:3;8550:329;;;;;;;;;:::o;9276:975::-;9401:11;:18;9362:4;;9386:33;;9378:67;;;;;-1:-1:-1;;;9378:67:3;;;;;;;;;;;;-1:-1:-1;;;9378:67:3;;;;;;;;;;;;;;;9456:26;9485:17;:15;:17::i;:::-;9456:46;;9512:30;9545:53;1533:6;9566:25;9587:3;;9566:16;:20;;:25;;;;:::i;:::-;:31;;;;;9545:16;;9566:31;;9545:53;:20;:53;:::i;:::-;9512:86;;9608:24;9635:12;9648;9635:26;;;;;;;;;;;;;;9608:53;;9671:25;9699:28;1533:6;9699:19;:23;;:28;;;;:::i;:::-;9671:56;-1:-1:-1;9741:6:3;9737:327;9757:12;:19;9753:1;:23;9737:327;;;9805:12;9800:1;:17;9797:257;;9837:16;9856:12;9869:1;9856:15;;;;;;;;;;;;;;9837:34;;9912:127;9979:42;9995:25;9979:11;:15;;:42;;;;:::i;9912:127::-;9889:150;;9797:257;;9778:3;;9737:327;;;;10104:1;10081:20;:24;10073:64;;;;;-1:-1:-1;;;10073:64:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;10155:89;10210:33;:20;1533:6;10210:33;:28;:33;:::i;:::-;10155:50;:19;10179:25;10155:50;:23;:50;:::i;7474:332:1:-;-1:-1:-1;;;;;7567:19:1;;7559:68;;;;-1:-1:-1;;;7559:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7645:21:1;;7637:68;;;;-1:-1:-1;;;7637:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7716:18:1;;;;;;;-1:-1:-1;7716:18:1;;;;;;;;:27;;;;;;;;;;;;;:36;;;7767:32;;;;;;;;;;;;;;;;;7474:332;;;:::o;1693:458:22:-;1751:7;1991:6;1987:45;;-1:-1:-1;2020:1:22;2013:8;;1987:45;2054:5;;;2058:1;2054;:5;:1;2077:5;;;;;:10;2069:56;;;;-1:-1:-1;;;2069:56:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1274:179;1332:7;1364:1;1359;:6;;1351:49;;;;;-1:-1:-1;;;1351:49:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1422:5:22;;;1274:179::o;834:176::-;892:7;923:5;;;946:6;;;;938:46;;;;;-1:-1:-1;;;938:46:22;;;;;;;;;;;;;;;;;;;;;;;;;;;5254:480:1;-1:-1:-1;;;;;5351:20:1;;5343:70;;;;-1:-1:-1;;;5343:70:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5431:23:1;;5423:71;;;;-1:-1:-1;;;5423:71:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5505:47;5526:6;5534:9;5545:6;5505:20;:47::i;:::-;-1:-1:-1;;;;;5583:17:1;;:9;:17;;;;;;;;;;;:29;;5605:6;5583:21;:29::i;:::-;-1:-1:-1;;;;;5563:17:1;;;:9;:17;;;;;;;;;;;:49;;;;5645:20;;;;;;;:32;;5670:6;5645:24;:32::i;:::-;-1:-1:-1;;;;;5622:20:1;;;:9;:20;;;;;;;;;;;;:55;;;;5692:35;;;;;;;5622:20;;5692:35;;;;;;;;;;;;;5254:480;;;:::o;2502:444:3:-;2601:12;:19;-1:-1:-1;;2601:23:3;2588:352;2636:1;2630;2626:11;2588:352;;2658:23;2684:44;2707:17;2725:1;2707:20;;;;;;;;;;;;;;;;2684:22;:44::i;:::-;2658:70;-1:-1:-1;2746:6:3;2742:188;2762:13;2776:1;2762:16;;;;;;;;;;;;;;;;;:23;2758:27;;2742:188;;;2810:17;;2842:15;;2859:13;:16;;-1:-1:-1;;;;;2810:17:3;;;;:31;;2842:15;;2859:13;2873:1;;2859:16;;;;;;;;;;;;;2876:1;2859:19;;;;;;;;;;;;;;;;2880:12;2893:1;2880:15;;;;;;;;;;;;;;;;2897:9;2908:6;2810:105;;;;;;;;;;;;;-1:-1:-1;;;;;2810:105:3;-1:-1:-1;;;;;2810:105:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2810:105:3;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2810:105:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;2787:3:3;;;;;-1:-1:-1;2742:188:3;;-1:-1:-1;2742:188:3;;-1:-1:-1;;;;2639:3:3;2588:352;;;;2502:444;:::o;1891:314::-;1940:13;1965:23;2005:11;:18;;;;1991:33;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;1991:33:3;-1:-1:-1;1965:59:3;-1:-1:-1;2038:6:3;2034:95;2054:11;:18;2050:22;;2034:95;;;2113:4;2093:6;2100:1;2093:9;;;;;;;;-1:-1:-1;;;;;2093:25:3;;;;:9;;;;;;;;;;;:25;-1:-1:-1;2074:3:3;2034:95;;;-1:-1:-1;2145:17:3;;;:53;;;-1:-1:-1;;;2145:53:3;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2145:17:3;;;;:32;;:53;;2186:11;;2145:53;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2145:53:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2145:53:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2145:53:3;;;;;;39:16:-1;36:1;17:17;2:54;101:4;2145:53:3;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;2145:53:3;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;244:29;;325:2;307:21;;285:44;;282:59;-1:-1;233:116;230:2;;;362:1;359;352:12;230:2;-1:-1;2145:53:3;;-1:-1:-1;;;;;;1891:314:3;:::o;598:135::-;654:4;673:5;;670:34;;698:1;693;689;:5;688:11;;;;;;703:1;687:17;680:24;;;;670:34;725:1;721;:5;;;;;;;598:135;-1:-1:-1;;;598:135:3:o;2952:436::-;3043:6;3039:343;3059:12;:19;3055:23;;3039:343;;;3099:23;3125:44;3148:17;3166:1;3148:20;;;;;;;3125:44;3099:70;-1:-1:-1;3187:6:3;3183:189;3203:13;3217:1;3203:16;;;;;;;;;;;;;;;;;:23;3199:27;;3183:189;;;3251:17;;3284:15;;3301:13;:16;;-1:-1:-1;;;;;3251:17:3;;;;:32;;3284:15;;3301:13;3315:1;;3301:16;;;;;;;;;;;;;3318:1;3301:19;;;;;;;;;;;;;;;;3322:12;3335:1;3322:15;;;;;;;;;;;;;;;;3339:9;3350:6;3251:106;;;;;;;;;;;;;-1:-1:-1;;;;;3251:106:3;-1:-1:-1;;;;;3251:106:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3251:106:3;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3251:106:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;3228:3:3;;;;;-1:-1:-1;3183:189:3;;-1:-1:-1;3183:189:3;;-1:-1:-1;;3080:3:3;;3039:343;;6004:362:1;-1:-1:-1;;;;;6079:21:1;;6071:65;;;;;-1:-1:-1;;;6071:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;6147:49;6176:1;6180:7;6189:6;6147:20;:49::i;:::-;6222:12;;:24;;6239:6;6222:24;:16;:24;:::i;:::-;6207:12;:39;-1:-1:-1;;;;;6277:18:1;;:9;:18;;;;;;;;;;;:30;;6300:6;6277:22;:30::i;:::-;-1:-1:-1;;;;;6256:18:1;;:9;:18;;;;;;;;;;;:51;;;;6322:37;;;;;;;6256:18;;:9;;6322:37;;;;;;;;;;6004:362;;:::o;6685:364::-;-1:-1:-1;;;;;6760:21:1;;6752:67;;;;-1:-1:-1;;;6752:67:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6830:49;6851:7;6868:1;6872:6;6830:20;:49::i;:::-;-1:-1:-1;;;;;6911:18:1;;:9;:18;;;;;;;;;;;:30;;6934:6;6911:22;:30::i;:::-;-1:-1:-1;;;;;6890:18:1;;:9;:18;;;;;;;;;;:51;6966:12;;:24;;6983:6;6966:16;:24::i;:::-;6951:12;:39;7005:37;;;;;;;;7031:1;;-1:-1:-1;;;;;7005:37:1;;;;;;;;;;;;6685:364;;:::o;4223:918:3:-;-1:-1:-1;;;;;4318:18:3;;;4314:67;;4352:18;4365:4;4352:12;:18::i;:::-;4391:16;4410:13;:11;:13::i;:::-;4391:32;-1:-1:-1;4433:26:3;4462:16;;:91;;4514:13;;4542:11;;4514:25;;4532:6;4514:25;:17;:25;:::i;:::-;:39;;;;;;4462:91;;;4493:6;4462:91;4433:120;-1:-1:-1;;;;;;4568:18:3;;;4564:284;;-1:-1:-1;;;;;4624:19:3;;;;;;:13;:19;;;;;;:46;;4648:21;4624:23;:46::i;:::-;-1:-1:-1;;;;;4602:19:3;;;;;;:13;:19;;;;;:68;4705:18;;:45;;4728:21;4705:22;:45::i;:::-;4684:18;:66;4564:284;;;4797:13;;:40;;4815:21;4797:40;:17;:40;:::i;:::-;4781:13;:56;4564:284;-1:-1:-1;;;;;4861:16:3;;;4857:278;;-1:-1:-1;;;;;4913:17:3;;;;;;:13;:17;;;;;;:44;;4935:21;4913;:44::i;:::-;-1:-1:-1;;;;;4893:17:3;;;;;;:13;:17;;;;;:64;4992:18;;:45;;5015:21;4992:22;:45::i;:::-;4971:18;:66;4857:278;;;5084:13;;:40;;5102:21;5084:40;:17;:40;:::i;:::-;5068:13;:56;4857:278;4223:918;;;;;:::o;2211:285::-;2312:23;2374:16;2363:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;2363:28:3;-1:-1:-1;2351:40:3;-1:-1:-1;2405:6:3;2401:89;2421:16;2417:1;:20;2401:89;;;2478:1;2473;:6;;2458:9;2468:1;2458:12;;;;;;;;;;;;;;;;;:21;2439:3;;2401:89;;;;2211:285;;;:::o","source":"pragma solidity ^0.5.1;\n\nimport { SafeMath } from \"openzeppelin-solidity/contracts/math/SafeMath.sol\";\nimport { IERC20 } from \"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\";\nimport { ConditionalTokens } from \"@gnosis.pm/conditional-tokens-contracts/contracts/ConditionalTokens.sol\";\nimport { CTHelpers } from \"@gnosis.pm/conditional-tokens-contracts/contracts/CTHelpers.sol\";\nimport { ERC1155TokenReceiver } from \"@gnosis.pm/conditional-tokens-contracts/contracts/ERC1155/ERC1155TokenReceiver.sol\";\nimport { ERC20 } from \"./ERC20.sol\";\n\n\nlibrary CeilDiv {\n    // calculates ceil(x/y)\n    function ceildiv(uint x, uint y) internal pure returns (uint) {\n        if(x > 0) return ((x - 1) / y) + 1;\n        return x / y;\n    }\n}\n\n\ncontract FixedProductMarketMaker is ERC20, ERC1155TokenReceiver {\n    event FPMMFundingAdded(\n        address indexed funder,\n        uint[] amountsAdded,\n        uint sharesMinted\n    );\n    event FPMMFundingRemoved(\n        address indexed funder,\n        uint[] amountsRemoved,\n        uint collateralRemovedFromFeePool,\n        uint sharesBurnt\n    );\n    event FPMMBuy(\n        address indexed buyer,\n        uint investmentAmount,\n        uint feeAmount,\n        uint indexed outcomeIndex,\n        uint outcomeTokensBought\n    );\n    event FPMMSell(\n        address indexed seller,\n        uint returnAmount,\n        uint feeAmount,\n        uint indexed outcomeIndex,\n        uint outcomeTokensSold\n    );\n\n    using SafeMath for uint;\n    using CeilDiv for uint;\n\n    uint constant ONE = 10**18;\n\n    ConditionalTokens public conditionalTokens;\n    IERC20 public collateralToken;\n    bytes32[] public conditionIds;\n    uint public fee;\n    uint internal feePoolWeight;\n\n    uint[] outcomeSlotCounts;\n    bytes32[][] collectionIds;\n    uint[] positionIds;\n    mapping (address => uint256) withdrawnFees;\n    uint internal totalWithdrawnFees;\n\n    function getPoolBalances() private view returns (uint[] memory) {\n        address[] memory thises = new address[](positionIds.length);\n        for(uint i = 0; i < positionIds.length; i++) {\n            thises[i] = address(this);\n        }\n        return conditionalTokens.balanceOfBatch(thises, positionIds);\n    }\n\n    function generateBasicPartition(uint outcomeSlotCount)\n        private\n        pure\n        returns (uint[] memory partition)\n    {\n        partition = new uint[](outcomeSlotCount);\n        for(uint i = 0; i < outcomeSlotCount; i++) {\n            partition[i] = 1 << i;\n        }\n    }\n\n    function splitPositionThroughAllConditions(uint amount)\n        private\n    {\n        for(uint i = conditionIds.length - 1; int(i) >= 0; i--) {\n            uint[] memory partition = generateBasicPartition(outcomeSlotCounts[i]);\n            for(uint j = 0; j < collectionIds[i].length; j++) {\n                conditionalTokens.splitPosition(collateralToken, collectionIds[i][j], conditionIds[i], partition, amount);\n            }\n        }\n    }\n\n    function mergePositionsThroughAllConditions(uint amount)\n        private\n    {\n        for(uint i = 0; i < conditionIds.length; i++) {\n            uint[] memory partition = generateBasicPartition(outcomeSlotCounts[i]);\n            for(uint j = 0; j < collectionIds[i].length; j++) {\n                conditionalTokens.mergePositions(collateralToken, collectionIds[i][j], conditionIds[i], partition, amount);\n            }\n        }\n    }\n\n    function collectedFees() external view returns (uint) {\n        return feePoolWeight.sub(totalWithdrawnFees);\n    }\n\n    function feesWithdrawableBy(address account) public view returns (uint) {\n        uint rawAmount = feePoolWeight.mul(balanceOf(account)) / totalSupply();\n        return rawAmount.sub(withdrawnFees[account]);\n    }\n\n    function withdrawFees(address account) public {\n        uint rawAmount = feePoolWeight.mul(balanceOf(account)) / totalSupply();\n        uint withdrawableAmount = rawAmount.sub(withdrawnFees[account]);\n        if(withdrawableAmount > 0){\n            withdrawnFees[account] = rawAmount;\n            totalWithdrawnFees = totalWithdrawnFees.add(withdrawableAmount);\n            require(collateralToken.transfer(account, withdrawableAmount), \"withdrawal transfer failed\");\n        }\n    }\n\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal {\n        if (from != address(0)) {\n            withdrawFees(from);\n        }\n\n        uint totalSupply = totalSupply();\n        uint withdrawnFeesTransfer = totalSupply == 0 ?\n            amount :\n            feePoolWeight.mul(amount) / totalSupply;\n\n        if (from != address(0)) {\n            withdrawnFees[from] = withdrawnFees[from].sub(withdrawnFeesTransfer);\n            totalWithdrawnFees = totalWithdrawnFees.sub(withdrawnFeesTransfer);\n        } else {\n            feePoolWeight = feePoolWeight.add(withdrawnFeesTransfer);\n        }\n        if (to != address(0)) {\n            withdrawnFees[to] = withdrawnFees[to].add(withdrawnFeesTransfer);\n            totalWithdrawnFees = totalWithdrawnFees.add(withdrawnFeesTransfer);\n        } else {\n            feePoolWeight = feePoolWeight.sub(withdrawnFeesTransfer);\n        }\n    }\n\n    function addFunding(uint addedFunds, uint[] calldata distributionHint)\n        external\n    {\n        require(addedFunds > 0, \"funding must be non-zero\");\n\n        uint[] memory sendBackAmounts = new uint[](positionIds.length);\n        uint poolShareSupply = totalSupply();\n        uint mintAmount;\n        if(poolShareSupply > 0) {\n            require(distributionHint.length == 0, \"cannot use distribution hint after initial funding\");\n            uint[] memory poolBalances = getPoolBalances();\n            uint poolWeight = 0;\n            for(uint i = 0; i < poolBalances.length; i++) {\n                uint balance = poolBalances[i];\n                if(poolWeight < balance)\n                    poolWeight = balance;\n            }\n\n            for(uint i = 0; i < poolBalances.length; i++) {\n                uint remaining = addedFunds.mul(poolBalances[i]) / poolWeight;\n                sendBackAmounts[i] = addedFunds.sub(remaining);\n            }\n\n            mintAmount = addedFunds.mul(poolShareSupply) / poolWeight;\n        } else {\n            if(distributionHint.length > 0) {\n                require(distributionHint.length == positionIds.length, \"hint length off\");\n                uint maxHint = 0;\n                for(uint i = 0; i < distributionHint.length; i++) {\n                    uint hint = distributionHint[i];\n                    if(maxHint < hint)\n                        maxHint = hint;\n                }\n\n                for(uint i = 0; i < distributionHint.length; i++) {\n                    uint remaining = addedFunds.mul(distributionHint[i]) / maxHint;\n                    require(remaining > 0, \"must hint a valid distribution\");\n                    sendBackAmounts[i] = addedFunds.sub(remaining);\n                }\n            }\n\n            mintAmount = addedFunds;\n        }\n\n        require(collateralToken.transferFrom(msg.sender, address(this), addedFunds), \"funding transfer failed\");\n        require(collateralToken.approve(address(conditionalTokens), addedFunds), \"approval for splits failed\");\n        splitPositionThroughAllConditions(addedFunds);\n\n        _mint(msg.sender, mintAmount);\n\n        conditionalTokens.safeBatchTransferFrom(address(this), msg.sender, positionIds, sendBackAmounts, \"\");\n\n        // transform sendBackAmounts to array of amounts added\n        for (uint i = 0; i < sendBackAmounts.length; i++) {\n            sendBackAmounts[i] = addedFunds.sub(sendBackAmounts[i]);\n        }\n\n        emit FPMMFundingAdded(msg.sender, sendBackAmounts, mintAmount);\n    }\n\n    function removeFunding(uint sharesToBurn)\n        external\n    {\n        uint[] memory poolBalances = getPoolBalances();\n\n        uint[] memory sendAmounts = new uint[](poolBalances.length);\n\n        uint poolShareSupply = totalSupply();\n        for(uint i = 0; i < poolBalances.length; i++) {\n            sendAmounts[i] = poolBalances[i].mul(sharesToBurn) / poolShareSupply;\n        }\n\n        uint collateralRemovedFromFeePool = collateralToken.balanceOf(address(this));\n\n        _burn(msg.sender, sharesToBurn);\n        collateralRemovedFromFeePool = collateralRemovedFromFeePool.sub(\n            collateralToken.balanceOf(address(this))\n        );\n\n        conditionalTokens.safeBatchTransferFrom(address(this), msg.sender, positionIds, sendAmounts, \"\");\n\n        emit FPMMFundingRemoved(msg.sender, sendAmounts, collateralRemovedFromFeePool, sharesToBurn);\n    }\n\n    function onERC1155Received(\n        address operator,\n        address from,\n        uint256 id,\n        uint256 value,\n        bytes calldata data\n    )\n        external\n        returns (bytes4)\n    {\n        if (operator == address(this)) {\n            return this.onERC1155Received.selector;\n        }\n        return 0x0;\n    }\n\n    function onERC1155BatchReceived(\n        address operator,\n        address from,\n        uint256[] calldata ids,\n        uint256[] calldata values,\n        bytes calldata data\n    )\n        external\n        returns (bytes4)\n    {\n        if (operator == address(this) && from == address(0)) {\n            return this.onERC1155BatchReceived.selector;\n        }\n        return 0x0;\n    }\n\n    function calcBuyAmount(uint investmentAmount, uint outcomeIndex) public view returns (uint) {\n        require(outcomeIndex < positionIds.length, \"invalid outcome index\");\n\n        uint[] memory poolBalances = getPoolBalances();\n        uint investmentAmountMinusFees = investmentAmount.sub(investmentAmount.mul(fee) / ONE);\n        uint buyTokenPoolBalance = poolBalances[outcomeIndex];\n        uint endingOutcomeBalance = buyTokenPoolBalance.mul(ONE);\n        for(uint i = 0; i < poolBalances.length; i++) {\n            if(i != outcomeIndex) {\n                uint poolBalance = poolBalances[i];\n                endingOutcomeBalance = endingOutcomeBalance.mul(poolBalance).ceildiv(\n                    poolBalance.add(investmentAmountMinusFees)\n                );\n            }\n        }\n        require(endingOutcomeBalance > 0, \"must have non-zero balances\");\n\n        return buyTokenPoolBalance.add(investmentAmountMinusFees).sub(endingOutcomeBalance.ceildiv(ONE));\n    }\n\n    function calcSellAmount(uint returnAmount, uint outcomeIndex) public view returns (uint outcomeTokenSellAmount) {\n        require(outcomeIndex < positionIds.length, \"invalid outcome index\");\n\n        uint[] memory poolBalances = getPoolBalances();\n        uint returnAmountPlusFees = returnAmount.mul(ONE) / ONE.sub(fee);\n        uint sellTokenPoolBalance = poolBalances[outcomeIndex];\n        uint endingOutcomeBalance = sellTokenPoolBalance.mul(ONE);\n        for(uint i = 0; i < poolBalances.length; i++) {\n            if(i != outcomeIndex) {\n                uint poolBalance = poolBalances[i];\n                endingOutcomeBalance = endingOutcomeBalance.mul(poolBalance).ceildiv(\n                    poolBalance.sub(returnAmountPlusFees)\n                );\n            }\n        }\n        require(endingOutcomeBalance > 0, \"must have non-zero balances\");\n\n        return returnAmountPlusFees.add(endingOutcomeBalance.ceildiv(ONE)).sub(sellTokenPoolBalance);\n    }\n\n    function buy(uint investmentAmount, uint outcomeIndex, uint minOutcomeTokensToBuy) external {\n        uint outcomeTokensToBuy = calcBuyAmount(investmentAmount, outcomeIndex);\n        require(outcomeTokensToBuy >= minOutcomeTokensToBuy, \"minimum buy amount not reached\");\n\n        require(collateralToken.transferFrom(msg.sender, address(this), investmentAmount), \"cost transfer failed\");\n\n        uint feeAmount = investmentAmount.mul(fee) / ONE;\n        feePoolWeight = feePoolWeight.add(feeAmount);\n        uint investmentAmountMinusFees = investmentAmount.sub(feeAmount);\n        require(collateralToken.approve(address(conditionalTokens), investmentAmountMinusFees), \"approval for splits failed\");\n        splitPositionThroughAllConditions(investmentAmountMinusFees);\n\n        conditionalTokens.safeTransferFrom(address(this), msg.sender, positionIds[outcomeIndex], outcomeTokensToBuy, \"\");\n\n        emit FPMMBuy(msg.sender, investmentAmount, feeAmount, outcomeIndex, outcomeTokensToBuy);\n    }\n\n    function sell(uint returnAmount, uint outcomeIndex, uint maxOutcomeTokensToSell) external {\n        uint outcomeTokensToSell = calcSellAmount(returnAmount, outcomeIndex);\n        require(outcomeTokensToSell <= maxOutcomeTokensToSell, \"maximum sell amount exceeded\");\n\n        conditionalTokens.safeTransferFrom(msg.sender, address(this), positionIds[outcomeIndex], outcomeTokensToSell, \"\");\n\n        uint feeAmount = returnAmount.mul(fee) / (ONE.sub(fee));\n        feePoolWeight = feePoolWeight.add(feeAmount);\n        uint returnAmountPlusFees = returnAmount.add(feeAmount);\n        mergePositionsThroughAllConditions(returnAmountPlusFees);\n\n        require(collateralToken.transfer(msg.sender, returnAmount), \"return transfer failed\");\n\n        emit FPMMSell(msg.sender, returnAmount, feeAmount, outcomeIndex, outcomeTokensToSell);\n    }\n}\n\n\n// for proxying purposes\ncontract FixedProductMarketMakerData {\n    mapping (address => uint256) internal _balances;\n    mapping (address => mapping (address => uint256)) internal _allowances;\n    uint256 internal _totalSupply;\n\n\n    bytes4 internal constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\n    mapping(bytes4 => bool) internal _supportedInterfaces;\n\n\n    event FPMMFundingAdded(\n        address indexed funder,\n        uint[] amountsAdded,\n        uint sharesMinted\n    );\n    event FPMMFundingRemoved(\n        address indexed funder,\n        uint[] amountsRemoved,\n        uint collateralRemovedFromFeePool,\n        uint sharesBurnt\n    );\n    event FPMMBuy(\n        address indexed buyer,\n        uint investmentAmount,\n        uint feeAmount,\n        uint indexed outcomeIndex,\n        uint outcomeTokensBought\n    );\n    event FPMMSell(\n        address indexed seller,\n        uint returnAmount,\n        uint feeAmount,\n        uint indexed outcomeIndex,\n        uint outcomeTokensSold\n    );\n    ConditionalTokens internal conditionalTokens;\n    IERC20 internal collateralToken;\n    bytes32[] internal conditionIds;\n    uint internal fee;\n    uint internal feePoolWeight;\n\n    uint[] internal outcomeSlotCounts;\n    bytes32[][] internal collectionIds;\n    uint[] internal positionIds;\n    mapping (address => uint256) internal withdrawnFees;\n    uint internal totalWithdrawnFees;\n}\n","compiler":{"name":"solc","version":"0.5.10+commit.5a6ea5b1.Emscripten.clang"},"networks":{},"schemaVersion":"3.0.16","updatedAt":"2020-03-16T19:03:53.047Z","devdoc":{"methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}.     * Requirements:     * - `spender` cannot be the zero address."},"balanceOf(address)":{"details":"See {IERC20-balanceOf}."},"decreaseAllowance(address,uint256)":{"details":"Atomically decreases the allowance granted to `spender` by the caller.     * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.     * Emits an {Approval} event indicating the updated allowance.     * Requirements:     * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."},"increaseAllowance(address,uint256)":{"details":"Atomically increases the allowance granted to `spender` by the caller.     * This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}.     * Emits an {Approval} event indicating the updated allowance.     * Requirements:     * - `spender` cannot be the zero address."},"supportsInterface(bytes4)":{"details":"See `IERC165.supportsInterface`.     * Time complexity O(1), guaranteed to always use less than 30 000 gas."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}.     * Requirements:     * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}.     * Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20};     * Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for `sender`'s tokens of at least `amount`."}}},"userdoc":{"methods":{}}}