[ { "inputs": [ { "internalType": "address", "name": "_vaultManager", "type": "address" }, { "internalType": "string", "name": "_baseURI", "type": "string" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" } ], "name": "AddressEmptyCode", "type": "error" }, { "inputs": [], "name": "ERC721EnumerableForbiddenBatchMint", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" } ], "name": "ERC721IncorrectOwner", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ERC721InsufficientApproval", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC721InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" } ], "name": "ERC721InvalidOperator", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "ERC721InvalidOwner", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC721InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC721InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ERC721NonexistentToken", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "ERC721OutOfBoundsIndex", "type": "error" }, { "inputs": [], "name": "FailedInnerCall", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "OwnableInvalidOwner", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "OwnableUnauthorizedAccount", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "approved", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "string", "name": "oldBaseURI", "type": "string" }, { "indexed": false, "internalType": "string", "name": "newBaseURI", "type": "string" } ], "name": "BaseURIChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "_fromTokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "_toTokenId", "type": "uint256" } ], "name": "BatchMetadataUpdate", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "contractAddress", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "status", "type": "bool" } ], "name": "ContractApproved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "newAdmin", "type": "address" } ], "name": "FirewallAdminUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "newFirewall", "type": "address" } ], "name": "FirewallUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "MetadataUpdate", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "poolId", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "newPoolId", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "splitLeftAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newSplitLeftAmount", "type": "uint256" } ], "name": "PoolSplit", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "poolId", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "withdrawnAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "leftAmount", "type": "uint256" } ], "name": "TokenWithdrawn", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [], "name": "acceptFirewallAdmin", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "approve", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "status", "type": "bool" } ], "name": "approvePoolTransfers", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "approvedContracts", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "approvedPoolUserTransfers", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address[]", "name": "tokens", "type": "address[]" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "balance", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "baseURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "destinationPoolId", "type": "uint256" }, { "internalType": "uint256", "name": "sourcePoolId", "type": "uint256" } ], "name": "cloneVaultId", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "firewallAdmin", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getApproved", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "poolId", "type": "uint256" } ], "name": "getData", "outputs": [ { "components": [ { "internalType": "contract IProvider", "name": "provider", "type": "address" }, { "internalType": "string", "name": "name", "type": "string" }, { "internalType": "uint256", "name": "poolId", "type": "uint256" }, { "internalType": "uint256", "name": "vaultId", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "uint256[]", "name": "params", "type": "uint256[]" } ], "internalType": "struct ILockDealNFT.BasePoolInfo", "name": "poolInfo", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "poolId", "type": "uint256" } ], "name": "getFullData", "outputs": [ { "components": [ { "internalType": "contract IProvider", "name": "provider", "type": "address" }, { "internalType": "string", "name": "name", "type": "string" }, { "internalType": "uint256", "name": "poolId", "type": "uint256" }, { "internalType": "uint256", "name": "vaultId", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "uint256[]", "name": "params", "type": "uint256[]" } ], "internalType": "struct ILockDealNFT.BasePoolInfo[]", "name": "poolInfo", "type": "tuple[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" }, { "internalType": "address[]", "name": "tokens", "type": "address[]" }, { "internalType": "uint256", "name": "from", "type": "uint256" }, { "internalType": "uint256", "name": "to", "type": "uint256" } ], "name": "getUserDataByTokens", "outputs": [ { "components": [ { "internalType": "contract IProvider", "name": "provider", "type": "address" }, { "internalType": "string", "name": "name", "type": "string" }, { "internalType": "uint256", "name": "poolId", "type": "uint256" }, { "internalType": "uint256", "name": "vaultId", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "uint256[]", "name": "params", "type": "uint256[]" } ], "internalType": "struct ILockDealNFT.BasePoolInfo[]", "name": "userPoolInfo", "type": "tuple[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "poolId", "type": "uint256" } ], "name": "getWithdrawableAmount", "outputs": [ { "internalType": "uint256", "name": "withdrawalAmount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "contract IProvider", "name": "provider", "type": "address" } ], "name": "mintAndTransfer", "outputs": [ { "internalType": "uint256", "name": "poolId", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "contract IProvider", "name": "provider", "type": "address" } ], "name": "mintForProvider", "outputs": [ { "internalType": "uint256", "name": "poolId", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "uint256", "name": "poolId", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "onERC721Received", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ownerOf", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "poolIdToProvider", "outputs": [ { "internalType": "contract IProvider", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "poolIdToVaultId", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "salePrice", "type": "uint256" } ], "name": "royaltyInfo", "outputs": [ { "internalType": "address", "name": "receiver", "type": "address" }, { "internalType": "uint256", "name": "royaltyAmount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" }, { "internalType": "bytes", "name": "targetPayload", "type": "bytes" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeFunctionCall", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "contract IProvider", "name": "provider", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeMintAndTransfer", "outputs": [ { "internalType": "uint256", "name": "poolId", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "setApprovalForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "contractAddress", "type": "address" }, { "internalType": "bool", "name": "status", "type": "bool" } ], "name": "setApprovedContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" }, { "internalType": "bool", "name": "status", "type": "bool" } ], "name": "setApprovedTarget", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "newBaseURI", "type": "string" } ], "name": "setBaseURI", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_firewall", "type": "address" } ], "name": "setFirewall", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_firewallAdmin", "type": "address" } ], "name": "setFirewallAdmin", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "tokenByIndex", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "poolId", "type": "uint256" } ], "name": "tokenOf", "outputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "tokenOfOwnerByIndex", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address[]", "name": "tokens", "type": "address[]" }, { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "tokenOfOwnerByIndex", "outputs": [ { "internalType": "uint256", "name": "poolId", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "tokenURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "transferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "updateAllMetadata", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "vaultManager", "outputs": [ { "internalType": "contract IVaultManager", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" } ]
608060405234801561001057600080fd5b50604051615fa2380380615fa283398101604081905261002f91610249565b600033806040518060400160405280600b81526020016a131bd8dad119585b13919560aa1b81525060405180604001604052806005815260200164131113919560da1b815250816000908161008491906103be565b50600161009182826103be565b5050506001600160a01b0381166100c357604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6100cc81610188565b506101006100fb60017f5dd2e3b890564a8f99f7f203f226a27a8aa59aee19a4ece5cf5eaa77ab91f66261047c565b839055565b61013361012e60017f29982a6ac507a2a707ced6dee5d76285dd49725db977de83d9702c628c97413661047c565b829055565b5061013f9050826101da565b600c80546001600160a01b0319166001600160a01b038416179055306000908152601060205260409020805460ff19166001179055600b61018082826103be565b5050506104a3565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0381166102305760405162461bcd60e51b815260206004820152601b60248201527f5a65726f2041646472657373206973206e6f7420616c6c6f776564000000000060448201526064016100ba565b50565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561025c57600080fd5b82516001600160a01b038116811461027357600080fd5b60208401519092506001600160401b0381111561028f57600080fd5b8301601f810185136102a057600080fd5b80516001600160401b038111156102b9576102b9610233565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102e7576102e7610233565b6040528181528282016020018710156102ff57600080fd5b60005b8281101561031e57602081850181015183830182015201610302565b506000602083830101528093505050509250929050565b600181811c9082168061034957607f821691505b60208210810361036957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156103b957806000526020600020601f840160051c810160208510156103965750805b601f840160051c820191505b818110156103b657600081556001016103a2565b50505b505050565b81516001600160401b038111156103d7576103d7610233565b6103eb816103e58454610335565b8461036f565b6020601f82116001811461041f57600083156104075750848201515b600019600385901b1c1916600184901b1784556103b6565b600084815260208120601f198516915b8281101561044f578785015182556020948501946001909201910161042f565b508482101561046d5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b8181038181111561049d57634e487b7160e01b600052601160045260246000fd5b92915050565b615af0806104b26000396000f3fe6080604052600436106102935760003560e01c8063665579381161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd1461085b578063e985e9c51461087b578063ea78803f1461089b578063f05c8582146108bb578063f2fde38b146108d0578063fde914b4146108f057600080fd5b8063a22cb4651461079b578063afa7688d146107bb578063b27abb06146107db578063b7f9a748146107fb578063b88d4fde1461081b578063bfbed3501461083b57600080fd5b8063875f438411610113578063875f4384146106db5780638a4adf24146106fb5780638c36d02d1461071b5780638da5cb5b1461073b57806395d89b41146107595780639bd51bfd1461076e57600080fd5b806366557938146106265780636c0360eb1461065c57806370a0823114610671578063715018a614610691578063734b7198146106a65780637c65c38b146106c657600080fd5b80632f745c59116101fe5780634f6ccce7116101b75780634f6ccce71461056657806355f804b3146105865780635c2bd9de146105a65780635ffd993b146105c6578063604e38ed146105e65780636352211e1461060657600080fd5b80632f745c591461049457806338c52df0146104b457806340a4376e146104c957806342842e0e146104f65780634aa3ab93146105165780634e17f2971461053657600080fd5b806318160ddd1161025057806318160ddd146103b35780631a8828f4146103d257806323b872dd146103e557806326749ad71461040557806327608c36146104355780632a55205a1461045557600080fd5b80630178fe3f1461029857806301ffc9a7146102ce57806306fdde03146102fe578063081812fc14610320578063095ea7b314610358578063150b7a021461037a575b600080fd5b3480156102a457600080fd5b506102b86102b3366004614bb7565b610910565b6040516102c59190614cdd565b60405180910390f35b3480156102da57600080fd5b506102ee6102e9366004614d06565b610946565b60405190151581526020016102c5565b34801561030a57600080fd5b50610313610986565b6040516102c59190614d23565b34801561032c57600080fd5b5061034061033b366004614bb7565b610a18565b6040516001600160a01b0390911681526020016102c5565b34801561036457600080fd5b50610378610373366004614d4b565b610a41565b005b34801561038657600080fd5b5061039a610395366004614dbf565b610a50565b6040516001600160e01b031990911681526020016102c5565b3480156103bf57600080fd5b506008545b6040519081526020016102c5565b6103786103e0366004614e31565b610c4d565b3480156103f157600080fd5b50610378610400366004614e9a565b610def565b34801561041157600080fd5b506102ee610420366004614edb565b60106020526000908152604090205460ff1681565b34801561044157600080fd5b506103c4610450366004614ef8565b610dff565b34801561046157600080fd5b50610475610470366004614f4b565b6111aa565b604080516001600160a01b0390931683526020830191909152016102c5565b3480156104a057600080fd5b506103c46104af366004614d4b565b61123c565b3480156104c057600080fd5b506103786112a4565b3480156104d557600080fd5b506104e96104e4366004614fb1565b6112d2565b6040516102c59190615017565b34801561050257600080fd5b50610378610511366004614e9a565b611449565b34801561052257600080fd5b506103c461053136600461507c565b611464565b34801561054257600080fd5b506102ee610551366004614edb565b600f6020526000908152604090205460ff1681565b34801561057257600080fd5b506103c4610581366004614bb7565b6114ea565b34801561059257600080fd5b506103786105a136600461517b565b611543565b3480156105b257600080fd5b506103c46105c13660046151c3565b6116c3565b3480156105d257600080fd5b506103786105e136600461522c565b6117d3565b3480156105f257600080fd5b506103c4610601366004615265565b611845565b34801561061257600080fd5b50610340610621366004614bb7565b611b2d565b34801561063257600080fd5b50610340610641366004614bb7565b600d602052600090815260409020546001600160a01b031681565b34801561066857600080fd5b50610313611b38565b34801561067d57600080fd5b506103c461068c366004614edb565b611bc6565b34801561069d57600080fd5b50610378611c0e565b3480156106b257600080fd5b506103786106c1366004614edb565b611c22565b3480156106d257600080fd5b50610378611cfa565b3480156106e757600080fd5b506103c46106f6366004614bb7565b611dd9565b34801561070757600080fd5b50600c54610340906001600160a01b031681565b34801561072757600080fd5b50610378610736366004614edb565b611e70565b34801561074757600080fd5b50600a546001600160a01b0316610340565b34801561076557600080fd5b50610313611f17565b34801561077a57600080fd5b506103c4610789366004614bb7565b600e6020526000908152604090205481565b3480156107a757600080fd5b506103786107b636600461522c565b611f26565b3480156107c757600080fd5b506103786107d63660046152fc565b611f31565b3480156107e757600080fd5b506104e96107f6366004614bb7565b611fb8565b34801561080757600080fd5b5061037861081636600461522c565b612148565b34801561082757600080fd5b50610378610836366004615319565b6121fe565b34801561084757600080fd5b506103c4610856366004615398565b61221b565b34801561086757600080fd5b50610313610876366004614bb7565b6123a0565b34801561088757600080fd5b506102ee610896366004615398565b612408565b3480156108a757600080fd5b506103406108b6366004614bb7565b612436565b3480156108c757600080fd5b506103406124b8565b3480156108dc57600080fd5b506103786108eb366004614edb565b6124db565b3480156108fc57600080fd5b5061037861090b366004614f4b565b612516565b610918614b5f565b6000828152600260205260409020546001600160a01b0316156109415761093e826126b5565b90505b919050565b60006001600160e01b0319821663152a902d60e11b148061097757506001600160e01b0319821663089be4bb60e11b145b8061093e575061093e82612817565b606060008054610995906153c6565b80601f01602080910402602001604051908101604052809291908181526020018280546109c1906153c6565b8015610a0e5780601f106109e357610100808354040283529160200191610a0e565b820191906000526020600020905b8154815290600101906020018083116109f157829003601f168201915b5050505050905090565b6000610a238261283c565b506000828152600460205260409020546001600160a01b031661093e565b610a4c828233612875565b5050565b600080610a73610a6f6001600080516020615a5b833981519152615416565b5490565b90506001600160a01b038116610b0357333014610ace5760405162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a59081b999d0818dbdb9d1c9858dd60621b60448201526064015b60405180910390fd5b610af3858785610ae757610ae28989612882565b612f01565b610ae2888a8989612d67565b630a85bd0160e11b915050610c44565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90610b3890339060009036908790600401615452565b600060405180830381600087803b158015610b5257600080fd5b505af1158015610b66573d6000803e3d6000fd5b50503330149150610bb290505760405162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a59081b999d0818dbdb9d1c9858dd60621b6044820152606401610ac5565b610bd2868886610bc657610ae28a8a612882565b610ae2898b8a8a612d67565b6040516393163a9160e01b8152630a85bd0160e11b93506001600160a01b038316906393163a9190610c0f90339060009036908790600401615452565b600060405180830381600087803b158015610c2957600080fd5b505af1158015610c3d573d6000803e3d6000fd5b5050505050505b95945050505050565b846000610c7b60017fbee718c342db2a725c831b0c655757cef911f31a4454aacc1b8b75f39bda09a9615416565b6040805160208101929092526001600160a01b0384169082015260600160405160208183030381529060405280519060200120905060008060001b610cbe835490565b1415905080610d1d5760405162461bcd60e51b815260206004820152602560248201527f4669726577616c6c436f6e73756d65723a204e6f7420617070726f7665642074604482015264185c99d95d60da1b6064820152608401610ac5565b610d2e83630c908cff60e01b613061565b610d3757600080fd5b6000886001600160a01b03168888604051610d53929190615488565b6000604051808303816000865af19150503d8060008114610d90576040519150601f19603f3d011682016040523d82523d6000602084013e610d95565b606091505b5050905080610da357600080fd5b610de33087878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506130e792505050565b50505050505050505050565b610dfa838383613154565b505050565b600080610e1e610a6f6001600080516020615a5b833981519152615416565b90506001600160a01b038116610f845782610e38816131d9565b6001600160a01b0381163314610e5157610e51336131d9565b86610e5b81613239565b86610e6581613239565b86610e6f8161328f565b610e798a886132df565b600c5460405163095ea7b360e01b81526001600160a01b039182166004820152602481018b90529197508a169063095ea7b3906044016020604051808303816000875af1158015610ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef29190615498565b50600c546040516305a131fb60e41b81526001600160a01b038b81166004830152602482018b905290911690635a131fb0906044016020604051808303816000875af1158015610f46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6a91906154b5565b6000878152600e6020526040902055506111a29350505050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c90610fb990339060009036908790600401615452565b600060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b5050505083610ff5816131d9565b6001600160a01b038116331461100e5761100e336131d9565b8761101881613239565b8761102281613239565b8761102c8161328f565b6110368b896132df565b600c5460405163095ea7b360e01b81526001600160a01b039182166004820152602481018c90529198508b169063095ea7b3906044016020604051808303816000875af115801561108b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110af9190615498565b50600c546040516305a131fb60e41b81526001600160a01b038c81166004830152602482018c905290911690635a131fb0906044016020604051808303816000875af1158015611103573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112791906154b5565b6000888152600e60205260408082209290925590516393163a9160e01b81526001600160a01b03881695506393163a91945061116d935033925036908790600401615452565b600060405180830381600087803b15801561118757600080fd5b505af115801561119b573d6000803e3d6000fd5b5050505050505b949350505050565b600c546000838152600e602052604080822054905163152a902d60e11b8152600481019190915260248101849052909182916001600160a01b0390911690632a55205a906044016040805180830381865afa15801561120d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123191906154ce565b909590945092505050565b600061124783611bc6565b82106112785760405163295f44f760e21b81526001600160a01b038416600482015260248101839052604401610ac5565b506001600160a01b03821660009081526006602090815260408083208484529091529020545b92915050565b6112ac613426565b6040516000198152600080516020615a9b833981519152906020015b60405180910390a1565b6060818311156113145760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642072616e676560981b6044820152606401610ac5565b61131f868686611464565b82106113785760405162461bcd60e51b815260206004820152602260248201527f52616e67652067726561746572207468616e207573657220706f6f6c20636f756044820152611b9d60f21b6064820152608401610ac5565b6113828383615416565b61138d9060016154fc565b6001600160401b038111156113a4576113a46150d0565b6040519080825280602002602001820160405280156113dd57816020015b6113ca614b5f565b8152602001906001900390816113c25790505b5090506000835b83811161143e5760006113f9898989856116c3565b905061140481610910565b848461140f8161550f565b95508151811061142157611421615528565b602002602001018190525050806114379061550f565b90506113e4565b505095945050505050565b610dfa838383604051806020016040528060008152506121fe565b60008061147085611bc6565b905060005b818110156114e1576114c88585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506114c392506108b691508a90508561123c565b613453565b156114d9576114d68361550f565b92505b600101611475565b50509392505050565b60006114f560085490565b821061151e5760405163295f44f760e21b81526000600482015260248101839052604401610ac5565b6008828154811061153157611531615528565b90600052602060002001549050919050565b61154b613426565b8060405160200161155c919061553e565b60405160208183030381529060405280519060200120600b604051602001611584919061555a565b60405160208183030381529060405280519060200120036115e75760405162461bcd60e51b815260206004820152601a60248201527f63616e277420736574207468652073616d6520626173655552490000000000006044820152606401610ac5565b6000600b80546115f6906153c6565b80601f0160208091040260200160405190810160405280929190818152602001828054611622906153c6565b801561166f5780601f106116445761010080835404028352916020019161166f565b820191906000526020600020905b81548152906001019060200180831161165257829003601f168201915b5050505050905081600b90816116859190615616565b507fc41b7cb64e5be01af4afc2641afc861432136270f4206b7773f229b658b9669981836040516116b79291906156d4565b60405180910390a15050565b6000806116d1868686611464565b90508083106117345760405162461bcd60e51b815260206004820152602960248201527f696e76616c696420706f6f6c496420696e64657820627920746f6b656e20617360448201526839b7b1b4b0ba34b7b760b91b6064820152608401610ac5565b600061173f87611bc6565b90506000805b828110156117c757611757898261123c565b945061179b8888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506114c392508991506124369050565b80156117b1575085826117ad8161550f565b9350145b156117bf57505050506111a2565b600101611745565b50505050949350505050565b6117db613426565b816117e581613239565b6001600160a01b038316600081815260106020908152604091829020805460ff191686151590811790915591519182527f2f5b19bb75097659707b1df69ba629ec7e5acfe3f775e362b8750d854037de02910160405180910390a2505050565b600080611864610a6f6001600080516020615a5b833981519152615416565b90506001600160a01b038116611967578461187e816131d9565b6001600160a01b038116331461189757611897336131d9565b896118a181613239565b896118ab81613239565b886118b58161328f565b6118bf8d8a6132df565b9550600c60009054906101000a90046001600160a01b03166001600160a01b031663285ee3388d8c8e8c8c6040518663ffffffff1660e01b815260040161190a9594939291906156f9565b6020604051808303816000875af1158015611929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194d91906154b5565b6000878152600e602052604090205550611b229350505050565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c9061199c90339060009036908790600401615452565b600060405180830381600087803b1580156119b657600080fd5b505af11580156119ca573d6000803e3d6000fd5b50505050856119d8816131d9565b6001600160a01b03811633146119f1576119f1336131d9565b8a6119fb81613239565b8a611a0581613239565b89611a0f8161328f565b611a198e8b6132df565b9650600c60009054906101000a90046001600160a01b03166001600160a01b031663285ee3388e8d8f8d8d6040518663ffffffff1660e01b8152600401611a649594939291906156f9565b6020604051808303816000875af1158015611a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa791906154b5565b6000888152600e60205260408082209290925590516393163a9160e01b81526001600160a01b03881695506393163a919450611aed935033925036908790600401615452565b600060405180830381600087803b158015611b0757600080fd5b505af1158015611b1b573d6000803e3d6000fd5b5050505050505b979650505050505050565b600061093e8261283c565b600b8054611b45906153c6565b80601f0160208091040260200160405190810160405280929190818152602001828054611b71906153c6565b8015611bbe5780601f10611b9357610100808354040283529160200191611bbe565b820191906000526020600020905b815481529060010190602001808311611ba157829003601f168201915b505050505081565b60006001600160a01b038216611bf2576040516322718ad960e21b815260006004820152602401610ac5565b506001600160a01b031660009081526003602052604090205490565b611c16613426565b611c2060006134ae565b565b611c3e610a6f6001600080516020615a7b833981519152615416565b6001600160a01b0316336001600160a01b031614611c6e5760405162461bcd60e51b8152600401610ac59061572d565b6001600160a01b038116611cc45760405162461bcd60e51b815260206004820152601e60248201527f4669726577616c6c436f6e73756d65723a207a65726f206164647265737300006044820152606401610ac5565b611cf7611cf260017f8583d637b7eb6415d11ef26648cf0702cf161a357dfe51b6ff7a332110d4bdd3615416565b829055565b50565b611d28610a6f60017f8583d637b7eb6415d11ef26648cf0702cf161a357dfe51b6ff7a332110d4bdd3615416565b6001600160a01b0316336001600160a01b031614611d885760405162461bcd60e51b815260206004820152601f60248201527f4669726577616c6c436f6e73756d65723a206e6f74206e65772061646d696e006044820152606401610ac5565b611da9611da46001600080516020615a7b833981519152615416565b339055565b6040513381527f2763a008a9a724a5da2f35346041f5c552001ab556d786252e1ff4ff798dfc1b906020016112c8565b6000818152600260205260408120546001600160a01b031615610941576000828152600d6020526040908190205490516321d7d0e160e21b8152600481018490526001600160a01b039091169063875f438490602401602060405180830381865afa158015611e4c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093e91906154b5565b611e8c610a6f6001600080516020615a7b833981519152615416565b6001600160a01b0316336001600160a01b031614611ebc5760405162461bcd60e51b8152600401610ac59061572d565b611ed8611cf26001600080516020615a5b833981519152615416565b6040516001600160a01b03821681527f60c1452966d777aab347837b9ceeaa613af32925b5aab43918e878fd036086709060200160405180910390a150565b606060018054610995906153c6565b610a4c338383613500565b336000908152600f602052604090205481151560ff909116151503611f985760405162461bcd60e51b815260206004820152601c60248201527f737461747573206973207468652073616d65206173206265666f7265000000006044820152606401610ac5565b336000908152600f60205260409020805460ff1916911515919091179055565b6000818152600260205260409020546060906001600160a01b031615610941576000828152600d602052604080822054905163d1438c3f60e01b8152600481018590526001600160a01b039091169063d1438c3f90602401600060405180830381865afa15801561202d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120559190810190615771565b905060008151600161206791906154fc565b9050806001600160401b03811115612081576120816150d0565b6040519080825280602002602001820160405280156120ba57816020015b6120a7614b5f565b81526020019060019003908161209f5790505b5092506120c6846126b5565b836000815181106120d9576120d9615528565b602090810291909101015260015b818110156121405761211b836120fe600184615416565b8151811061210e5761210e615528565b60200260200101516126b5565b84828151811061212d5761212d615528565b60209081029190910101526001016120e7565b505050919050565b612164610a6f6001600080516020615a7b833981519152615416565b6001600160a01b0316336001600160a01b0316146121945760405162461bcd60e51b8152600401610ac59061572d565b60006121c160017fbee718c342db2a725c831b0c655757cef911f31a4454aacc1b8b75f39bda09a9615416565b6040805160208101929092526001600160a01b03851690820152606001604051602081830303815290604052805190602001209050818155505050565b612209848484610def565b6122158484848461359f565b50505050565b60008061223a610a6f6001600080516020615a5b833981519152615416565b90506001600160a01b03811661228b5782612254816131d9565b6001600160a01b038116331461226d5761226d336131d9565b8461227781613239565b61228186866132df565b935050505061129e565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c906122c090339060009036908790600401615452565b600060405180830381600087803b1580156122da57600080fd5b505af11580156122ee573d6000803e3d6000fd5b50505050836122fc816131d9565b6001600160a01b038116331461231557612315336131d9565b8561231f81613239565b61232987876132df565b94505050816001600160a01b03166393163a916123433390565b600036856040518563ffffffff1660e01b81526004016123669493929190615452565b600060405180830381600087803b15801561238057600080fd5b505af1158015612394573d6000803e3d6000fd5b50505050505092915050565b60606123ab8261283c565b5060006123b66136c8565b905060008151116123d65760405180602001604052806000815250612401565b806123e0846136d7565b6040516020016123f1929190615815565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600c546000828152600e6020526040808220549051633378358b60e01b815291926001600160a01b031691633378358b916124779160040190815260200190565b602060405180830381865afa158015612494573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093e9190615844565b60006124d6610a6f6001600080516020615a7b833981519152615416565b905090565b6124e3613426565b6001600160a01b03811661250d57604051631e4fbdf760e01b815260006004820152602401610ac5565b611cf7816134ae565b6000612534610a6f6001600080516020615a5b833981519152615416565b90506001600160a01b038116612597573361254e816131d9565b6001600160a01b038116331461256757612567336131d9565b836125718161376a565b8361257b8161376a565b505050600091825250600e602052604080822054928252902055565b604051631bf8659f60e21b815234906001600160a01b03831690636fe1967c906125cc90339060009036908790600401615452565b600060405180830381600087803b1580156125e657600080fd5b505af11580156125fa573d6000803e3d6000fd5b5050505033612608816131d9565b6001600160a01b038116331461262157612621336131d9565b8461262b8161376a565b846126358161376a565b5050506000838152600e60205260408082205486835281832055516393163a9160e01b81526001600160a01b038416916393163a919161267d91339136908790600401615452565b600060405180830381600087803b15801561269757600080fd5b505af11580156126ab573d6000803e3d6000fd5b5050505050505050565b6126bd614b5f565b6000828152600d6020908152604080832054815160e0810183526001600160a01b0390911680825282516306fdde0360e01b815292519094919384019285926306fdde03926004808401938290030181865afa158015612721573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127499190810190615861565b8152602001848152602001600e600086815260200190815260200160002054815260200161277685611b2d565b6001600160a01b0316815260200161278d85612436565b6001600160a01b03168152602001826001600160a01b03166308a4f072866040518263ffffffff1660e01b81526004016127c991815260200190565b600060405180830381865afa1580156127e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261280e9190810190615771565b90529392505050565b60006001600160e01b0319821663780e9d6360e01b148061093e575061093e826137c4565b6000818152600260205260408120546001600160a01b03168061129e57604051637e27328960e01b815260048101849052602401610ac5565b610dfa8383836001613814565b600063b790a77b60e01b816128a9610a6f6001600080516020615a5b833981519152615416565b90506001600160a01b038116612a8a576000848152600d6020526040808220549051632e1a7d4d60e01b8152600481018790526001600160a01b03909116908190632e1a7d4d9060240160408051808303816000875af1158015612911573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293591906158ce565b9550915061294a816326f2a43f60e01b61391a565b15612a77576040516326f2a43f60e01b8152600481018790526000925082906001600160a01b038316906326f2a43f906024016000604051808303816000875af115801561299c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129c49190810190615771565b905060005b8151811015612a745760008282815181106129e6576129e6615528565b60209081029190910181015160008b8152600d9092526040909120549091506001600160a01b0316612a1782611b2d565b6001600160a01b031614612a605760405162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081a5b9b995c881a5960821b6044820152606401610ac5565b612a6a8a82612882565b50506001016129c9565b50505b612a82868389613936565b505050612d60565b60003490506001600160a01b038216636fe1967c3385604051602001612ab091906158f4565b604051602081830303815290604052846040518463ffffffff1660e01b8152600401612ade93929190615909565b600060405180830381600087803b158015612af857600080fd5b505af1158015612b0c573d6000803e3d6000fd5b5050506000868152600d6020526040808220549051632e1a7d4d60e01b8152600481018990529192506001600160a01b0316908190632e1a7d4d9060240160408051808303816000875af1158015612b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8c91906158ce565b96509150612ba1816326f2a43f60e01b61391a565b15612cce576040516326f2a43f60e01b8152600481018890526000925082906001600160a01b038316906326f2a43f906024016000604051808303816000875af1158015612bf3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c1b9190810190615771565b905060005b8151811015612ccb576000828281518110612c3d57612c3d615528565b60209081029190910181015160008c8152600d9092526040909120549091506001600160a01b0316612c6e82611b2d565b6001600160a01b031614612cb75760405162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081a5b9b995c881a5960821b6044820152606401610ac5565b612cc18b82612882565b5050600101612c20565b50505b612cd987838a613936565b50506001600160a01b0382166393163a91335b85604051602001612cfd91906158f4565b604051602081830303815290604052846040518463ffffffff1660e01b8152600401612d2b93929190615909565b600060405180830381600087803b158015612d4557600080fd5b505af1158015612d59573d6000803e3d6000fd5b5050505050505b5092915050565b6000630ba35c4960e11b81612d8e610a6f6001600080516020615a5b833981519152615416565b90506001600160a01b038116612dc657600080612dac87878a613c5e565b91509150612dbc89898484613c94565b9450505050612ef8565b60003490506001600160a01b038216636fe1967c3385604051602001612dec91906158f4565b604051602081830303815290604052846040518463ffffffff1660e01b8152600401612e1a93929190615909565b600060405180830381600087803b158015612e3457600080fd5b505af1158015612e48573d6000803e3d6000fd5b50505050600080612e5a88888b613c5e565b91509150612e6a8a8a8484613c94565b95505050816001600160a01b03166393163a91612e843390565b85604051602001612e9591906158f4565b604051602081830303815290604052846040518463ffffffff1660e01b8152600401612ec393929190615909565b600060405180830381600087803b158015612edd57600080fd5b505af1158015612ef1573d6000803e3d6000fd5b5050505050505b50949350505050565b631d50d0db60e01b6000612f27610a6f6001600080516020615a5b833981519152615416565b90506001600160a01b038116612f4d5782612f4757612f47308587613f39565b50612215565b60003490506001600160a01b038216636fe1967c3385604051602001612f7391906158f4565b604051602081830303815290604052846040518463ffffffff1660e01b8152600401612fa193929190615909565b600060405180830381600087803b158015612fbb57600080fd5b505af1158015612fcf573d6000803e3d6000fd5b5050505083612fe357612fe3308688613f39565b6001600160a01b0382166393163a91335b8560405160200161300591906158f4565b604051602081830303815290604052846040518463ffffffff1660e01b815260040161303393929190615909565b600060405180830381600087803b15801561304d57600080fd5b505af1158015610de3573d6000803e3d6000fd5b6040516001600160e01b031982166024820152600090819060440160408051601f19818403018152919052602080820180516001600160e01b03166301ffc9a760e01b178152825192935060009283928392909183918a617530fa92503d915060005190508280156130d4575060208210155b8015611b22575015159695505050505050565b6060600080846001600160a01b031684604051613104919061553e565b600060405180830381855af49150503d806000811461313f576040519150601f19603f3d011682016040523d82523d6000602084013e613144565b606091505b5091509150610c44858383613fe9565b6001600160a01b03821661317e57604051633250574960e11b815260006004820152602401610ac5565b600061318b83833361403e565b9050836001600160a01b0316816001600160a01b031614612215576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610ac5565b6001600160a01b03811660009081526010602052604090205460ff16611cf75760405162461bcd60e51b815260206004820152601560248201527410dbdb9d1c9858dd081b9bdd08185c1c1c9bdd9959605a1b6044820152606401610ac5565b6001600160a01b038116611cf75760405162461bcd60e51b815260206004820152601b60248201527f5a65726f2041646472657373206973206e6f7420616c6c6f77656400000000006044820152606401610ac5565b60008111611cf75760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610ac5565b6000630f266b9160e21b81613306610a6f6001600080516020615a5b833981519152615416565b90506001600160a01b0381166133525760085492506133258584614578565b506000828152600d6020526040902080546001600160a01b0319166001600160a01b038516179055612d60565b60003490506001600160a01b038216636fe1967c338560405160200161337891906158f4565b604051602081830303815290604052846040518463ffffffff1660e01b81526004016133a693929190615909565b600060405180830381600087803b1580156133c057600080fd5b505af11580156133d4573d6000803e3d6000fd5b505050506133e160085490565b93506133ed8685614578565b6000848152600d6020526040902080546001600160a01b0319166001600160a01b038781169190911790915582166393163a9133612cec565b600a546001600160a01b03163314611c205760405163118cdaa760e01b8152336004820152602401610ac5565b6000805b83518110156134a457826001600160a01b031684828151811061347c5761347c615528565b60200260200101516001600160a01b03160361349c57600191505061129e565b600101613457565b5060009392505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821661353257604051630b61174360e31b81526001600160a01b0383166004820152602401610ac5565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561221557604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906135e190339088908790879060040161593d565b6020604051808303816000875af192505050801561361c575060408051601f3d908101601f191682019092526136199181019061597a565b60015b613685573d80801561364a576040519150601f19603f3d011682016040523d82523d6000602084013e61364f565b606091505b50805160000361367d57604051633250574960e11b81526001600160a01b0385166004820152602401610ac5565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146136c157604051633250574960e11b81526001600160a01b0385166004820152602401610ac5565b5050505050565b6060600b8054610995906153c6565b606060006136e483614592565b60010190506000816001600160401b03811115613703576137036150d0565b6040519080825280601f01601f19166020018201604052801561372d576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613737575b509392505050565b6000818152600260205260409020546001600160a01b0316611cf75760405162461bcd60e51b8152602060048201526013602482015272141bdbdb08191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606401610ac5565b60006001600160e01b031982166380ac58cd60e01b14806137f557506001600160e01b03198216635b5e139f60e01b145b8061093e57506301ffc9a760e01b6001600160e01b031983161461093e565b808061382857506001600160a01b03821615155b156138ea5760006138388461283c565b90506001600160a01b038316158015906138645750826001600160a01b0316816001600160a01b031614155b801561387757506138758184612408565b155b156138a05760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610ac5565b81156138e85783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b60006139258361466a565b801561240157506124018383613061565b6305d6a92f60e01b600061395c610a6f6001600080516020615a5b833981519152615416565b90506001600160a01b038116613a99578315612f4757600c546000868152600e602052604090819020549051631f62fca760e21b815260048101919091526001600160a01b0385811660248301526044820187905290911690637d8bf29c90606401600060405180830381600087803b1580156139d857600080fd5b505af11580156139ec573d6000803e3d6000fd5b50505050600080516020615a9b83398151915285604051613a0f91815260200190565b60405180910390a1826001600160a01b03167faa7132423a39dd83fa4078bd4d7b7d0d0d614b9837f0fd5d23e1afd9aa9bc29d8686613a4d896126b5565b60c00151600081518110613a6357613a63615528565b6020026020010151604051613a8b939291909283526020830191909152604082015260600190565b60405180910390a250612215565b60003490506001600160a01b038216636fe1967c3385604051602001613abf91906158f4565b604051602081830303815290604052846040518463ffffffff1660e01b8152600401613aed93929190615909565b600060405180830381600087803b158015613b0757600080fd5b505af1158015613b1b573d6000803e3d6000fd5b505050506000851115612fe357600c546000878152600e602052604090819020549051631f62fca760e21b815260048101919091526001600160a01b0386811660248301526044820188905290911690637d8bf29c90606401600060405180830381600087803b158015613b8e57600080fd5b505af1158015613ba2573d6000803e3d6000fd5b50505050600080516020615a9b83398151915286604051613bc591815260200190565b60405180910390a1836001600160a01b03167faa7132423a39dd83fa4078bd4d7b7d0d0d614b9837f0fd5d23e1afd9aa9bc29d8787613c038a6126b5565b60c00151600081518110613c1957613c19615528565b6020026020010151604051613c41939291909283526020830191909152604082015260600190565b60405180910390a26001600160a01b0382166393163a9133612ff4565b60008060208414613c7a57613c7584860186615997565b613c88565b613c8684860186614bb7565b835b90969095509350505050565b600081613ca081613239565b83613caa8161328f565b683635c9adc5dea00000851115613cfb5760405162461bcd60e51b81526020600482015260156024820152741cdc1b1a5d08185b5bdd5b9d08195e18d959591959605a1b6044820152606401610ac5565b60408051808201909152600080825260208201526000888152600d60205260409020546001600160a01b0316808252613d359086906132df565b602082810191825260008a8152600e90915260408082205483518352918190209190915582519151905163caf0887d60e01b8152600481018b90526024810191909152604481018890526001600160a01b039091169063caf0887d90606401600060405180830381600087803b158015613dae57600080fd5b505af1158015613dc2573d6000803e3d6000fd5b50508251604051630452783960e11b8152600481018c90526001600160a01b0390911692506308a4f0729150602401600060405180830381865afa158015613e0e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613e369190810190615771565b600081518110613e4857613e48615528565b602002602001015160001493506000613e60896126b5565b60c00151600081518110613e7657613e76615528565b60200260200101519050856001600160a01b0316886001600160a01b03167ffdcb522eed2b51337da9525342f1aba4b128316db8c3d89a3c8095b88a35ec598b856020015185613ec988602001516126b5565b60c00151600081518110613edf57613edf615528565b6020908102919091018101516040805195865291850193909352830152606082015260800160405180910390a3604051898152600080516020615a9b8339815191529060200160405180910390a150505050949350505050565b6001600160a01b038216613f6357604051633250574960e11b815260006004820152602401610ac5565b6000613f718383600061403e565b90506001600160a01b038116613f9d57604051637e27328960e01b815260048101839052602401610ac5565b836001600160a01b0316816001600160a01b031614612215576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610ac5565b606082613ffe57613ff98261469d565b612401565b815115801561401557506001600160a01b0384163b155b15612d6057604051639996b31560e01b81526001600160a01b0385166004820152602401610ac5565b60006318703c4f60e11b81614065610a6f6001600080516020615a5b833981519152615416565b90506001600160a01b038116614271576001600160a01b038416158015906140b157506000858152600d60205260409020546140b1906001600160a01b0316631ffb811f60e01b61391a565b15614132576000858152600d602052604090819020549051631ffb811f60e01b81526001600160a01b03868116600483015288811660248301526044820188905290911690631ffb811f90606401600060405180830381600087803b15801561411957600080fd5b505af115801561412d573d6000803e3d6000fd5b505050505b6001600160a01b0384161580159061418657506001600160a01b03861660009081526010602052604090205460ff168061418457506001600160a01b03841660009081526010602052604090205460ff165b155b1561425e576001600160a01b0384166000908152600f602052604090205460ff166141c35760405162461bcd60e51b8152600401610ac5906159bc565b600c546000868152600e602052604090819020549051632b2b4da960e21b8152600481019190915242916001600160a01b03169063acad36a490602401602060405180830381865afa15801561421d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424191906154b5565b1061425e5760405162461bcd60e51b8152600401610ac5906159fe565b6142698686866146c6565b925050613762565b60003490506001600160a01b038216636fe1967c338560405160200161429791906158f4565b604051602081830303815290604052846040518463ffffffff1660e01b81526004016142c593929190615909565b600060405180830381600087803b1580156142df57600080fd5b505af11580156142f3573d6000803e3d6000fd5b505050506001600160a01b0385161580159061433357506000868152600d6020526040902054614333906001600160a01b0316631ffb811f60e01b61391a565b156143b4576000868152600d602052604090819020549051631ffb811f60e01b81526001600160a01b03878116600483015289811660248301526044820189905290911690631ffb811f90606401600060405180830381600087803b15801561439b57600080fd5b505af11580156143af573d6000803e3d6000fd5b505050505b6001600160a01b0385161580159061440857506001600160a01b03871660009081526010602052604090205460ff168061440657506001600160a01b03851660009081526010602052604090205460ff165b155b156144e0576001600160a01b0385166000908152600f602052604090205460ff166144455760405162461bcd60e51b8152600401610ac5906159bc565b600c546000878152600e602052604090819020549051632b2b4da960e21b8152600481019190915242916001600160a01b03169063acad36a490602401602060405180830381865afa15801561449f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144c391906154b5565b106144e05760405162461bcd60e51b8152600401610ac5906159fe565b6144eb8787876146c6565b93506001600160a01b0382166393163a91338560405160200161450e91906158f4565b604051602081830303815290604052846040518463ffffffff1660e01b815260040161453c93929190615909565b600060405180830381600087803b15801561455657600080fd5b505af115801561456a573d6000803e3d6000fd5b505050505050509392505050565b610a4c828260405180602001604052806000815250614793565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106145d15772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106145fd576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061461b57662386f26fc10000830492506010015b6305f5e1008310614633576305f5e100830492506008015b612710831061464757612710830492506004015b60648310614659576064830492506002015b600a831061129e5760010192915050565b600061467d826301ffc9a760e01b613061565b801561093e5750614696826001600160e01b0319613061565b1592915050565b8051156146ad5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000806146d48585856147aa565b90506001600160a01b0381166147315761472c84600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614754565b846001600160a01b0316816001600160a01b0316146147545761475481856148a3565b6001600160a01b0385166147705761476b84614934565b6111a2565b846001600160a01b0316816001600160a01b0316146111a2576111a285856149e3565b61479d8383614a33565b610dfa600084848461359f565b6000828152600260205260408120546001600160a01b03908116908316156147d7576147d7818486614a98565b6001600160a01b03811615614815576147f4600085600080613814565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615614844576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b60006148ae83611bc6565b600083815260076020526040902054909150808214614901576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061494690600190615416565b6000838152600960205260408120546008805493945090928490811061496e5761496e615528565b90600052602060002001549050806008838154811061498f5761498f615528565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806149c7576149c7615a44565b6001900381819060005260206000200160009055905550505050565b600060016149f084611bc6565b6149fa9190615416565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216614a5d57604051633250574960e11b815260006004820152602401610ac5565b6000614a6b8383600061403e565b90506001600160a01b03811615610dfa576040516339e3563760e11b815260006004820152602401610ac5565b614aa3838383614afc565b610dfa576001600160a01b038316614ad157604051637e27328960e01b815260048101829052602401610ac5565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610ac5565b60006001600160a01b038316158015906111a25750826001600160a01b0316846001600160a01b03161480614b365750614b368484612408565b806111a25750506000908152600460205260409020546001600160a01b03908116911614919050565b6040518060e0016040528060006001600160a01b0316815260200160608152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b03168152602001606081525090565b600060208284031215614bc957600080fd5b5035919050565b60005b83811015614beb578181015183820152602001614bd3565b50506000910152565b60008151808452614c0c816020860160208601614bd0565b601f01601f19169290920160200192915050565b600081518084526020840193506020830160005b82811015614c52578151865260209586019590910190600101614c34565b5093949350505050565b60018060a01b0381511682526000602082015160e06020850152614c8360e0850182614bf4565b9050604083015160408501526060830151606085015260018060a01b03608084015116608085015260a0830151614cc560a08601826001600160a01b03169052565b5060c083015184820360c0860152610c448282614c20565b6020815260006124016020830184614c5c565b6001600160e01b031981168114611cf757600080fd5b600060208284031215614d1857600080fd5b813561240181614cf0565b6020815260006124016020830184614bf4565b6001600160a01b0381168114611cf757600080fd5b60008060408385031215614d5e57600080fd5b8235614d6981614d36565b946020939093013593505050565b60008083601f840112614d8957600080fd5b5081356001600160401b03811115614da057600080fd5b602083019150836020828501011115614db857600080fd5b9250929050565b600080600080600060808688031215614dd757600080fd5b8535614de281614d36565b94506020860135614df281614d36565b93506040860135925060608601356001600160401b03811115614e1457600080fd5b614e2088828901614d77565b969995985093965092949392505050565b600080600080600060608688031215614e4957600080fd5b8535614e5481614d36565b945060208601356001600160401b03811115614e6f57600080fd5b614e7b88828901614d77565b90955093505060408601356001600160401b03811115614e1457600080fd5b600080600060608486031215614eaf57600080fd5b8335614eba81614d36565b92506020840135614eca81614d36565b929592945050506040919091013590565b600060208284031215614eed57600080fd5b813561240181614d36565b60008060008060808587031215614f0e57600080fd5b8435614f1981614d36565b93506020850135614f2981614d36565b9250604085013591506060850135614f4081614d36565b939692955090935050565b60008060408385031215614f5e57600080fd5b50508035926020909101359150565b60008083601f840112614f7f57600080fd5b5081356001600160401b03811115614f9657600080fd5b6020830191508360208260051b8501011115614db857600080fd5b600080600080600060808688031215614fc957600080fd5b8535614fd481614d36565b945060208601356001600160401b03811115614fef57600080fd5b614ffb88828901614f6d565b9699909850959660408101359660609091013595509350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561507057603f1987860301845261505b858351614c5c565b9450602093840193919091019060010161503f565b50929695505050505050565b60008060006040848603121561509157600080fd5b833561509c81614d36565b925060208401356001600160401b038111156150b757600080fd5b6150c386828701614f6d565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561510e5761510e6150d0565b604052919050565b60006001600160401b0382111561512f5761512f6150d0565b50601f01601f191660200190565b600061515061514b84615116565b6150e6565b905082815283838301111561516457600080fd5b828260208301376000602084830101529392505050565b60006020828403121561518d57600080fd5b81356001600160401b038111156151a357600080fd5b8201601f810184136151b457600080fd5b6111a28482356020840161513d565b600080600080606085870312156151d957600080fd5b84356151e481614d36565b935060208501356001600160401b038111156151ff57600080fd5b61520b87828801614f6d565b9598909750949560400135949350505050565b8015158114611cf757600080fd5b6000806040838503121561523f57600080fd5b823561524a81614d36565b9150602083013561525a8161521e565b809150509250929050565b600080600080600080600060c0888a03121561528057600080fd5b873561528b81614d36565b9650602088013561529b81614d36565b955060408801356152ab81614d36565b94506060880135935060808801356152c281614d36565b925060a08801356001600160401b038111156152dd57600080fd5b6152e98a828b01614d77565b989b979a50959850939692959293505050565b60006020828403121561530e57600080fd5b81356124018161521e565b6000806000806080858703121561532f57600080fd5b843561533a81614d36565b9350602085013561534a81614d36565b92506040850135915060608501356001600160401b0381111561536c57600080fd5b8501601f8101871361537d57600080fd5b61538c8782356020840161513d565b91505092959194509250565b600080604083850312156153ab57600080fd5b82356153b681614d36565b9150602083013561525a81614d36565b600181811c908216806153da57607f821691505b6020821081036153fa57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561129e5761129e615400565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03851681526060602082018190526000906154779083018587615429565b905082604083015295945050505050565b8183823760009101908152919050565b6000602082840312156154aa57600080fd5b81516124018161521e565b6000602082840312156154c757600080fd5b5051919050565b600080604083850312156154e157600080fd5b82516154ec81614d36565b6020939093015192949293505050565b8082018082111561129e5761129e615400565b60006001820161552157615521615400565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008251615550818460208701614bd0565b9190910192915050565b6000808354615568816153c6565b60018216801561557f5760018114615594576155c4565b60ff19831686528115158202860193506155c4565b86600052602060002060005b838110156155bc578154888201526001909101906020016155a0565b505081860193505b509195945050505050565b601f821115610dfa57806000526020600020601f840160051c810160208510156155f65750805b601f840160051c820191505b818110156136c15760008155600101615602565b81516001600160401b0381111561562f5761562f6150d0565b6156438161563d84546153c6565b846155cf565b6020601f821160018114615677576000831561565f5750848201515b600019600385901b1c1916600184901b1784556136c1565b600084815260208120601f198516915b828110156156a75787850151825560209485019460019092019101615687565b50848210156156c55786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6040815260006156e76040830185614bf4565b8281036020840152610c448185614bf4565b6001600160a01b0386811682526020820186905284166040820152608060608201819052600090611b229083018486615429565b60208082526024908201527f4669726577616c6c436f6e73756d65723a206e6f74206669726577616c6c20616040820152633236b4b760e11b606082015260800190565b60006020828403121561578357600080fd5b81516001600160401b0381111561579957600080fd5b8201601f810184136157aa57600080fd5b80516001600160401b038111156157c3576157c36150d0565b8060051b6157d3602082016150e6565b918252602081840181019290810190878411156157ef57600080fd5b6020850194505b83851015611b22578451808352602095860195909350909101906157f6565b60008351615827818460208801614bd0565b83519083019061583b818360208801614bd0565b01949350505050565b60006020828403121561585657600080fd5b815161240181614d36565b60006020828403121561587357600080fd5b81516001600160401b0381111561588957600080fd5b8201601f8101841361589a57600080fd5b80516158a861514b82615116565b8181528560208385010111156158bd57600080fd5b610c44826020830160208601614bd0565b600080604083850312156158e157600080fd5b8251602084015190925061525a8161521e565b6001600160e01b031991909116815260040190565b6001600160a01b038416815260606020820181905260009061592d90830185614bf4565b9050826040830152949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061597090830184614bf4565b9695505050505050565b60006020828403121561598c57600080fd5b815161240181614cf0565b600080604083850312156159aa57600080fd5b82359150602083013561525a81614d36565b60208082526022908201527f506f6f6c207472616e73666572206e6f7420617070726f76656420627920757360408201526132b960f11b606082015260800190565b60208082526026908201527f43616e2774207472616e73666572206265666f72652074726164652073746172604082015265742074696d6560d01b606082015260800190565b634e487b7160e01b600052603160045260246000fdfe5dd2e3b890564a8f99f7f203f226a27a8aa59aee19a4ece5cf5eaa77ab91f66229982a6ac507a2a707ced6dee5d76285dd49725db977de83d9702c628c974136f8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7a264697066735822122097d878b7bfcc0f0a4fd6d0508f4b0fec58a0212903d8bd642e88f50c3d6c204464736f6c634300081a00330000000000000000000000009c8f78e0aeab8190c9d1df7bed0b26c1edcb8de600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000