[ { "inputs": [ { "internalType": "address", "name": "target", "type": "address" } ], "name": "AddressEmptyCode", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "AddressInsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "allowance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientAllowance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC20InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC20InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC20InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" } ], "name": "ERC20InvalidSpender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" }, { "internalType": "uint256", "name": "assets", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "name": "ERC4626ExceededMaxDeposit", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" }, { "internalType": "uint256", "name": "shares", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "name": "ERC4626ExceededMaxMint", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "shares", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "name": "ERC4626ExceededMaxRedeem", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "assets", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "name": "ERC4626ExceededMaxWithdraw", "type": "error" }, { "inputs": [], "name": "EnforcedPause", "type": "error" }, { "inputs": [], "name": "ExpectedPause", "type": "error" }, { "inputs": [], "name": "FailedInnerCall", "type": "error" }, { "inputs": [], "name": "InvalidInitialization", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "signer", "type": "address" } ], "name": "InvalidSigner", "type": "error" }, { "inputs": [], "name": "NotInitializing", "type": "error" }, { "inputs": [], "name": "NotKeeperNorOwner", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "PermitDeadlineExpired", "type": "error" }, { "inputs": [], "name": "ReentrancyGuardReentrantCall", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "SafeERC20FailedOperation", "type": "error" }, { "inputs": [], "name": "ZeroAmount", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bool", "name": "oldState", "type": "bool" }, { "indexed": false, "internalType": "bool", "name": "newState", "type": "bool" } ], "name": "AutoDepositToggled", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "Deposit", "type": "event" }, { "anonymous": false, "inputs": [], "name": "Harvested", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint64", "name": "version", "type": "uint64" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "prev", "type": "address" }, { "indexed": false, "internalType": "address", "name": "curr", "type": "address" } ], "name": "KeeperChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "oldOwner", "type": "address" }, { "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnerChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnerNominated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], "name": "Paused", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], "name": "Unpaused", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "receiver", "type": "address" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "Withdraw", "type": "event" }, { "inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "acceptOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "asset", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "autoDeposit", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "cToken", "outputs": [ { "internalType": "contract ICToken", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "convertToAssets", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" } ], "name": "convertToShares", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" }, { "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "convertToUnderlyingShares", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" }, { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "deposit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" } ], "name": "deposit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "harvest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "asset_", "type": "address" }, { "internalType": "address", "name": "owner_", "type": "address" }, { "internalType": "bool", "name": "autoDeposit_", "type": "bool" }, { "internalType": "bytes", "name": "strategyInitData_", "type": "bytes" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "keeper", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "maxDeposit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "maxMint", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "maxRedeem", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "maxWithdraw", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" }, { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "mint", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "mint", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_owner", "type": "address" } ], "name": "nominateNewOwner", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "nominatedOwner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "nonces", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "paused", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" } ], "name": "previewDeposit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "previewMint", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "previewRedeem", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" } ], "name": "previewWithdraw", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "pullFunds", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "pushFunds", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" }, { "internalType": "address", "name": "receiver", "type": "address" }, { "internalType": "address", "name": "owner", "type": "address" } ], "name": "redeem", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "redeem", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "rewardToken", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "rewardTokens", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "rewarder", "outputs": [ { "internalType": "contract ICometRewarder", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "keeper_", "type": "address" } ], "name": "setKeeper", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "toggleAutoDeposit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "totalAssets", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" } ], "name": "withdraw", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "assets", "type": "uint256" }, { "internalType": "address", "name": "receiver", "type": "address" }, { "internalType": "address", "name": "owner", "type": "address" } ], "name": "withdraw", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" } ]
6080604052348015600e575f80fd5b50612eda8061001c5f395ff3fe608060405234801561000f575f80fd5b50600436106102ff575f3560e01c80637ecebe0011610195578063c2b18aa0116100e4578063d905777e1161009e578063dd62ed3e11610079578063dd62ed3e14610681578063ef8b30f7146105fc578063f7c618c114610694578063fb37b270146106a7575f80fd5b8063d905777e14610648578063db006a751461065b578063dcc3e06e1461066e575f80fd5b8063c2b18aa0146105e7578063c63d75b61461043b578063c6e6f592146105fc578063ce5c7f611461060f578063ce96cb7714610622578063d505accf14610635575f80fd5b8063a0712d681161014f578063b3d7f6b91161012a578063b3d7f6b91461059b578063b460af94146105ae578063b6b55f25146105c1578063ba087652146105d4575f80fd5b8063a0712d6814610562578063a9059cbb14610575578063aced166114610588575f80fd5b80637ecebe00146105065780638456cb59146105255780638689c09c1461052d5780638da5cb5b1461053557806394bf804d1461054757806395d89b411461055a575f80fd5b80633f4ba83a116102515780635cb5727a1161020b57806370a08231116101e657806370a08231146104c4578063748747e6146104d757806375d20a3b146104ea57806379ba5097146104fe575f80fd5b80635cb5727a1461048b57806369e527da1461049e5780636e553f65146104b1575f80fd5b80633f4ba83a14610433578063402d267d1461043b57806344d1c2da1461044e5780634cdad5061461033357806353a47bb7146104615780635c975abb14610474575f80fd5b806318160ddd116102bc5780632e1a7d4d116102975780632e1a7d4d146103de578063313ce567146103f15780633644e5151461040b57806338d52e0f14610413575f80fd5b806318160ddd1461039157806323b872dd146103b85780632d1c868c146103cb575f80fd5b806301e1d1141461030357806306fdde031461031e57806307a2d13a14610333578063095ea7b3146103465780630a28a477146103695780631627540c1461037c575b5f80fd5b61030b6106bc565b6040519081526020015b60405180910390f35b610326610744565b60405161031591906125e1565b61030b610341366004612613565b6107d4565b61035961035436600461263e565b6107e5565b6040519015158152602001610315565b61030b610377366004612613565b6107fc565b61038f61038a366004612668565b610808565b005b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461030b565b6103596103c6366004612683565b610865565b61038f6103d936600461278c565b61088a565b61030b6103ec366004612613565b610b8c565b6103f9610b98565b60405160ff9091168152602001610315565b61030b610bda565b61041b610bf3565b6040516001600160a01b039091168152602001610315565b61038f610c21565b61030b610449366004612668565b610c33565b61038f61045c3660046127fd565b610c57565b60015461041b906001600160a01b031681565b5f80516020612e658339815191525460ff16610359565b61038f6104993660046127fd565b610cb1565b60085461041b906001600160a01b031681565b61030b6104bf366004612841565b610d07565b61030b6104d2366004612668565b610d64565b61038f6104e5366004612668565b610d9d565b60015461035990600160a01b900460ff1681565b61038f610e0e565b61030b610514366004612668565b60056020525f908152604090205481565b61038f610ef6565b61038f610f06565b5f5461041b906001600160a01b031681565b61030b610555366004612841565b610f76565b610326610fc2565b61030b610570366004612613565b610fd1565b61035961058336600461263e565b610fdc565b60025461041b906001600160a01b031681565b61030b6105a9366004612613565b610fe9565b61030b6105bc36600461286f565b610ff5565b61030b6105cf366004612613565b61104b565b61030b6105e236600461286f565b611056565b6105ef6110a3565b60405161031591906128ae565b61030b61060a366004612613565b611104565b61038f61061d3660046128fa565b61110f565b61030b610630366004612668565b61130b565b61038f61064336600461292c565b61131e565b61030b610656366004612668565b6114c8565b61030b610669366004612613565b6114d2565b60095461041b906001600160a01b031681565b61030b61068f36600461299d565b6114de565b600a5461041b906001600160a01b031681565b61030b6106b53660046129c9565b5f92915050565b5f6106c5611527565b6106cd610bf3565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610711573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073591906129e9565b61073f9190612a14565b905090565b60606006805461075390612a27565b80601f016020809104026020016040519081016040528092919081815260200182805461077f90612a27565b80156107ca5780601f106107a1576101008083540402835291602001916107ca565b820191905f5260205f20905b8154815290600101906020018083116107ad57829003601f168201915b5050505050905090565b5f6107df825f611591565b92915050565b5f336107f28185856115e8565b5060019392505050565b5f6107df8260016115fa565b610810611648565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22906020015b60405180910390a150565b5f336108728582856116b9565b61087d858585611709565b60019150505b9392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f811580156108cf5750825b90505f8267ffffffffffffffff1660011480156108eb5750303b155b9050811580156108f9575080155b156109175760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561094157845460ff60401b1916600160401b1785555b5f805f888060200190518101906109589190612a5f565b600880546001600160a01b038086166001600160a01b03199283161790925560098054838616908316179055600a805492841692909116919091179055919450925090506109a78c8c8c611766565b60405163095ea7b360e01b81526001600160a01b0384811660048301525f1960248301528d169063095ea7b3906044016020604051808303815f875af11580156109f3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a179190612a9e565b508b6001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015610a53573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a7a9190810190612ab9565b604051602001610a8a9190612b22565b60405160208183030381529060405260069081610aa79190612bb8565b508b6001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610ae3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b0a9190810190612ab9565b604051602001610b1a9190612c78565b60405160208183030381529060405260079081610b379190612bb8565b505050508315610b8157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b5f6107df823333610ff5565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f8154610bd49190600160a01b900460ff16612ca5565b91505090565b5f6003544614610bec5761073f6117bb565b5060045490565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b610c29611648565b610c3161184f565b565b5f610c4c5f80516020612e658339815191525460ff1690565b6106b5575f196107df565b5f546001600160a01b03163314801590610c7c57506002546001600160a01b03163314155b15610c9a5760405163c6764d6d60e01b815260040160405180910390fd5b610cad82610ca784611104565b836118a8565b5050565b5f546001600160a01b03163314801590610cd657506002546001600160a01b03163314155b15610cf45760405163c6764d6d60e01b815260040160405180910390fd5b610cad82610d0184611104565b83611921565b5f80610d1283610c33565b905080841115610d4457828482604051633c8097d960e11b8152600401610d3b93929190612cbe565b60405180910390fd5b5f610d4e85611104565b9050610d5c3385878461193a565b949350505050565b6001600160a01b03165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b610da5611648565b600254604080516001600160a01b03928316815291831660208301527f068b48a2fe7f498b57ff6da64f075ae658fde8d77124b092e62b3dc58d91ce35910160405180910390a1600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314610e865760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b6064820152608401610d3b565b5f54600154604080516001600160a01b0393841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600180545f80546001600160a01b03199081166001600160a01b03841617909155169055565b610efe611648565b610c31611a1f565b610f0e611648565b60015460408051600160a01b90920460ff16158015835260208301527facb11423c8b68e710be92d074573958076ce061ece2b7196e442c1eb99948b01910160405180910390a16001805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f80610f8183610c33565b905080841115610faa5782848260405163284ff66760e01b8152600401610d3b93929190612cbe565b5f610fb485610fe9565b9050610d5c3385838861193a565b60606007805461075390612a27565b5f6107df8233610f76565b5f336107f2818585611709565b5f6107df826001611591565b5f806110008361130b565b90508085111561102957828582604051633fa733bb60e21b8152600401610d3b93929190612cbe565b5f611033866107fc565b90506110423386868985611a67565b95945050505050565b5f6107df8233610d07565b5f80611061836114c8565b90508085111561108a57828582604051632e52afbb60e21b8152600401610d3b93929190612cbe565b5f611094866107d4565b9050611042338686848a611a67565b6040805160018082528183019092526060915f9190602080830190803683375050600a5482519293506001600160a01b0316918391505f906110e7576110e7612cdf565b6001600160a01b0390921660209283029190910190910152919050565b5f6107df825f6115fa565b5f546001600160a01b0316331480159061113457506002546001600160a01b03163314155b156111525760405163c6764d6d60e01b815260040160405180910390fd5b61115a611c23565b50600a546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156111ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cf91906129e9565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611217573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123b9190612a9e565b505f8180602001905181019061125191906129e9565b9050805f0361127357604051631f2a200560e01b815260040160405180910390fd5b61127b610bf3565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b0391909116906323b872dd906064016020604051808303815f875af11580156112cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f19190612a9e565b50610cad815f60405180602001604052805f8152506118a8565b5f6107df61131883610d64565b5f611591565b4284101561134257604051632b9b60b760e01b815260048101859052602401610d3b565b5f600161134d610bda565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611455573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116158061148a5750876001600160a01b0316816001600160a01b031614155b156114b35760405163bf18af4360e01b81526001600160a01b0382166004820152602401610d3b565b6114be8188886115e8565b5050505050505050565b5f6107df82610d64565b5f6107df823333611056565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6008546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa15801561156d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073f91906129e9565b5f61088361159d6106bc565b6115a8906001612a14565b6115b35f600a612dd3565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546115df9190612a14565b85919085611c97565b6115f58383836001611cd9565b505050565b5f61088361160982600a612dd3565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546116359190612a14565b61163d6106bc565b6115df906001612a14565b5f546001600160a01b03163314610c315760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b6064820152608401610d3b565b5f6116c484846114de565b90505f19811461170357818110156116f557828183604051637dc7a0d960e11b8152600401610d3b93929190612cbe565b61170384848484035f611cd9565b50505050565b6001600160a01b03831661173257604051634b637e8f60e11b81525f6004820152602401610d3b565b6001600160a01b03821661175b5760405163ec442f0560e01b81525f6004820152602401610d3b565b6115f5838383611dcf565b61176e611f08565b611776611f51565b61177e611f61565b61178782611f71565b61179083612022565b6001805460ff60a01b1916600160a01b83151502179055466003556117b36117bb565b600455505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6117e5610744565b80516020918201206040805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b611857612036565b5f80516020612e65833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200161085a565b6008546001600160a01b031663f2b9fdb86118c1610bf3565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018690526044015f604051808303815f87803b158015611906575f80fd5b505af1158015611918573d5f803e3d5ffd5b50505050505050565b6008546001600160a01b031663f3fef3a36118c1610bf3565b611942612065565b80158061194d575081155b1561196b57604051631f2a200560e01b815260040160405180910390fd5b61197e611976610bf3565b85308561209c565b600154600160a01b900460ff16156119a9576119a9828260405180602001604052805f8152506118a8565b6119b38382612103565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051611a01929190918252602082015260400190565b60405180910390a361170360015f80516020612e8583398151915255565b611a2761214a565b5f80516020612e65833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611890565b611a6f612065565b801580611a7a575081155b15611a9857604051631f2a200560e01b815260040160405180910390fd5b826001600160a01b0316856001600160a01b031614611abc57611abc8386836116b9565b5f80516020612e658339815191525460ff16611b7f575f611adb610bf3565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015611b1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4391906129e9565b905080831115611b7d575f611b588285612de1565b9050611b7b81611b6783611104565b60405180602001604052805f815250611921565b505b505b611b89838261217a565b611ba68483611b96610bf3565b6001600160a01b031691906121ae565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051611bfe929190918252602082015260400190565b60405180910390a4611c1c60015f80516020612e8583398151915255565b5050505050565b600954600854604051635b81a7bf60e11b81526001600160a01b039182166004820152306024820152600160448201525f92919091169063b7034f7e906064015f604051808303815f87803b158015611c7a575f80fd5b505af1925050508015611c8b575060015b15611c94575060015b90565b5f611cc4611ca4836121df565b8015611cbf57505f8480611cba57611cba612df4565b868809115b151590565b611ccf86868661220b565b6110429190612a14565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038516611d235760405163e602df0560e01b81525f6004820152602401610d3b565b6001600160a01b038416611d4c57604051634a1406b160e11b81525f6004820152602401610d3b565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115611c1c57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051611dc091815260200190565b60405180910390a35050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416611e1c5781816002015f828254611e119190612a14565b90915550611e799050565b6001600160a01b0384165f9081526020829052604090205482811015611e5b5784818460405163391434e360e21b8152600401610d3b93929190612cbe565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611e97576002810180548390039055611eb5565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611efa91815260200190565b60405180910390a350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c3157604051631afcd79f60e31b815260040160405180910390fd5b611f59611f08565b610c316122c8565b611f69611f08565b610c316122e8565b611f79611f08565b6001600160a01b038116611fcf5760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f742062652030000000000000006044820152606401610d3b565b5f80546001600160a01b0319166001600160a01b03831690811782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910161085a565b61202a611f08565b612033816122f0565b50565b5f80516020612e658339815191525460ff16610c3157604051638dfc202b60e01b815260040160405180910390fd5b5f80516020612e8583398151915280546001190161209657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6040516001600160a01b0384811660248301528381166044830152606482018390526117039186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612373565b6001600160a01b03821661212c5760405163ec442f0560e01b81525f6004820152602401610d3b565b610cad5f8383611dcf565b60015f80516020612e8583398151915255565b5f80516020612e658339815191525460ff1615610c315760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b0382166121a357604051634b637e8f60e11b81525f6004820152602401610d3b565b610cad825f83611dcf565b6040516001600160a01b038381166024830152604482018390526115f591859182169063a9059cbb906064016120d1565b5f60028260038111156121f4576121f4612e08565b6121fe9190612e1c565b60ff166001149050919050565b5f838302815f1985870982811083820303915050805f0361223f5783828161223557612235612df4565b0492505050610883565b80841161225d5761225d84156122565760116123d4565b60126123d4565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6122d0611f08565b5f80516020612e65833981519152805460ff19169055565b612137611f08565b6122f8611f08565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f80612324846123e7565b9150915081612334576012612336565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b5f6123876001600160a01b038416836124bd565b905080515f141580156123ab5750808060200190518101906123a99190612a9e565b155b156115f557604051635274afe760e01b81526001600160a01b0384166004820152602401610d3b565b634e487b7160e01b5f528060045260245ffd5b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161242d91612e49565b5f60405180830381855afa9150503d805f8114612465576040519150601f19603f3d011682016040523d82523d5f602084013e61246a565b606091505b509150915081801561247e57506020815110155b156124b1575f8180602001905181019061249891906129e9565b905060ff81116124af576001969095509350505050565b505b505f9485945092505050565b606061088383835f845f80856001600160a01b031684866040516124e19190612e49565b5f6040518083038185875af1925050503d805f811461251b576040519150601f19603f3d011682016040523d82523d5f602084013e612520565b606091505b509150915061253086838361253a565b9695505050505050565b60608261254f5761254a82612596565b610883565b815115801561256657506001600160a01b0384163b155b1561258f57604051639996b31560e01b81526001600160a01b0385166004820152602401610d3b565b5080610883565b8051156125a65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b838110156125d95781810151838201526020016125c1565b50505f910152565b602081525f82518060208401526125ff8160408501602087016125bf565b601f01601f19169190910160400192915050565b5f60208284031215612623575f80fd5b5035919050565b6001600160a01b0381168114612033575f80fd5b5f806040838503121561264f575f80fd5b823561265a8161262a565b946020939093013593505050565b5f60208284031215612678575f80fd5b81356108838161262a565b5f805f60608486031215612695575f80fd5b83356126a08161262a565b925060208401356126b08161262a565b929592945050506040919091013590565b8015158114612033575f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561270b5761270b6126ce565b604052919050565b5f67ffffffffffffffff82111561272c5761272c6126ce565b50601f01601f191660200190565b5f82601f830112612749575f80fd5b813561275c61275782612713565b6126e2565b818152846020838601011115612770575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f806080858703121561279f575f80fd5b84356127aa8161262a565b935060208501356127ba8161262a565b925060408501356127ca816126c1565b9150606085013567ffffffffffffffff8111156127e5575f80fd5b6127f18782880161273a565b91505092959194509250565b5f806040838503121561280e575f80fd5b82359150602083013567ffffffffffffffff81111561282b575f80fd5b6128378582860161273a565b9150509250929050565b5f8060408385031215612852575f80fd5b8235915060208301356128648161262a565b809150509250929050565b5f805f60608486031215612881575f80fd5b8335925060208401356128938161262a565b915060408401356128a38161262a565b809150509250925092565b602080825282518282018190525f9190848201906040850190845b818110156128ee5783516001600160a01b0316835292840192918401916001016128c9565b50909695505050505050565b5f6020828403121561290a575f80fd5b813567ffffffffffffffff811115612920575f80fd5b610d5c8482850161273a565b5f805f805f805f60e0888a031215612942575f80fd5b873561294d8161262a565b9650602088013561295d8161262a565b95506040880135945060608801359350608088013560ff81168114612980575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156129ae575f80fd5b82356129b98161262a565b915060208301356128648161262a565b5f80604083850312156129da575f80fd5b50508035926020909101359150565b5f602082840312156129f9575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156107df576107df612a00565b600181811c90821680612a3b57607f821691505b602082108103612a5957634e487b7160e01b5f52602260045260245ffd5b50919050565b5f805f60608486031215612a71575f80fd5b8351612a7c8161262a565b6020850151909350612a8d8161262a565b60408501519092506128a38161262a565b5f60208284031215612aae575f80fd5b8151610883816126c1565b5f60208284031215612ac9575f80fd5b815167ffffffffffffffff811115612adf575f80fd5b8201601f81018413612aef575f80fd5b8051612afd61275782612713565b818152856020838501011115612b11575f80fd5b6110428260208301602086016125bf565b7502b30bab63a21b930b33a1021b7b6b837bab7322b19960551b81525f8251612b528160168501602087016125bf565b6a1021b7b6b837bab73232b960a91b6016939091019283015250602101919050565b601f8211156115f557805f5260205f20601f840160051c81016020851015612b995750805b601f840160051c820191505b81811015611c1c575f8155600101612ba5565b815167ffffffffffffffff811115612bd257612bd26126ce565b612be681612be08454612a27565b84612b74565b602080601f831160018114612c19575f8415612c025750858301515b5f19600386901b1c1916600185901b178555612c70565b5f85815260208120601f198616915b82811015612c4757888601518255948401946001909101908401612c28565b5085821015612c6457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6576634376332d60d01b81525f8251612c988160068501602087016125bf565b9190910160060192915050565b60ff81811683821601908111156107df576107df612a00565b6001600160a01b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b600181815b80851115612d2d57815f1904821115612d1357612d13612a00565b80851615612d2057918102915b93841c9390800290612cf8565b509250929050565b5f82612d43575060016107df565b81612d4f57505f6107df565b8160018114612d655760028114612d6f57612d8b565b60019150506107df565b60ff841115612d8057612d80612a00565b50506001821b6107df565b5060208310610133831016604e8410600b8410161715612dae575081810a6107df565b612db88383612cf3565b805f1904821115612dcb57612dcb612a00565b029392505050565b5f61088360ff841683612d35565b818103818111156107df576107df612a00565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff831680612e3a57634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b5f8251612e5a8184602087016125bf565b919091019291505056fecd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220b594d4f2cbb365e177b09fc8dfd5fcc0cfd1c359b39015c6a3b0a6217830ab7964736f6c63430008190033