[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "InsufficientInputAmount", "type": "error" }, { "inputs": [ { "internalType": "uint112", "name": "reserve0", "type": "uint112" }, { "internalType": "uint112", "name": "reserve1", "type": "uint112" } ], "name": "InsufficientLiquidity", "type": "error" }, { "inputs": [], "name": "InsufficientOutputAmount", "type": "error" }, { "inputs": [], "name": "InvalidToToken", "type": "error" }, { "inputs": [], "name": "KConstantError", "type": "error" }, { "inputs": [], "name": "Uint112Overflow", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" } ], "name": "Burn", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "addr", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "orderId", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "sellToken", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "unsoldAmount", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "buyToken", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "purchasedAmount", "type": "uint256" } ], "name": "CancelLongTermOrder", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "addr", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "orderId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount0In", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "numberOfTimeIntervals", "type": "uint256" } ], "name": "LongTermSwap0To1", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "addr", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "orderId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1In", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "numberOfTimeIntervals", "type": "uint256" } ], "name": "LongTermSwap1To0", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "fee", "type": "uint256" } ], "name": "LpFeeUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1", "type": "uint256" } ], "name": "Mint", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount0In", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1In", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount0Out", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1Out", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" } ], "name": "Swap", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint112", "name": "reserve0", "type": "uint112" }, { "indexed": false, "internalType": "uint112", "name": "reserve1", "type": "uint112" } ], "name": "Sync", "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": "uint256", "name": "blockTimestamp", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "blockTimestampElapsed", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newReserve0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newReserve1", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newTwammReserve0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newTwammReserve1", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "token0Bought", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "token1Bought", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "token0Sold", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "token1Sold", "type": "uint256" } ], "name": "VirtualOrderExecution", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "addr", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "orderId", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "proceedToken", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "proceeds", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "orderExpired", "type": "bool" } ], "name": "WithdrawProceedsFromLongTermOrder", "type": "event" }, { "inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MINIMUM_LIQUIDITY", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "PERMIT_TYPEHASH", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "TWAPObservationHistory", "outputs": [ { "internalType": "uint256", "name": "timestamp", "type": "uint256" }, { "internalType": "uint256", "name": "price0CumulativeLast", "type": "uint256" }, { "internalType": "uint256", "name": "price1CumulativeLast", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "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": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" } ], "name": "burn", "outputs": [ { "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "internalType": "uint256", "name": "amount1", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "orderId", "type": "uint256" } ], "name": "cancelLongTermSwap", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "blockTimestamp", "type": "uint256" } ], "name": "executeVirtualOrders", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "factory", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "fee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amountOut", "type": "uint256" }, { "internalType": "address", "name": "tokenOut", "type": "address" } ], "name": "getAmountIn", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "address", "name": "tokenIn", "type": "address" } ], "name": "getAmountOut", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" }, { "internalType": "uint256", "name": "offset", "type": "uint256" }, { "internalType": "uint256", "name": "limit", "type": "uint256" } ], "name": "getDetailedOrdersForUser", "outputs": [ { "components": [ { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "creationTimestamp", "type": "uint256" }, { "internalType": "uint256", "name": "expirationTimestamp", "type": "uint256" }, { "internalType": "uint256", "name": "saleRate", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "sellTokenAddr", "type": "address" }, { "internalType": "address", "name": "buyTokenAddr", "type": "address" }, { "internalType": "bool", "name": "isComplete", "type": "bool" } ], "internalType": "struct LongTermOrdersLib.Order[]", "name": "detailed_orders", "type": "tuple[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getNextOrderID", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "getOrderIDsForUser", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "getOrderIDsForUserLength", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "blockTimestamp", "type": "uint256" } ], "name": "getReserveAfterTwamm", "outputs": [ { "internalType": "uint112", "name": "_reserve0", "type": "uint112" }, { "internalType": "uint112", "name": "_reserve1", "type": "uint112" }, { "internalType": "uint256", "name": "lastVirtualOrderTimestamp", "type": "uint256" }, { "internalType": "uint112", "name": "_twammReserve0", "type": "uint112" }, { "internalType": "uint112", "name": "_twammReserve1", "type": "uint112" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getReserves", "outputs": [ { "internalType": "uint112", "name": "_reserve0", "type": "uint112" }, { "internalType": "uint112", "name": "_reserve1", "type": "uint112" }, { "internalType": "uint32", "name": "_blockTimestampLast", "type": "uint32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTWAPHistoryLength", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "orderId", "type": "uint256" } ], "name": "getTwammOrder", "outputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "creationTimestamp", "type": "uint256" }, { "internalType": "uint256", "name": "expirationTimestamp", "type": "uint256" }, { "internalType": "uint256", "name": "saleRate", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "sellTokenAddr", "type": "address" }, { "internalType": "address", "name": "buyTokenAddr", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "orderId", "type": "uint256" } ], "name": "getTwammOrderProceeds", "outputs": [ { "internalType": "bool", "name": "orderExpired", "type": "bool" }, { "internalType": "uint256", "name": "totalReward", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "orderId", "type": "uint256" }, { "internalType": "uint256", "name": "blockTimestamp", "type": "uint256" } ], "name": "getTwammOrderProceedsView", "outputs": [ { "internalType": "bool", "name": "orderExpired", "type": "bool" }, { "internalType": "uint256", "name": "totalReward", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTwammReserves", "outputs": [ { "internalType": "uint112", "name": "_reserve0", "type": "uint112" }, { "internalType": "uint112", "name": "_reserve1", "type": "uint112" }, { "internalType": "uint32", "name": "_blockTimestampLast", "type": "uint32" }, { "internalType": "uint112", "name": "_twammReserve0", "type": "uint112" }, { "internalType": "uint112", "name": "_twammReserve1", "type": "uint112" }, { "internalType": "uint256", "name": "_fee", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_blockTimestamp", "type": "uint256" } ], "name": "getTwammRewardFactor", "outputs": [ { "internalType": "uint256", "name": "rewardFactorPool0AtTimestamp", "type": "uint256" }, { "internalType": "uint256", "name": "rewardFactorPool1AtTimestamp", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_blockTimestamp", "type": "uint256" } ], "name": "getTwammSalesRateEnding", "outputs": [ { "internalType": "uint256", "name": "orderPool0SalesRateEnding", "type": "uint256" }, { "internalType": "uint256", "name": "orderPool1SalesRateEnding", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTwammState", "outputs": [ { "internalType": "uint256", "name": "token0Rate", "type": "uint256" }, { "internalType": "uint256", "name": "token1Rate", "type": "uint256" }, { "internalType": "uint256", "name": "lastVirtualOrderTimestamp", "type": "uint256" }, { "internalType": "uint256", "name": "orderTimeInterval_rtn", "type": "uint256" }, { "internalType": "uint256", "name": "rewardFactorPool0", "type": "uint256" }, { "internalType": "uint256", "name": "rewardFactorPool1", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_token0", "type": "address" }, { "internalType": "address", "name": "_token1", "type": "address" }, { "internalType": "uint256", "name": "_fee", "type": "uint256" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "kLast", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount0In", "type": "uint256" }, { "internalType": "uint256", "name": "numberOfTimeIntervals", "type": "uint256" } ], "name": "longTermSwapFrom0To1", "outputs": [ { "internalType": "uint256", "name": "orderId", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount1In", "type": "uint256" }, { "internalType": "uint256", "name": "numberOfTimeIntervals", "type": "uint256" } ], "name": "longTermSwapFrom1To0", "outputs": [ { "internalType": "uint256", "name": "orderId", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" } ], "name": "mint", "outputs": [ { "internalType": "uint256", "name": "liquidity", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "newSwapsPaused", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "nonces", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "orderIDsForUser", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "orderTimeInterval", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "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": [], "name": "price0CumulativeLast", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "price1CumulativeLast", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "newFee", "type": "uint256" } ], "name": "setFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" } ], "name": "skim", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount0Out", "type": "uint256" }, { "internalType": "uint256", "name": "amount1Out", "type": "uint256" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "swap", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "sync", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "togglePauseNewSwaps", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "token0", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "token1", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "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": "twammReserve0", "outputs": [ { "internalType": "uint112", "name": "", "type": "uint112" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "twammReserve1", "outputs": [ { "internalType": "uint112", "name": "", "type": "uint112" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "twammUpToDate", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "orderId", "type": "uint256" } ], "name": "withdrawProceedsFromLongTermSwap", "outputs": [ { "internalType": "bool", "name": "is_expired", "type": "bool" }, { "internalType": "address", "name": "rewardTkn", "type": "address" }, { "internalType": "uint256", "name": "totalReward", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" } ]
60a06040526001601f5534801561001557600080fd5b50604080518082018252600b81526a233930bc39bbb0b8102b1960a91b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527f736229277fc30c9d8d02e6316edaeb1ea2708ef3d3c39aa1877ab5a97793cc30918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015246608082018190523060a08301529060c00160408051808303601f1901815291905280516020909101206080525060188054610100600160a81b03191633610100021790556080516156226200012c6000396000818161066f0152612ea201526156226000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c80637464fc3d116101de57806396f291271161010f578063c9738a0d116100ad578063ddca3f431161007c578063ddca3f4314610a5e578063e852bc2e14610a67578063f140a35a14610aa6578063fff6cae914610ab957600080fd5b8063c9738a0d146109ed578063d21220a714610a00578063d505accf14610a20578063dd62ed3e14610a3357600080fd5b8063ba9a7a56116100e9578063ba9a7a561461095c578063bc25cf7714610965578063bcaa64ea14610978578063c45a0155146109c857600080fd5b806396f2912714610937578063a1462c191461093f578063a9059cbb1461094957600080fd5b806381ca79981161017c57806387353fed1161015657806387353fed146108a857806389afcb44146108c857806395d89b41146108db5780639610c5f11461091757600080fd5b806381ca79981461083d57806381fd0a4614610850578063852a8dbe1461089557600080fd5b806378dd0298116101b857806378dd0298146107e15780637d316e28146107e95780637ecebe00146108155780637fa2ee6e1461083557600080fd5b80637464fc3d14610799578063748fc63b146107a2578063753bfd4b146107ab57600080fd5b80632c8488da116102b85780634894c53c116102565780635a3d5493116102305780635a3d54931461074b57806369fe0e2d146107535780636a6278421461076657806370a082311461077957600080fd5b80634894c53c146106cc5780634adc77c2146106df5780635909c0d51461074357600080fd5b8063313ce56711610292578063313ce567146106505780633644e5151461066a578063422fff051461069157806343c99081146106b957600080fd5b80632c8488da146105ec5780632e0ae3751461061657806330adf81f1461062957600080fd5b80631125f13f116103255780631f4f5b42116102ff5780631f4f5b421461058b5780631fc2fa7f1461059e57806323b872dd146105ab57806327e73836146105be57600080fd5b80631125f13f1461054e5780631794bb3c1461056f57806318160ddd1461058257600080fd5b8063094cf14911610361578063094cf14914610455578063095ea7b3146104ad5780630dfe1681146104d05780630ece72361461051557600080fd5b8063022c0d9f1461038857806306fdde031461039d5780630902f1ac146103ef575b600080fd5b61039b610396366004614f0f565b610ac1565b005b6103d96040518060400160405280600b81526020017f467261787377617020563200000000000000000000000000000000000000000081525081565b6040516103e69190614fc9565b60405180910390f35b601b54604080516dffffffffffffffffffffffffffff80841682526e01000000000000000000000000000084041660208201527c010000000000000000000000000000000000000000000000000000000090920463ffffffff16908201526060016103e6565b61045d611102565b604080516dffffffffffffffffffffffffffff9788168152958716602087015263ffffffff90941693850193909352908416606084015292909216608082015260a081019190915260c0016103e6565b6104c06104bb36600461501a565b611192565b60405190151581526020016103e6565b6019546104f09073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103e6565b60165461052f906dffffffffffffffffffffffffffff1681565b6040516dffffffffffffffffffffffffffff90911681526020016103e6565b61056161055c366004615046565b6111a9565b6040519081526020016103e6565b61039b61057d366004615076565b6112e9565b61056160005481565b61039b6105993660046150b7565b61140d565b6018546104c09060ff1681565b6104c06105b9366004615076565b611607565b6105d16105cc3660046150b7565b6116e1565b604080519384526020840192909252908201526060016103e6565b6105ff6105fa3660046150d0565b611714565b6040805192151583526020830191909152016103e6565b61039b6106243660046150b7565b611775565b6105617f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b610658601281565b60405160ff90911681526020016103e6565b6105617f000000000000000000000000000000000000000000000000000000000000000081565b6106a461069f3660046150b7565b6117b0565b604080519283526020830191909152016103e6565b6106a46106c73660046150b7565b6117f0565b6105ff6106da3660046150b7565b611830565b6106f26106ed3660046150b7565b61184f565b60408051978852602088019690965294860193909352606085019190915273ffffffffffffffffffffffffffffffffffffffff908116608085015290811660a08401521660c082015260e0016103e6565b6105616118cc565b610561611913565b61039b6107613660046150b7565b61195a565b6105616107743660046150f2565b611aa2565b6105616107873660046150f2565b60016020526000908152604090205481565b610561601c5481565b610561610e1081565b6105616107b93660046150f2565b73ffffffffffffffffffffffffffffffffffffffff166000908152601d602052604090205490565b601454610561565b60165461052f906e01000000000000000000000000000090046dffffffffffffffffffffffffffff1681565b6105616108233660046150f2565b60036020526000908152604090205481565b601e54610561565b61056161084b3660046150d0565b611e2f565b61086361085e3660046150b7565b611fb4565b60408051931515845273ffffffffffffffffffffffffffffffffffffffff9092166020840152908201526060016103e6565b6105616108a336600461501a565b612195565b6108bb6108b636600461510f565b6121c6565b6040516103e69190615144565b6106a46108d63660046150f2565b6123fc565b6103d96040518060400160405280600581526020017f46532d563200000000000000000000000000000000000000000000000000000081525081565b61092a6109253660046150f2565b6128af565b6040516103e691906151f3565b61039b612928565b60045442146104c0565b6104c061095736600461501a565b6129fd565b6105616103e881565b61039b6109733660046150f2565b612a0a565b61098b6109863660046150b7565b612bd8565b604080516dffffffffffffffffffffffffffff9687168152948616602086015284019290925283166060830152909116608082015260a0016103e6565b6018546104f090610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6105616109fb3660046150d0565b612d12565b601a546104f09073ffffffffffffffffffffffffffffffffffffffff1681565b61039b610a2e366004615237565b612e6c565b610561610a413660046152ae565b600260209081526000928352604080842090915290825290205481565b61056160175481565b600654600d54600454600754600e5460408051958652602086019490945292840191909152610e106060840152608083015260a082015260c0016103e6565b610561610ab4366004615046565b6130b8565b61039b6131f2565b601f54600114610ad057600080fd5b6000601f55610ade426133bc565b6000851180610aed5750600084115b610b23576040517f42301c2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b7f601b546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b5091509150816dffffffffffffffffffffffffffff1687108015610bb25750806dffffffffffffffffffffffffffff1686105b610c06576040517f6243da720000000000000000000000000000000000000000000000000000000081526dffffffffffffffffffffffffffff80841660048301528216602482015260440160405180910390fd5b601954601a54600091829173ffffffffffffffffffffffffffffffffffffffff918216919081169089168214801590610c6b57508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b610ca1576040517f591c75ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a15610cb257610cb2828a8d6135ac565b8915610cc357610cc3818a8c6135ac565b8615610d56576040517f10d1e85c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16906310d1e85c90610d239033908f908f908e908e906004016152dc565b600060405180830381600087803b158015610d3d57600080fd5b505af1158015610d51573d6000803e3d6000fd5b505050505b6016546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526dffffffffffffffffffffffffffff9091169073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfa9190615354565b610e04919061539c565b6016546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529195506e01000000000000000000000000000090046dffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebb9190615354565b610ec5919061539c565b92505050600089856dffffffffffffffffffffffffffff16610ee7919061539c565b8311610ef4576000610f18565b610f0e8a6dffffffffffffffffffffffffffff871661539c565b610f18908461539c565b90506000610f368a6dffffffffffffffffffffffffffff871661539c565b8311610f43576000610f67565b610f5d8a6dffffffffffffffffffffffffffff871661539c565b610f67908461539c565b90506000821180610f785750600081115b610fae576040517f098fb56100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000601754612710610fc0919061539c565b90506000610fce82856153af565b610fda876127106153af565b610fe4919061539c565b90506000610ff283856153af565b610ffe876127106153af565b611008919061539c565b90506110276dffffffffffffffffffffffffffff808a16908b166153af565b611035906305f5e1006153af565b61103f82846153af565b1015611077576040517f19886c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505061108e848488886110896136e8565b61372b565b60408051838152602081018390529081018c9052606081018b905273ffffffffffffffffffffffffffffffffffffffff8a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001601f55505050505050505050565b601b54601654601754600092839283928392839283926dffffffffffffffffffffffffffff808416936e0100000000000000000000000000008082048316947c010000000000000000000000000000000000000000000000000000000090920463ffffffff16938383169391909204169061117f9061271061539c565b949b939a50919850965094509092509050565b600061119f3384846139f6565b5060015b92915050565b6019546000908190819073ffffffffffffffffffffffffffffffffffffffff85811691161461120057601b546dffffffffffffffffffffffffffff808216916e010000000000000000000000000000900416611229565b601b546dffffffffffffffffffffffffffff6e0100000000000000000000000000008204811691165b9150915060008511801561124d57506000826dffffffffffffffffffffffffffff16115b801561126957506000816dffffffffffffffffffffffffffff16115b61127257600080fd5b600061128e866dffffffffffffffffffffffffffff85166153af565b61129a906127106153af565b9050600060175487846dffffffffffffffffffffffffffff166112bd919061539c565b6112c791906153af565b90506112d381836153f5565b6112de906001615409565b979650505050505050565b806000811180156112fa5750606581105b61130357600080fd5b601854610100900473ffffffffffffffffffffffffffffffffffffffff16331461132c57600080fd5b6019805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255601a80549286169290911691909117905561138d8261271061539c565b601755600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055426004556040518281527f2ade3fe6cec488ed9b13e36f5179edfbca9998fecc5926cf57335558671d5f959060200160405180910390a150505050565b601f5460011461141c57600080fd5b6000601f5561142a426133bc565b600080808061143a600486613a65565b6019549397509195509350915073ffffffffffffffffffffffffffffffffffffffff8084169116148061146d578361146f565b815b601680546000906114919084906dffffffffffffffffffffffffffff1661541c565b92506101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff160217905550806114ce57816114d0565b835b60168054600e906115049084906e01000000000000000000000000000090046dffffffffffffffffffffffffffff1661541c565b82546dffffffffffffffffffffffffffff9182166101009390930a928302919092021990911617905550600086815260156020526040902060060180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556115878333846135ac565b6115928533866135ac565b6040805187815273ffffffffffffffffffffffffffffffffffffffff878116602083015291810186905290841660608201526080810183905233907f3c5d5e0947e8b8050cf53e91c7496de2499da1b7613ec86b8fda8705789663909060a00160405180910390a250506001601f5550505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146116cc5773ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832033845290915290205461169a90839061539c565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b6116d7848484613b06565b5060019392505050565b601e81815481106116f157600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b600080600460100154841061172857600080fd5b60008481526015602052604081206005015461175c9060049073ffffffffffffffffffffffffffffffffffffffff16613bd5565b9050611769818686613c11565b90969095509350505050565b601f5460011461178457600080fd5b6000601f556004548111801561179a5750428111155b156117a8576117a8816133bc565b506001601f55565b600080806117c0610e108561544a565b6117ca908561539c565b600090815260086020908152604080832054600f90925290912054909590945092505050565b60008080611800610e108561544a565b61180a908561539c565b6000908152600c6020908152604080832054601390925290912054909590945092505050565b60008061183c42611775565b6118468342611714565b91509150915091565b6000806000806000806000600460100154881061186b57600080fd5b505050600094855250506015602052505060409020805460018201546002830154600384015460048501546005860154600690960154949693959294919373ffffffffffffffffffffffffffffffffffffffff918216938216929190911690565b601e546000906118dc5750600090565b601e80546118ec9060019061539c565b815481106118fc576118fc61545e565b906000526020600020906003020160010154905090565b601e546000906119235750600090565b601e80546119339060019061539c565b815481106119435761194361545e565b906000526020600020906003020160020154905090565b611963426133bc565b806000811180156119745750606581105b61197d57600080fd5b601854610100900473ffffffffffffffffffffffffffffffffffffffff16331480611a535750601854604080517f094b741500000000000000000000000000000000000000000000000000000000815290513392610100900473ffffffffffffffffffffffffffffffffffffffff169163094b74159160048083019260209291908290030181865afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b919061548d565b73ffffffffffffffffffffffffffffffffffffffff16145b611a5c57600080fd5b611a688261271061539c565b6017556040518281527f2ade3fe6cec488ed9b13e36f5179edfbca9998fecc5926cf57335558671d5f959060200160405180910390a15050565b6000601f54600114611ab357600080fd5b6000601f55611ac1426133bc565b600080611b1d601b546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b506016546019546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529395509193506000926dffffffffffffffffffffffffffff9091169173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bcd9190615354565b611bd7919061539c565b601654601a546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529293506000926e0100000000000000000000000000009092046dffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611c72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c969190615354565b611ca0919061539c565b90506000611cbe6dffffffffffffffffffffffffffff86168461539c565b90506000611cdc6dffffffffffffffffffffffffffff86168461539c565b90506000611cea8787613ce7565b60008054919250819003611d2b576103e8611d0d611d0885876153af565b613e54565b611d17919061539c565b9850611d2660006103e8613ec4565b611d80565b611d7d6dffffffffffffffffffffffffffff8916611d4983876153af565b611d5391906153f5565b6dffffffffffffffffffffffffffff8916611d6e84876153af565b611d7891906153f5565b613f6f565b98505b60008911611d8d57600080fd5b611d978a8a613ec4565b611da686868a8a6110896136e8565b8115611de157601b54611ddd906dffffffffffffffffffffffffffff6e0100000000000000000000000000008204811691166153af565b601c555b604080518581526020810185905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001601f5550949695505050505050565b6000601f54600114611e4057600080fd5b6000601f5560185460ff1615611e5557600080fd5b611e5e426133bc565b601a54600090611e849073ffffffffffffffffffffffffffffffffffffffff1685613f85565b9050806016600e8282829054906101000a90046dffffffffffffffffffffffffffff16611eb191906154aa565b82546101009290920a6dffffffffffffffffffffffffffff818102199093169183160217909155601654601b54919250611f05916e0100000000000000000000000000009182900484169190048316615409565b1115611f1057600080fd5b601a54601954611f3e9160049173ffffffffffffffffffffffffffffffffffffffff918216911684876141ce565b336000818152601d602090815260408083208054600181018255908452928290209092018490558151848152908101859052908101869052919350907fe1ce07267c05b1609d3bd4046ca369b74e64cd2b45ee8321ccc79783252c60b4906060015b60405180910390a2506001601f5592915050565b6000806000601f54600114611fc857600080fd5b6000601f55611fd6426133bc565b60008080611fe5600488614444565b601954929550909350915073ffffffffffffffffffffffffffffffffffffffff9081169084160361206c57601680548391906000906120359084906dffffffffffffffffffffffffffff1661541c565b92506101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff1602179055506120ca565b816016600e8282829054906101000a90046dffffffffffffffffffffffffffff16612097919061541c565b92506101000a8154816dffffffffffffffffffffffffffff02191690836dffffffffffffffffffffffffffff1602179055505b801561211f57600087815260156020526040902060060180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790555b61212a8333846135ac565b604080518881526020810184905282151581830152905173ffffffffffffffffffffffffffffffffffffffff85169133917f43168622ddb54ed84ccad30626ace7077235dc531c67aaf639752c45195354489181900360600190a36001601f55969195509350915050565b601d60205281600052604060002081815481106121b157600080fd5b90600052602060002001600091509150505481565b73ffffffffffffffffffffffffffffffffffffffff83166000908152601d6020908152604080832080548251818502810185019093528083526060949383018282801561223257602002820191906000526020600020905b81548152602001906001019080831161221e575b50505050509050600061224c84868451611d78919061539c565b90508067ffffffffffffffff811115612267576122676154d1565b6040519080825280602002602001820160405280156122f457816020015b604080516101008101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816122855790505b50925060005b818110156123f2576015600084612311848a615409565b815181106123215761232161545e565b60209081029190910181015182528181019290925260409081016000208151610100810183528154815260018201549381019390935260028101549183019190915260038101546060830152600481015473ffffffffffffffffffffffffffffffffffffffff90811660808401526005820154811660a084015260069091015490811660c083015274010000000000000000000000000000000000000000900460ff16151560e082015284518590839081106123df576123df61545e565b60209081029190910101526001016122fa565b5050509392505050565b600080601f5460011461240e57600080fd5b6000601f5561241c426133bc565b600080612478601b546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b50601954601a546016546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015294965092945073ffffffffffffffffffffffffffffffffffffffff918216939116916000916dffffffffffffffffffffffffffff9091169084906370a0823190602401602060405180830381865afa15801561250e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125329190615354565b61253c919061539c565b6016546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529192506000916e0100000000000000000000000000009091046dffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa1580156125d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f79190615354565b612601919061539c565b3060009081526001602052604081205491925061261e8888613ce7565b6000549091508061262f86856153af565b61263991906153f5565b9a508061264685856153af565b61265091906153f5565b995060008b118015612662575060008a115b61266b57600080fd5b61267530846144db565b612680878d8d6135ac565b61268b868d8c6135ac565b6016546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526dffffffffffffffffffffffffffff9091169073ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa15801561270b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272f9190615354565b612739919061539c565b6016546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529196506e01000000000000000000000000000090046dffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f09190615354565b6127fa919061539c565b935061280b85858b8b6110896136e8565b811561284657601b54612842906dffffffffffffffffffffffffffff6e0100000000000000000000000000008204811691166153af565b601c555b604080518c8152602081018c905273ffffffffffffffffffffffffffffffffffffffff8e169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505050505050506001601f81905550915091565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601d602090815260409182902080548351818402810184019094528084526060939283018282801561291c57602002820191906000526020600020905b815481526020019060010190808311612908575b50505050509050919050565b60185460ff161580156129c75750601860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f12d54d86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c79190615500565b6129d057600080fd5b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600061119f338484613b06565b601f54600114612a1957600080fd5b6000601f55612a27426133bc565b601954601a54601654601b5473ffffffffffffffffffffffffffffffffffffffff9384169390921691612b279184918691612a75916dffffffffffffffffffffffffffff91821691166154aa565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526dffffffffffffffffffffffffffff919091169073ffffffffffffffffffffffffffffffffffffffff8716906370a08231906024015b602060405180830381865afa158015612af4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b189190615354565b612b22919061539c565b6135ac565b601654601b54612bce9183918691612b68916dffffffffffffffffffffffffffff6e01000000000000000000000000000092839004811692909104166154aa565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526dffffffffffffffffffffffffffff919091169073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401612ad7565b50506001601f5550565b600454601654601b5460009283929091839182918291612c0b916dffffffffffffffffffffffffffff91821691166154aa565b601654601b54919250600091612c4b916dffffffffffffffffffffffffffff6e0100000000000000000000000000009182900481169291909104166154aa565b6040805160a081018252601b546dffffffffffffffffffffffffffff80821683526e010000000000000000000000000000918290048116602084015260165480821694840194909452920490911660608201526017546080820152909150612cb560048a8361458e565b6040810151612cd4906dffffffffffffffffffffffffffff851661539c565b97508060600151826dffffffffffffffffffffffffffff16612cf6919061539c565b9650806040015194508060600151935050505091939590929450565b6000601f54600114612d2357600080fd5b6000601f5560185460ff1615612d3857600080fd5b612d41426133bc565b601954600090612d679073ffffffffffffffffffffffffffffffffffffffff1685613f85565b601680549192508291600090612d8e9084906dffffffffffffffffffffffffffff166154aa565b82546101009290920a6dffffffffffffffffffffffffffff818102199093169183160217909155601654601b54919250612dcd91908316908316615409565b1115612dd857600080fd5b601954601a54612e069160049173ffffffffffffffffffffffffffffffffffffffff918216911684876141ce565b336000818152601d602090815260408083208054600181018255908452928290209092018490558151848152908101859052908101869052919350907f9971294258b76b481032b9c1f7f5594619d7cf40e29e224de9e71481bd0a4f8590606001611fa0565b42841015612e7957600080fd5b73ffffffffffffffffffffffffffffffffffffffff8716600090815260036020526040812080547f0000000000000000000000000000000000000000000000000000000000000000917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9187612ef483615522565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001612f959291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa15801561301e573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061309957508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6130a257600080fd5b6130ad8989896139f6565b505050505050505050565b6019546000908190819073ffffffffffffffffffffffffffffffffffffffff85811691161461310e57601b546dffffffffffffffffffffffffffff6e010000000000000000000000000000820481169116613138565b601b546dffffffffffffffffffffffffffff808216916e0100000000000000000000000000009004165b9150915060008511801561315c57506000826dffffffffffffffffffffffffffff16115b801561317857506000816dffffffffffffffffffffffffffff16115b61318157600080fd5b60006017548661319191906153af565b905060006131af6dffffffffffffffffffffffffffff8416836153af565b90506000826131c08661271061555a565b6dffffffffffffffffffffffffffff166131da9190615409565b90506131e681836153f5565b98975050505050505050565b601f5460011461320157600080fd5b6000601f5561320f426133bc565b6016546019546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526133b5926dffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015613293573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b79190615354565b6132c1919061539c565b601654601a546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526e0100000000000000000000000000009092046dffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015613356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061337a9190615354565b613384919061539c565b601b546dffffffffffffffffffffffffffff808216916e0100000000000000000000000000009004166110896136e8565b6001601f55565b60185460ff16156133ca5750565b60045442036133d65750565b6040805160a081018252601b546dffffffffffffffffffffffffffff80821683526e01000000000000000000000000000091829004811660208401526016548082169484019490945292049091166060820152601754608082015261343d6004838361470e565b60408101516016805460608401516dffffffffffffffffffffffffffff9081166e010000000000000000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009092169316929092179190911790558051602082015160006134af6136e8565b905060008163ffffffff1611801561350d5750601b546dffffffffffffffffffffffffffff848116911614158061350d5750601b546dffffffffffffffffffffffffffff8381166e0100000000000000000000000000009092041614155b1561355257601b5461354d906dffffffffffffffffffffffffffff8086169185821691818116916e0100000000000000000000000000009004168561372b565b6135a5565b601b80546dffffffffffffffffffffffffffff8481166e010000000000000000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909216908616171790555b5050505050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052915160009283928716916136739190615584565b6000604051808303816000865af19150503d80600081146136b0576040519150601f19603f3d011682016040523d82523d6000602084013e6136b5565b606091505b50915091508180156136df5750805115806136df5750808060200190518101906136df9190615500565b6135a557600080fd5b6000806136fa6401000000004261544a565b601b547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16900392915050565b6016546dffffffffffffffffffffffffffff9061374a90821687615409565b1115801561378757506016546dffffffffffffffffffffffffffff90613784906e0100000000000000000000000000009004821686615409565b11155b6137bd576040517f350caebb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006137ce6401000000004261544a565b905060008263ffffffff161180156137f557506dffffffffffffffffffffffffffff841615155b801561381057506dffffffffffffffffffffffffffff831615155b1561390657601e60405180606001604052808363ffffffff1681526020018463ffffffff166138668861384289614a07565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690614a32565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160261388d6118cc565b0181526020018463ffffffff166138a7876138428a614a07565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16026138ce611913565b019052815460018181018455600093845260209384902083516003909302019182559282015192810192909255604001516002909101555b601b805463ffffffff83167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff6dffffffffffffffffffffffffffff8981166e0100000000000000000000000000009081027fffffffff000000000000000000000000000000000000000000000000000000009095168c83161794909417918216831794859055604080519382169282169290921783529290930490911660208201527f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1910160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600081815260118301602052604081206006810154600582015473ffffffffffffffffffffffffffffffffffffffff9081169392911690829081613aa98887613bd5565b9050613aba81888a60000154614a4e565b6004840154919650935073ffffffffffffffffffffffffffffffffffffffff1633148015613af257506000851180613af25750600083115b613afb57600080fd5b505092959194509250565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054613b3790829061539c565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054613b74908290615409565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613a589085815260200190565b600182015460009073ffffffffffffffffffffffffffffffffffffffff838116911614613c055782600901613c0a565b826002015b9392505050565b6000828152600484016020526040812054819080613c2e57600080fd5b600085815260038701602090815260408083205460058a0190925290912054818610613c8c5760008281526006890160205260409020546e010000000000000000000000000000620f42408383038602040494506001955050613cdc565b6e010000000000000000000000000000620f42406dffffffffffffffffffffffffffff1684838b60010154030281613cc657613cc66153c6565b0481613cd457613cd46153c6565b049350600094505b505050935093915050565b600080601860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015613d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d7b919061548d565b601c5473ffffffffffffffffffffffffffffffffffffffff8216158015945091925090613e40578015613e3b576000613dca611d086dffffffffffffffffffffffffffff8088169089166153af565b90506000613dd783613e54565b905080821115613e38576000613ded828461539c565b600054613dfa91906153af565b9050600082613e0a8560056153af565b613e149190615409565b90506000613e2282846153f5565b90508015613e3457613e348782613ec4565b5050505b50505b613e4c565b8015613e4c576000601c555b505092915050565b60006003821115613eb55750806000613e6e6002836153f5565b613e79906001615409565b90505b81811015613eaf57905080600281613e9481866153f5565b613e9e9190615409565b613ea891906153f5565b9050613e7c565b50919050565b8115613ebf575060015b919050565b80600054613ed29190615409565b600090815573ffffffffffffffffffffffffffffffffffffffff8316815260016020526040902054613f05908290615409565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613f639085815260200190565b60405180910390a35050565b6000818310613f7e5781613c0a565b5090919050565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015613ff4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140189190615354565b60408051336024820152306044820152606480820187905282518083039091018152608490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8816916140b59190615584565b6000604051808303816000865af19150503d80600081146140f2576040519150601f19603f3d011682016040523d82523d6000602084013e6140f7565b606091505b50915091508180156141215750805115806141215750808060200190518101906141219190615500565b61412a57600080fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152839073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015614196573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141ba9190615354565b6141c4919061539c565b9695505050505050565b600042816141de610e108361544a565b6141e8908361539c565b90506000816141f8866001615409565b61420490610e106153af565b61420e9190615409565b9050600061421c848361539c565b61422988620f42406153af565b61423391906153f5565b90506000811161424257600080fd5b600061424e8b8b613bd5565b9050614260818c601001548486614b40565b6040518061010001604052808c6010015481526020018681526020018481526020018381526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001600015158152508b60110160008d6010015481526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e08201518160060160146101000a81548160ff0219169083151502179055509050508a601001600081548092919061443190615522565b909155509b9a5050505050505050505050565b600081815260118301602052604081206006810154600582015473ffffffffffffffffffffffffffffffffffffffff918216939283929091839161448a91899116613bd5565b905061449b81878960000154614bb4565b6004840154919550935073ffffffffffffffffffffffffffffffffffffffff16331480156144c95750600084115b6144d257600080fd5b50509250925092565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205461450c90829061539c565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600160205260408120919091555461454190829061539c565b600090815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001613f63565b82546000610e1061459f818461544a565b6145a9908461539c565b6145b39190615409565b60028601805460098801805493945091925b8785116146a65760008581526002850160205260409020541515806145f95750600085815260028401602052604090205415155b1561469357600061460a878761539c565b90506000620f424061461c83866153af565b61462691906153f5565b90506000620f424061463884866153af565b61464291906153f5565b905061464f8a8383614c01565b5050600088815260028801602052604090205461466c908661539c565b600089815260028801602052604090205490955061468a908561539c565b93508798505050505b61469f610e1086615409565b94506145c5565b8786146130ad5760006146b9878a61539c565b90506000620f42406146cb83866153af565b6146d591906153f5565b90506000620f42406146e784866153af565b6146f191906153f5565b90506146fe8a8383614c01565b5050505050505050505050505050565b82546000610e1061471f818461544a565b614729908461539c565b6147339190615409565b905060028501600986015b8583116148cb5760008381526002830160205260409020541515806147725750600083815260028201602052604090205415155b156148b8576000614783858561539c565b8354909150600090620f42409061479b9084906153af565b6147a591906153f5565b8354909150600090620f4240906147bd9085906153af565b6147c791906153f5565b90506000806147d78a8585614c01565b915091506147e58782614d28565b6147ef8683614d28565b6147f98789614d66565b6148038689614d66565b7f793ee8b0d8020fc042a920607e3cbd37f5132c011786c8dd10a685f4414ed38188868c600001518d602001518e604001518f6060015188888c8c6040516148a79a99989796959493929190998a5260208a01989098526dffffffffffffffffffffffffffff96871660408a0152949095166060880152608087019290925260a086015260c085015260e08401919091526101008301526101208201526101400190565b60405180910390a187985050505050505b6148c4610e1084615409565b925061473e565b8584146149fc5760006148de858861539c565b8354909150600090620f4240906148f69084906153af565b61490091906153f5565b8354909150600090620f4240906149189085906153af565b61492291906153f5565b90506000806149328a8585614c01565b915091507f793ee8b0d8020fc042a920607e3cbd37f5132c011786c8dd10a685f4414ed3818b868c600001518d602001518e604001518f6060015188888c8c6040516149da9a99989796959493929190998a5260208a01989098526dffffffffffffffffffffffffffff96871660408a0152949095166060880152608087019290925260a086015260c085015260e08401919091526101008301526101208201526101400190565b60405180910390a16149ec8782614d28565b6149f68683614d28565b50505050505b505050919092555050565b60006111a36e0100000000000000000000000000006dffffffffffffffffffffffffffff84166155a0565b6000613c0a6dffffffffffffffffffffffffffff8316846155e7565b60008281526003840160205260408120548190838111614a6d57600080fd5b6000858152600487016020526040902054620f424081614a8d878561539c565b614a9791906153af565b614aa191906153f5565b600087815260058901602052604090205460018901549195506e01000000000000000000000000000091620f424091900383020404925080876000016000828254614aec919061539c565b90915550506000868152600488016020908152604080832083905560038a01825280832083905584835260028a0190915281208054839290614b2f90849061539c565b925050819055505050935093915050565b81846000016000828254614b549190615409565b9091555050600184015460008481526005860160209081526040808320939093556003870181528282208490556004870181528282208590558382526002870190529081208054849290614ba9908490615409565b909155505050505050565b600080614bc2858585613c11565b925090508015614be2576000848152600486016020526040812055614bf9565b600185015460008581526005870160205260409020555b935093915050565b6000806000856040015186600001516dffffffffffffffffffffffffffff16614c2a9190615409565b90506000866060015187602001516dffffffffffffffffffffffffffff16614c529190615409565b9050614c8d87600001516dffffffffffffffffffffffffffff1688602001516dffffffffffffffffffffffffffff1688888b60800151614da6565b604089015191955093508690614ca4908690615409565b614cae919061539c565b604088015260608701518590614cc5908590615409565b614ccf919061539c565b60608801526040870151614ce3908361539c565b6dffffffffffffffffffffffffffff1687526060870151614d04908261539c565b6dffffffffffffffffffffffffffff16602090970196909652509094909350915050565b815415614d62578154700f42400000000000000000000000000000820281614d5257614d526153c6565b6001840180549290910490910190555b5050565b6000818152600283016020526040812054835490918491614d8890849061539c565b90915550506001820154600091825260069092016020526040902055565b600080600285108015614db95750600284105b614ee0576002851015614e07576000614dd284866153af565b905080614de1886127106153af565b614deb9190615409565b614df5828a6153af565b614dff91906153f5565b925050614ee0565b6002841015614e51576000614e1c84876153af565b905080614e2b896127106153af565b614e359190615409565b614e3f82896153af565b614e4991906153f5565b915050614ee0565b6000612710614e6085886153af565b614e6a91906153f5565b614e749089615409565b90506000612710614e8586886153af565b614e8f91906153f5565b614e999089615409565b905080614ea6838a6153af565b614eb091906153f5565b614eba908361539c565b935081614ec7828b6153af565b614ed191906153f5565b614edb908261539c565b925050505b9550959350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114614f0c57600080fd5b50565b600080600080600060808688031215614f2757600080fd5b85359450602086013593506040860135614f4081614eea565b9250606086013567ffffffffffffffff80821115614f5d57600080fd5b818801915088601f830112614f7157600080fd5b813581811115614f8057600080fd5b896020828501011115614f9257600080fd5b9699959850939650602001949392505050565b60005b83811015614fc0578181015183820152602001614fa8565b50506000910152565b6020815260008251806020840152614fe8816040850160208701614fa5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000806040838503121561502d57600080fd5b823561503881614eea565b946020939093013593505050565b6000806040838503121561505957600080fd5b82359150602083013561506b81614eea565b809150509250929050565b60008060006060848603121561508b57600080fd5b833561509681614eea565b925060208401356150a681614eea565b929592945050506040919091013590565b6000602082840312156150c957600080fd5b5035919050565b600080604083850312156150e357600080fd5b50508035926020909101359150565b60006020828403121561510457600080fd5b8135613c0a81614eea565b60008060006060848603121561512457600080fd5b833561512f81614eea565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b828110156151e657815180518552868101518786015285810151868601526060808201519086015260808082015173ffffffffffffffffffffffffffffffffffffffff9081169187019190915260a08083015182169087015260c0808301519091169086015260e0908101511515908501526101009093019290850190600101615161565b5091979650505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561522b5783518352928401929184019160010161520f565b50909695505050505050565b600080600080600080600060e0888a03121561525257600080fd5b873561525d81614eea565b9650602088013561526d81614eea565b95506040880135945060608801359350608088013560ff8116811461529157600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156152c157600080fd5b82356152cc81614eea565b9150602083013561506b81614eea565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b60006020828403121561536657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156111a3576111a361536d565b80820281158282048414176111a3576111a361536d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615404576154046153c6565b500490565b808201808211156111a3576111a361536d565b6dffffffffffffffffffffffffffff8281168282160390808211156154435761544361536d565b5092915050565b600082615459576154596153c6565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561549f57600080fd5b8151613c0a81614eea565b6dffffffffffffffffffffffffffff8181168382160190808211156154435761544361536d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561551257600080fd5b81518015158114613c0a57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036155535761555361536d565b5060010190565b6dffffffffffffffffffffffffffff818116838216028082169190828114613e4c57613e4c61536d565b60008251615596818460208701614fa5565b9190910192915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8281168282168181028316929181158285048214176155de576155de61536d565b50505092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80841680615616576156166153c6565b9216919091049291505056