[ { "inputs": [ { "internalType": "contract ILBFactory", "name": "factory_", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AddressHelper__CallFailed", "type": "error" }, { "inputs": [], "name": "AddressHelper__NonContract", "type": "error" }, { "inputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "BinHelper__CompositionFactorFlawed", "type": "error" }, { "inputs": [], "name": "BinHelper__LiquidityOverflow", "type": "error" }, { "inputs": [], "name": "FeeHelper__FeeTooLarge", "type": "error" }, { "inputs": [], "name": "LBPair__AddressZero", "type": "error" }, { "inputs": [], "name": "LBPair__AlreadyInitialized", "type": "error" }, { "inputs": [], "name": "LBPair__EmptyMarketConfigs", "type": "error" }, { "inputs": [], "name": "LBPair__FlashLoanCallbackFailed", "type": "error" }, { "inputs": [], "name": "LBPair__FlashLoanInsufficientAmount", "type": "error" }, { "inputs": [], "name": "LBPair__InsufficientAmountIn", "type": "error" }, { "inputs": [], "name": "LBPair__InsufficientAmountOut", "type": "error" }, { "inputs": [], "name": "LBPair__InvalidInput", "type": "error" }, { "inputs": [], "name": "LBPair__InvalidStaticFeeParameters", "type": "error" }, { "inputs": [], "name": "LBPair__MaxTotalFeeExceeded", "type": "error" }, { "inputs": [], "name": "LBPair__OnlyFactory", "type": "error" }, { "inputs": [], "name": "LBPair__OnlyProtocolFeeRecipient", "type": "error" }, { "inputs": [], "name": "LBPair__OutOfLiquidity", "type": "error" }, { "inputs": [], "name": "LBPair__TokenNotSupported", "type": "error" }, { "inputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "LBPair__ZeroAmount", "type": "error" }, { "inputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "LBPair__ZeroAmountsOut", "type": "error" }, { "inputs": [], "name": "LBPair__ZeroBorrowAmount", "type": "error" }, { "inputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "LBPair__ZeroShares", "type": "error" }, { "inputs": [], "name": "LBToken__AddressThisOrZero", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LBToken__BurnExceedsBalance", "type": "error" }, { "inputs": [], "name": "LBToken__InvalidLength", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "LBToken__SelfApproval", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "LBToken__SpenderNotApproved", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LBToken__TransferExceedsBalance", "type": "error" }, { "inputs": [], "name": "LiquidityConfigurations__InvalidConfig", "type": "error" }, { "inputs": [], "name": "OracleHelper__InvalidOracleId", "type": "error" }, { "inputs": [], "name": "OracleHelper__LookUpTimestampTooOld", "type": "error" }, { "inputs": [], "name": "OracleHelper__NewLengthTooSmall", "type": "error" }, { "inputs": [], "name": "PackedUint128Math__AddOverflow", "type": "error" }, { "inputs": [], "name": "PackedUint128Math__MultiplierTooLarge", "type": "error" }, { "inputs": [], "name": "PackedUint128Math__SubUnderflow", "type": "error" }, { "inputs": [], "name": "PairParametersHelper__InvalidParameter", "type": "error" }, { "inputs": [], "name": "ReentrancyGuard__ReentrantCall", "type": "error" }, { "inputs": [], "name": "SafeCast__Exceeds128Bits", "type": "error" }, { "inputs": [], "name": "SafeCast__Exceeds24Bits", "type": "error" }, { "inputs": [], "name": "SafeCast__Exceeds40Bits", "type": "error" }, { "inputs": [], "name": "TokenHelper__TransferFailed", "type": "error" }, { "inputs": [], "name": "Uint128x128Math__LogUnderflow", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "x", "type": "uint256" }, { "internalType": "int256", "name": "y", "type": "int256" } ], "name": "Uint128x128Math__PowUnderflow", "type": "error" }, { "inputs": [], "name": "Uint256x256Math__MulDivOverflow", "type": "error" }, { "inputs": [], "name": "Uint256x256Math__MulShiftOverflow", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "feeRecipient", "type": "address" }, { "indexed": false, "internalType": "bytes32", "name": "protocolFees", "type": "bytes32" } ], "name": "CollectedProtocolFees", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint24", "name": "id", "type": "uint24" }, { "indexed": false, "internalType": "bytes32", "name": "totalFees", "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", "name": "protocolFees", "type": "bytes32" } ], "name": "CompositionFees", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "indexed": false, "internalType": "bytes32[]", "name": "amounts", "type": "bytes32[]" } ], "name": "DepositedToBins", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "contract ILBFlashLoanCallback", "name": "receiver", "type": "address" }, { "indexed": false, "internalType": "uint24", "name": "activeId", "type": "uint24" }, { "indexed": false, "internalType": "bytes32", "name": "amounts", "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", "name": "totalFees", "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", "name": "protocolFees", "type": "bytes32" } ], "name": "FlashLoan", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint24", "name": "idReference", "type": "uint24" }, { "indexed": false, "internalType": "uint24", "name": "volatilityReference", "type": "uint24" } ], "name": "ForcedDecay", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint16", "name": "oracleLength", "type": "uint16" } ], "name": "OracleLengthIncreased", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint16", "name": "baseFactor", "type": "uint16" }, { "indexed": false, "internalType": "uint16", "name": "filterPeriod", "type": "uint16" }, { "indexed": false, "internalType": "uint16", "name": "decayPeriod", "type": "uint16" }, { "indexed": false, "internalType": "uint16", "name": "reductionFactor", "type": "uint16" }, { "indexed": false, "internalType": "uint24", "name": "variableFeeControl", "type": "uint24" }, { "indexed": false, "internalType": "uint16", "name": "protocolShare", "type": "uint16" }, { "indexed": false, "internalType": "uint24", "name": "maxVolatilityAccumulator", "type": "uint24" } ], "name": "StaticFeeParametersSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint24", "name": "id", "type": "uint24" }, { "indexed": false, "internalType": "bytes32", "name": "amountsIn", "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", "name": "amountsOut", "type": "bytes32" }, { "indexed": false, "internalType": "uint24", "name": "volatilityAccumulator", "type": "uint24" }, { "indexed": false, "internalType": "bytes32", "name": "totalFees", "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", "name": "protocolFees", "type": "bytes32" } ], "name": "Swap", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "indexed": false, "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } ], "name": "TransferBatch", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "indexed": false, "internalType": "bytes32[]", "name": "amounts", "type": "bytes32[]" } ], "name": "WithdrawnFromBins", "type": "event" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "approveForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "accounts", "type": "address[]" }, { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" } ], "name": "balanceOfBatch", "outputs": [ { "internalType": "uint256[]", "name": "batchBalances", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } ], "name": "batchTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "amountsToBurn", "type": "uint256[]" } ], "name": "burn", "outputs": [ { "internalType": "bytes32[]", "name": "amounts", "type": "bytes32[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "collectProtocolFees", "outputs": [ { "internalType": "bytes32", "name": "collectedProtocolFees", "type": "bytes32" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract ILBFlashLoanCallback", "name": "receiver", "type": "address" }, { "internalType": "bytes32", "name": "amounts", "type": "bytes32" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "flashLoan", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "forceDecay", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "getActiveId", "outputs": [ { "internalType": "uint24", "name": "activeId", "type": "uint24" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "getBin", "outputs": [ { "internalType": "uint128", "name": "binReserveX", "type": "uint128" }, { "internalType": "uint128", "name": "binReserveY", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getBinStep", "outputs": [ { "internalType": "uint16", "name": "", "type": "uint16" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getFactory", "outputs": [ { "internalType": "contract ILBFactory", "name": "factory", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "price", "type": "uint256" } ], "name": "getIdFromPrice", "outputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "swapForY", "type": "bool" }, { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "getNextNonEmptyBin", "outputs": [ { "internalType": "uint24", "name": "nextId", "type": "uint24" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getOracleParameters", "outputs": [ { "internalType": "uint8", "name": "sampleLifetime", "type": "uint8" }, { "internalType": "uint16", "name": "size", "type": "uint16" }, { "internalType": "uint16", "name": "activeSize", "type": "uint16" }, { "internalType": "uint40", "name": "lastUpdated", "type": "uint40" }, { "internalType": "uint40", "name": "firstTimestamp", "type": "uint40" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint40", "name": "lookupTimestamp", "type": "uint40" } ], "name": "getOracleSampleAt", "outputs": [ { "internalType": "uint64", "name": "cumulativeId", "type": "uint64" }, { "internalType": "uint64", "name": "cumulativeVolatility", "type": "uint64" }, { "internalType": "uint64", "name": "cumulativeBinCrossed", "type": "uint64" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "getPriceFromId", "outputs": [ { "internalType": "uint256", "name": "price", "type": "uint256" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getProtocolFees", "outputs": [ { "internalType": "uint128", "name": "protocolFeeX", "type": "uint128" }, { "internalType": "uint128", "name": "protocolFeeY", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getReserves", "outputs": [ { "internalType": "uint128", "name": "reserveX", "type": "uint128" }, { "internalType": "uint128", "name": "reserveY", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getStaticFeeParameters", "outputs": [ { "internalType": "uint16", "name": "baseFactor", "type": "uint16" }, { "internalType": "uint16", "name": "filterPeriod", "type": "uint16" }, { "internalType": "uint16", "name": "decayPeriod", "type": "uint16" }, { "internalType": "uint16", "name": "reductionFactor", "type": "uint16" }, { "internalType": "uint24", "name": "variableFeeControl", "type": "uint24" }, { "internalType": "uint16", "name": "protocolShare", "type": "uint16" }, { "internalType": "uint24", "name": "maxVolatilityAccumulator", "type": "uint24" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint128", "name": "amountOut", "type": "uint128" }, { "internalType": "bool", "name": "swapForY", "type": "bool" } ], "name": "getSwapIn", "outputs": [ { "internalType": "uint128", "name": "amountIn", "type": "uint128" }, { "internalType": "uint128", "name": "amountOutLeft", "type": "uint128" }, { "internalType": "uint128", "name": "fee", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint128", "name": "amountIn", "type": "uint128" }, { "internalType": "bool", "name": "swapForY", "type": "bool" } ], "name": "getSwapOut", "outputs": [ { "internalType": "uint128", "name": "amountInLeft", "type": "uint128" }, { "internalType": "uint128", "name": "amountOut", "type": "uint128" }, { "internalType": "uint128", "name": "fee", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTokenX", "outputs": [ { "internalType": "contract IERC20", "name": "tokenX", "type": "address" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getTokenY", "outputs": [ { "internalType": "contract IERC20", "name": "tokenY", "type": "address" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getVariableFeeParameters", "outputs": [ { "internalType": "uint24", "name": "volatilityAccumulator", "type": "uint24" }, { "internalType": "uint24", "name": "volatilityReference", "type": "uint24" }, { "internalType": "uint24", "name": "idReference", "type": "uint24" }, { "internalType": "uint40", "name": "timeOfLastUpdate", "type": "uint40" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint16", "name": "newLength", "type": "uint16" } ], "name": "increaseOracleLength", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint16", "name": "baseFactor", "type": "uint16" }, { "internalType": "uint16", "name": "filterPeriod", "type": "uint16" }, { "internalType": "uint16", "name": "decayPeriod", "type": "uint16" }, { "internalType": "uint16", "name": "reductionFactor", "type": "uint16" }, { "internalType": "uint24", "name": "variableFeeControl", "type": "uint24" }, { "internalType": "uint16", "name": "protocolShare", "type": "uint16" }, { "internalType": "uint24", "name": "maxVolatilityAccumulator", "type": "uint24" }, { "internalType": "uint24", "name": "activeId", "type": "uint24" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "bytes32[]", "name": "liquidityConfigs", "type": "bytes32[]" }, { "internalType": "address", "name": "refundTo", "type": "address" } ], "name": "mint", "outputs": [ { "internalType": "bytes32", "name": "amountsReceived", "type": "bytes32" }, { "internalType": "bytes32", "name": "amountsLeft", "type": "bytes32" }, { "internalType": "uint256[]", "name": "liquidityMinted", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint16", "name": "baseFactor", "type": "uint16" }, { "internalType": "uint16", "name": "filterPeriod", "type": "uint16" }, { "internalType": "uint16", "name": "decayPeriod", "type": "uint16" }, { "internalType": "uint16", "name": "reductionFactor", "type": "uint16" }, { "internalType": "uint24", "name": "variableFeeControl", "type": "uint24" }, { "internalType": "uint16", "name": "protocolShare", "type": "uint16" }, { "internalType": "uint24", "name": "maxVolatilityAccumulator", "type": "uint24" } ], "name": "setStaticFeeParameters", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "swapForY", "type": "bool" }, { "internalType": "address", "name": "to", "type": "address" } ], "name": "swap", "outputs": [ { "internalType": "bytes32", "name": "amountsOut", "type": "bytes32" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" } ]
60a06040523480156200001157600080fd5b50604051620058a0380380620058a083398101604081905262000034916200004b565b6001600160a01b031660805260016004556200007d565b6000602082840312156200005e57600080fd5b81516001600160a01b03811681146200007657600080fd5b9392505050565b6080516157e4620000bc6000396000818161047001528181610a1601528181610f9f015281816111c5015281816118b0015261328601526157e46000f3fe608060405234801561001057600080fd5b50600436106102255760003560e01c80638d7024e51161012a578063d3b9fbe4116100bd578063e584b6541161008c578063e985e9c511610071578063e985e9c514610634578063ea3446bf14610657578063f5e293291461066a57600080fd5b8063e584b6541461060e578063e77366f81461062157600080fd5b8063d3b9fbe4146105de578063d8dfcea0146105e6578063da10610c146105ee578063dbe65edc1461060657600080fd5b8063abcd7830116100f9578063abcd78301461055b578063bd85b03914610598578063c7bd6586146105b8578063c9939f5e146105cb57600080fd5b80638d7024e5146104d257806395d89b411461050d578063a1af5b9a1461052c578063a41a01fb1461053457600080fd5b806347973bff116101bd578063551828941161018c5780637ca0de30116101715780637ca0de301461041c57806388cc58e41461046e5780638940a16a1461049457600080fd5b806355182894146103c45780636653851a1461040957600080fd5b806347973bff1461036b5780634c7cffbd1461037e5780634e1273f41461039157806353c059a0146103b157600080fd5b80630abe9688116101f95780630abe9688146102e357806317f11ecc1461031957806317fad7fc14610334578063383d15c51461034957600080fd5b8062fdd58e1461022a57806305e8746d1461025057806306fdde03146102795780630902f1ac146102bb575b600080fd5b61023d610238366004614e44565b61067d565b6040519081526020015b60405180910390f35b3660011981013560f01c90033560601c5b6040516001600160a01b039091168152602001610247565b60408051808201909152601481527f4c697175696469747920426f6f6b20546f6b656e00000000000000000000000060208201525b6040516102479190614e9c565b6102c36106ab565b604080516001600160801b03938416815292909116602083015201610247565b6102c36102f1366004614ee2565b62ffffff166000908152600760205260409020546001600160801b0381169160809190911c90565b6103216106e5565b60405161ffff9091168152602001610247565b610347610342366004614f42565b610706565b005b61035c610357366004614fd7565b61075f565b6040516102479392919061507a565b6103476103793660046150ab565b610a0b565b61023d61038c366004614ee2565b610aaa565b6103a461039f366004615142565b610ada565b60405161024791906151ae565b61023d6103bf3660046151cf565b610bc6565b6103cc610eed565b6040805160ff909616865261ffff9485166020870152939092169284019290925264ffffffffff918216606084015216608082015260a001610247565b610347610417366004615208565b610f94565b610424610ff8565b6040805161ffff9889168152968816602088015294871694860194909452918516606085015262ffffff9081166080850152931660a08301529190911660c082015260e001610247565b7f0000000000000000000000000000000000000000000000000000000000000000610261565b6104a76104a236600461528e565b611060565b6040805167ffffffffffffffff94851681529284166020840152921691810191909152606001610247565b6104da611156565b6040805162ffffff95861681529385166020850152919093169082015264ffffffffff9091166060820152608001610247565b60408051808201909152600381526213109560ea1b60208201526102ae565b61023d611196565b6105476105423660046152b5565b611362565b60405162ffffff9091168152602001610247565b61056e6105693660046152e1565b611375565b604080516001600160801b0394851681529284166020840152921691810191909152606001610247565b61023d6105a636600461531b565b60009081526001602052604090205490565b6103476105c6366004615334565b611516565b6103a46105d9366004614f42565b61158a565b6103476118a5565b6102c361195b565b3660011981013560f01c90036014013560601c610261565b610547611976565b61034761061c36600461534f565b611983565b61056e61062f3660046152e1565b611992565b61064761064236600461536d565b611ad3565b6040519015158152602001610247565b61034761066536600461538b565b611adf565b61054761067836600461531b565b611e3f565b6001600160a01b0382166000908152602081815260408083208484529091529020545b92915050565b905090565b6000806106dc6106c8600654600554611e6a90919063ffffffff16565b6001600160801b0381169160809190911c90565b90939092509050565b60006106a660003660011981013560f090811c90910360280135901c905090565b85336107128282611ea4565b6107475760405163548f773d60e01b81526001600160a01b038084166004830152821660248201526044015b60405180910390fd5b610755888888888888611ef0565b5050505050505050565b600080606060016003541461078757604051635db5c7cd60e11b815260040160405180910390fd5b6002600355866001600160a01b03811615806107ab57506001600160a01b03811630145b156107c9576040516345c210e760e11b815260040160405180910390fd5b856107e75760405163296db0d960e01b815260040160405180910390fd5b600060405180606001604052808989905067ffffffffffffffff81111561081057610810615414565b604051908082528060200260200182016040528015610839578160200160208202803683370190505b5081526020018867ffffffffffffffff81111561085857610858615414565b604051908082528060200260200182016040528015610881578160200160208202803683370190505b5081526020018867ffffffffffffffff8111156108a0576108a0615414565b6040519080825280602002602001820160405280156108c9578160200160208202803683370190505b5090526005549091506108f5813660011981013560f01c90038035606090811c9160140135901c61209c565b95506109048989888d866120dc565b945061091a6109138787611e6a565b8290612211565b600555841561094757610947853660011981013560f01c90038035606090811c9160140135901c8a61224b565b81604001519350896001600160a01b031660006001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8560000151886040516109a292919061542a565b60405180910390a4815160208301516040516001600160a01b038d169233927f87f1f9dcf5e8089a3e00811b6a008d8f30293a3da878cb1fe8c90ca376402f8a926109ee92919061542a565b60405180910390a350505060016003819055509450945094915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a5457604051632486085360e01b815260040160405180910390fd5b6004548015610a76576040516359e270a560e01b815260040160405180910390fd5b610a7e6122b1565b610a9f610a93610a8e83856122bd565b61230c565b8a8a8a8a8a8a8a612360565b505050505050505050565b60006106a0610ace60003660011981013560f090811c90910360280135901c905090565b62ffffff8416906124e7565b60608382808214610afe576040516340311ffd60e11b815260040160405180910390fd5b8567ffffffffffffffff811115610b1757610b17615414565b604051908082528060200260200182016040528015610b40578160200160208202803683370190505b50925060005b86811015610bbb57610b96888883818110610b6357610b6361544f565b9050602002016020810190610b789190615465565b878784818110610b8a57610b8a61544f565b9050602002013561067d565b848281518110610ba857610ba861544f565b6020908102919091010152600101610b46565b505050949350505050565b6000600160035414610beb57604051635db5c7cd60e11b815260040160405180910390fd5b6002600355600554600654600085610c1f57610c1a3660011981013560f01c90036014013560601c849061251e565b610c39565b610c393660011981013560f01c90033560601c8490612553565b905080610c5957604051637df801c760e01b815260040160405180910390fd5b610c638382612211565b6004549093506000610c8a60003660011981013560f090811c90910360280135901c905090565b90506000610c9783612582565b9050610ca28361258e565b92505b62ffffff8116600090815260076020526040902054610cc5818b15612603565b610df757610cd38483612632565b93506000806000610cf587878f888c896126ba9095949392919063ffffffff16565b919450925090508215610df357610d0c8884611e6a565b9750610d188b83612211565b9a506000610d33610d2889612882565b839061ffff16612892565b90508015610d5457610d458a82612211565b9950610d518482611e6a565b93505b610d6883610d628787612211565b90611e6a565b62ffffff87166000908152600760205260409020556001600160a01b038d16337fad7d6f97abf51ce18e17a38f4d70e975be9c0708474987bb3e26ad21bd93ca70888787610db58e612905565b6040805162ffffff9586168152602081019490945283019190915290911660608201526080810186905260a0810185905260c00160405180910390a3505b5050505b84610e025750610e4c565b6000610e0e8b84612916565b905062ffffff81161580610e26575062ffffff818116145b15610e4457604051631a6d7fb160e31b815260040160405180910390fd5b915050610ca5565b86610e6a5760405163439df85d60e11b815260040160405180910390fd5b610e748688611e6a565b6005556006859055610e88600b8483612938565b9250610e9483826122bd565b6004558815610ec057610ebb3660011981013560f01c90036014013560601c88908a612a48565b610edb565b610edb3660011981013560f01c90033560601c88908a612a88565b50506001600355509295945050505050565b60045460789060009081908190819081610f0682612a99565b905061ffff811615610f8b576000610f1f600b83612aa9565b96509050610f2c81612b07565b9650610f3781612b13565b945064ffffffffff8516610f4a57600095505b61ffff861615610f8957610f7b8661ffff168361ffff1681610f6e57610f6e615482565b600b916001910601612b34565b9050610f8681612b13565b93505b505b50509091929394565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdd57604051632486085360e01b815260040160405180910390fd5b610fef60045488888888888888612360565b50505050505050565b600080600080600080600080600454905061101281612b07565b975061101d81612b7d565b965061102881612b8d565b955061103381612b9d565b945061103e81612bad565b935061104981612882565b925061105481612bbe565b91505090919293949596565b6000806000806004549050600061107682612a99565b905061ffff8116158061108f5750428664ffffffffff16115b156110a6576000806000945094509450505061114f565b60006110b4600b8389612bcf565b91985096509450905064ffffffffff808816908216101561114b576110e26110db84612582565b8490612cf2565b5060006110ef82896154ae565b90508064ffffffffff1661110285612582565b62ffffff1661111191906154d4565b61111b9088615504565b96508064ffffffffff1661112e85612905565b62ffffff1661113d91906154d4565b6111479087615504565b9550505b5050505b9193909250565b6000806000806000600454905061116c81612905565b945061117781612d09565b935061118281612d1a565b925061118d81612d2b565b91505090919293565b60006001600354146111bb57604051635db5c7cd60e11b815260040160405180910390fd5b60026003819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634ccb20c06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611221573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112459190615530565b6001600160a01b0316336001600160a01b03161461127657604051630f8937c560e21b815260040160405180910390fd5b6006546001600160801b038116608082901c60006112d18261129957600061129c565b60015b60ff166000856001600160801b0316116112b75760006112ba565b60015b60ff169060801b6001600160801b03919091161790565b90506112dd8482611e6a565b945084156113545760068190556005546112f79086611e6a565b60055561131e853660011981013560f01c90038035606090811c9160140135901c3361224b565b60405185815233907f3f41a5ddc53701cc7db577ade4f1fca9838a8ec0b5ea50b9f0f5d17bc4554e329060200160405180910390a25b505060016003555090919050565b600061136e8383612916565b9392505050565b600454600090839082908161139f60003660011981013560f090811c90910360280135901c905090565b905060006113ac83612582565b90506113b78361258e565b92505b62ffffff81166000908152600760205260408120546113da908915612d3e565b90506001600160801b038116156114c05760006113fc62ffffff8416856124e7565b90506000876001600160801b0316836001600160801b03161161141f5782611421565b875b905061142d8685612632565b955060008a6114505761144b6001600160801b038316846080612d5e565b611465565b6114656001600160801b038316608085612d94565b905060006114738888612dca565b9050600061148a6001600160801b03841683612de9565b9050611496818461554d565b6114a0908d61554d565b9b506114ac848c61556f565b9a506114b8818b61554d565b995050505050505b6001600160801b0386166114d4575061150c565b60006114e08984612916565b905062ffffff811615806114f8575062ffffff818116145b1561150457505061150c565b9150506113ba565b5050509250925092565b600454600061152482612a99565b905061ffff81166115405750600161153c8282612e5b565b6004555b61154c600b8285612eaa565b60405161ffff8416815233907fc975541e72d695746a43ba65745d79963a23082637c8f4609354d9bcf70194d69060200160405180910390a2505050565b60606001600354146115af57604051635db5c7cd60e11b815260040160405180910390fd5b600260035586336115c08282611ea4565b6115f05760405163548f773d60e01b81526001600160a01b0380841660048301528216602482015260440161073e565b8515806115fd5750858414155b1561161b57604051633ab7870760e01b815260040160405180910390fd5b8567ffffffffffffffff81111561163457611634615414565b60405190808252806020026020018201604052801561165d578160200160208202803683370190505b5092506000805b878110156117b357600061168f8a8a848181106116835761168361544f565b90506020020135612f93565b905060008888848181106116a5576116a561544f565b90506020020135905080600014156116d757604051636996a92560e01b815262ffffff8316600482015260240161073e565b62ffffff8216600090815260076020908152604080832054600190925282205490915061170a8f8562ffffff1685612fbe565b600061171783858461303f565b90508061173e5760405163fd44792960e01b815262ffffff8616600482015260240161073e565b6117488382611e6a565b92508382141561175f5761175d6008866130b7565b505b62ffffff85166000908152600760205260409020839055895181908b908890811061178c5761178c61544f565b60209081029190910101526117a18782612211565b96508560010195505050505050611664565b506005546117c19082611e6a565b6005556117e8813660011981013560f01c90038035606090811c9160140135901c8c61224b565b60006001600160a01b03168a6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b8b8b60405161183c94939291906155de565b60405180910390a4886001600160a01b0316336001600160a01b03167fa32e146844d6144a22e94c586715a1317d58a8aa3581ec33d040113ddcb243508a8a8860405161188b93929190615605565b60405180910390a350506001600355509695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118ee57604051632486085360e01b815260040160405180910390fd5b6004546119026118fd8261230c565b613152565b600455337f282afaeeae84c1d85ad1424a3aa2ddbedaeefca3b1e53d889d15265fe44db7fc61193083612d1a565b61193984612d09565b6040805162ffffff93841681529290911660208301520160405180910390a250565b60065460009081906001600160801b0381169060801c6106dc565b60006106a6600454612582565b61198e338383613187565b5050565b60008080806119aa6001600160801b03871686613270565b60045490915060006119d160003660011981013560f090811c90910360280135901c905090565b905060006119de83612582565b90506119e98361258e565b92505b62ffffff8116600090815260076020526040902054611a0c818a15612603565b611a7957611a1a8483612632565b935060008080611a2e8488888f898d6126ba565b919450925090508215611a7557611a458884611e6a565b9750611a52828d15612d3e565b611a5c908b61554d565b9950611a68818d612d3e565b611a72908a61554d565b98505b5050505b84611a845750611abc565b6000611a908a84612916565b905062ffffff81161580611aa8575062ffffff818116145b15611ab4575050611abc565b9150506119ec565b611ac68489612d3e565b9650505050509250925092565b600061136e8383611ea4565b600160035414611b0257604051635db5c7cd60e11b815260040160405180910390fd5b600260035582611b255760405163727ab02160e11b815260040160405180910390fd5b6005546004546000611b3686613281565b9050611b5c863660011981013560f01c90038035606090811c9160140135901c8a61224b565b6000806001600160a01b038916631faa6b8760e01b333660011981013560f01c90033560601c3660011981013560f01c90036014013560601c8c888d8d604051602401611baf979695949392919061562b565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c1a919061568f565b6000604051808303816000865af19150503d8060008114611c57576040519150601f19603f3d011682016040523d82523d6000602084013e611c5c565b606091505b5091509150811580611c7057508051602014155b80611cae57507fab5c473bce5960a8292e9c8db82f9272504caab4e9ef09553fc112f82b62a3c281806020019051810190611cab91906156ab565b14155b15611ccc57604051634a57011360e01b815260040160405180910390fd5b6000611cf1813660011981013560f01c90038035606090811c9160140135901c61209c565b9050611d07611d008786612211565b8290613389565b15611d2557604051630e3c717160e11b815260040160405180910390fd5b611d2f8187611e6a565b93506000611d3c86612582565b90506000611d5b8262ffffff1660009081526001602052604090205490565b15611d7c57611d77611d6c88612882565b879061ffff16612892565b611d7e565b855b6005849055600654909150611d939082612211565b600655611dbe611da38783611e6a565b62ffffff841660009081526007602052604090205490612211565b62ffffff83166000818152600760209081526040918290209390935580519182529181018d9052908101879052606081018290526001600160a01b038d169033907fd126bd9d94daca8e55ffd8283fac05394aec8326c6b1639e1e8a445fbe8bbc7d9060800160405180910390a35050600160035550505050505050505050565b60006106a0611e6360003660011981013560f090811c90910360280135901c905090565b83906133cd565b80820382811180611e8657506001600160801b03808416908216115b156106a05760405163e599af5560e01b815260040160405180910390fd5b6000816001600160a01b0316836001600160a01b0316148061136e5750506001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b8281808214611f12576040516340311ffd60e11b815260040160405180910390fd5b866001600160a01b0381161580611f3157506001600160a01b03811630145b15611f4f576040516345c210e760e11b815260040160405180910390fd5b6001600160a01b03808a16600090815260208190526040808220928b1682528120905b888110156120335760008a8a83818110611f8e57611f8e61544f565b9050602002013590506000898984818110611fab57611fab61544f565b600085815260208981526040909120549102929092013592505081811015612008578e83836040516358b4690f60e01b815260040161073e939291906001600160a01b039390931683526020830191909152604082015260600190565b6000928352602086815260408085209284900390925585905290912080549091019055600101611f72565b50896001600160a01b03168b6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8c8c8c8c60405161208794939291906155de565b60405180910390a45050505050505050505050565b60006120d484610d626120ae85613412565b6120b787613412565b6001600160801b03169060801b6001600160801b03919091161790565b949350505050565b6000806120fe60003660011981013560f090811c90910360280135901c905090565b600454909150600061210f82612582565b905086935060005b888110156122045760008061214d8a8d8d868181106121385761213861544f565b9050602002013561348190919063ffffffff16565b915091506000806000612163898886888c6134ca565b919450925090506121748a83611e6a565b99508362ffffff168b6000015187815181106121925761219261544f565b602002602001018181525050808b6020015187815181106121b5576121b561544f565b602002602001018181525050828b6040015187815181106121d8576121d861544f565b6020026020010181815250506121f48c8562ffffff16856136c7565b8560010195505050505050612117565b5050505095945050505050565b8181018281108061222d57506001600160801b03808416908216105b156106a0576040516316692de960e01b815260040160405180910390fd5b6001600160801b038416608085901c811561227d5761227d6001600160a01b038616846001600160801b038516613714565b6001600160801b038116156122a9576122a96001600160a01b038516846001600160801b038416613714565b505050505050565b6122bb6001600355565b565b60007cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83167fffffff000000000000000000000000000000000000000000000000000000000060e884901b161761136e565b60008061231883612582565b90507fffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff831675ffffff00000000000000000000000000000000000000609883901b161761136e565b61ffff8716158015612374575061ffff8616155b8015612382575061ffff8516155b8015612390575061ffff8416155b801561239f575062ffffff8316155b80156123ad575061ffff8216155b80156123bc575062ffffff8116155b156123da576040516331375e0360e11b815260040160405180910390fd5b6123ea88888888888888886137ca565b9750600061240d60003660011981013560f090811c90910360280135901c905090565b9050600061241b8a846138ca565b905060006124298284613928565b6124338385613968565b61243d91906156c4565b905067016345785d8a0000811115612468576040516372db9c0b60e11b815260040160405180910390fd5b50505060048890556040805161ffff8981168252888116602083015287811682840152868116606083015262ffffff868116608084015290851660a0830152831660c0820152905133917fd09e5ddc721ff14c5c1e66a305cbba1fd70b82c5232bc391aad6f55e62e4b046919081900360e00190a25050505050505050565b600061271061ffff60801b608084901b1604600160801b0162ffffff8416627fffff1901612515828261398c565b95945050505050565b60008061252b8460801c90565b90506120d48161253a85613412565b612544919061556f565b6001600160801b031660801b90565b60006001600160801b0383166120d48161256c85613412565b612576919061556f565b6001600160801b031690565b600060e882901c6106a0565b60008061259a83612d2b565b6125ab9064ffffffffff16426156dc565b90506125b683612b7d565b61ffff1681106125fa576125c98361230c565b92506125d483612b8d565b61ffff1681106125ee576125e9836000613be5565b6125f7565b6125f783613152565b92505b61136e83613c53565b600081612623576126148360801c90565b6001600160801b03161561136e565b50506001600160801b03161590565b60008061263e84612d1a565b62ffffff169050600080828562ffffff1611612661578462ffffff16830361266a565b828562ffffff16035b9150612710820261267a87612d09565b62ffffff16019050600061268d87612bbe565b62ffffff1690508082116126a157816126a3565b805b91506126af87836138ca565b979650505050505050565b60008080806126ce62ffffff8716896124e7565b905060006126dd8b8915612d3e565b9050600088612708576127036126fe6001600160801b038416856080612d5e565b613cac565b612720565b6127206126fe6001600160801b038416608086612d94565b9050600061272e8c8c612dca565b905060006127456001600160801b03841683612de9565b9050612751818461554d565b9250600061275f8a8d612d3e565b9050600080856001600160801b0316836001600160801b03161061278a575084915082905085612800565b61279d6001600160801b03841686613cd6565b915060006127ab838561556f565b6001600160801b031690508e6127cf576127ca6126fe8260808c613d36565b6127de565b6127de6126fe828b6080613d60565b9150876001600160801b0316826001600160801b031611156127fe578791505b505b8d61283a57612818836001600160801b031660801b90565b6001600160801b038216612835846001600160801b031660801b90565b612862565b6001600160801b038316612857826001600160801b031660801b90565b6001600160801b0384165b809b50819c50829d50505050505050505050505096509650969350505050565b60006106a082604e1c613fff1690565b60006001600160801b0382166128aa575060006106a0565b6127106001600160801b0383168110156128d757604051631514a94960e21b815260040160405180910390fd5b6001600160801b03848116840282900490608086811c86028490049183169082901b175b9695505050505050565b60006106a08260701c620fffff1690565b60008261292d57612928600883613dce565b61136e565b61136e600883613f1a565b60008061294484612a99565b905061ffff8116612958578391505061136e565b60006129648683612b34565b905060006129718261404a565b9050600061297e83614056565b61298b9060ff16836156f3565b90508064ffffffffff1661299e42614065565b64ffffffffff161115612a3c5760008060006129db8464ffffffffff1642038a6129c78d612905565b6129d18e8e61408d565b8a939291906140bd565b92509250925060006129ec87612b07565b905064ffffffffff861642036078811115612a1c575096879006600101964295506000612a198c8a612e5b565b9b505b612a2a82868686858c614122565b97505050505050612a3c8885856141c6565b50949695505050505050565b6000612a548460801c90565b90506001600160801b03811615612a8257612a826001600160a01b038416836001600160801b038416613714565b50505050565b60006001600160801b038416612a54565b60006106a08260d81c61ffff1690565b600080612ab68484612b34565b9150612ac182612b07565b90508061ffff168361ffff1614612b0057612ae4612adf8583612b34565b612b07565b90508061ffff168361ffff1611612afb5780612afd565b825b90505b9250929050565b600061ffff82166106a0565b6000612b1e82614056565b60ff16612b2a8361404a565b6106a091906156f3565b60008161ffff8116612b595760405163944e113960e01b815260040160405180910390fd5b8361ffff60001985018116908110612b7357612b7361544f565b0154949350505050565b60006106a08260101c610fff1690565b60006106a082601c1c610fff1690565b60006106a08260281c613fff1690565b60006106a08260361c62ffffff1690565b60006106a082605c1c620fffff1690565b600080600080600080612be28989612aa9565b909250905064ffffffffff8716612c198a612bfd848c615713565b61ffff1661ffff8110612c1257612c1261544f565b0154612b13565b64ffffffffff161115612c3f57604051631c4e7f9560e21b815260040160405180910390fd5b612c4882612b13565b95508664ffffffffff168664ffffffffff1611612c8a5785612c698361420c565b612c7284614222565b612c7b85614238565b95509550955095505050612ce9565b869550600080612c9c8b8b8b8661424e565b91509150600089612cac83612b13565b612cb691906154ae565b90506000612cc384612b13565b612ccd908c6154ae565b9050612cdb8484848461439d565b919a50985096505050505050505b93509350935093565b6000612cfd8361258e565b925061136e8383612632565b60006106a08260841c620fffff1690565b60006106a08260981c62ffffff1690565b60006106a08260b01c64ffffffffff1690565b600081612d4f576129288360801c90565b6001600160801b03831661136e565b6000612d6b848484613d60565b9050600160ff83161b80612d8157612d81615482565b8385091561136e576120d46001826156c4565b6000612da1848484613d36565b90508180612db157612db1615482565b600160ff85161b85091561136e576120d46001826156c4565b600061136e612dd98484613928565b612de38585613968565b01613cac565b60008167016345785d8a0000816001600160801b03161115612e1e57604051638630bc6b60e01b815260040160405180910390fd5b6001600160801b03808416670de0b6b3a76400008190039182916000199188160282010181612e4f57612e4f615482565b049250505b5092915050565b60007fffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff83167cffff00000000000000000000000000000000000000000000000000000060d884901b161761136e565b6000612eb68484612b34565b90506000612ec382612b07565b90508261ffff168161ffff1610612eed57604051632c57574160e21b815260040160405180910390fd5b60008461ffff168261ffff1614612f1e5761ffff821615612f1757612f128683612b34565b612f20565b6000612f20565b825b90506000612f2d82612b07565b61ffff169050808661ffff1611612f445780612f4a565b8561ffff165b905061ffff83165b8561ffff16811015612f7c5781888261ffff8110612f7257612f7261544f565b0155600101612f52565b50610fef878761ffff8681168818908916176141c6565b8062ffffff81168114612fb957604051639b63641560e01b815260040160405180910390fd5b919050565b6001600160a01b03831660009081526020818152604080832085845291829052909120548281101561301b57604051625b387760e31b81526001600160a01b0386166004820152602481018590526044810184905260640161073e565b60009384526001602090815260408086208054869003905592905292209103905550565b60006001600160801b038416608085901c828083156130725761306f6126fe886001600160801b038716896144fb565b91505b6001600160801b0383161561309b576130986126fe886001600160801b038616896144fb565b90505b608081901b6001600160801b0383161798975050505050505050565b61ffff600882901c166000818152600284016020526040812054909190600160ff85161b19811680821461314657600083815260028701602052604090208190558061313a57600883901c600081815260018089016020526040909120805460ff87169290921b1982169055925082613138578654600160ff83161b191687555b505b600193505050506106a0565b50600095945050505050565b60008061315e83612905565b62ffffff169050600061317084612b9d565b61ffff169050612710828202046125158582613be5565b826001600160a01b03811615806131a657506001600160a01b03811630145b156131c4576040516345c210e760e11b815260040160405180910390fd5b826001600160a01b0316846001600160a01b031614156132025760405163782ee70760e01b81526001600160a01b038516600482015260240161073e565b6001600160a01b03848116600081815260026020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b600081612d4f576129288360801b90565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fd90c2be6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330691906156ab565b90506001600160801b0383811690608085901c90670de0b6b3a763ffff9061333f90670de0b6b3a7640000908616850283015b04613cac565b9250613371670de0b6b3a764000082866001600160801b0316856001600160801b031602018161333957613339615482565b915050608081901b6001600160801b03831617612515565b60006001600160801b0383811690608085811c9185169085901c818410806126af5750806001600160801b0316836001600160801b03161094505050505092915050565b600061271061ffff60801b608084901b1604600160801b01816133ef8261451b565b6133f88661451b565b6134029190615734565b9050612515816280000001612f93565b6040516370a0823160e01b81523060048201526000906106a0906001600160a01b038416906370a0823190602401602060405180830381865afa15801561345d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fe91906156ab565b600080600080600061349287614626565b670de0b6b3a764000060808a811c90930281900490921b6001600160801b03998a169093029190910490971617979596505050505050565b62ffffff831660008181526007602052604081205490918291829182906134f1908b6124e7565b905060006135108962ffffff1660009081526001602052604090205490565b905061351e838984846146c9565b909650945084935062ffffff898116908b16141561364857613540878a612cf2565b9650600061355284898e89868c6147ef565b905080156136425760006135708461356a8985611e6a565b906148e1565b9050600061357e86866148e1565b905061358b8285836144fb565b985060006135a661359b8c612882565b859061ffff16612892565b905080156135cc576135b88882611e6a565b6006549098506135c89082612211565b6006555b6135d8600b8c8f612938565b9a508a600481905550336001600160a01b03167f3f0b46725027bb418b2005f4683538eccdbcdf1de2b8649a29dbd9c507d16ff48e86846040516136369392919062ffffff9390931683526020830191909152604082015260600190565b60405180910390a25050505b50613653565b613653858b8b6148fd565b85158061365e575083155b1561368357604051634c98d35760e11b815262ffffff8a16600482015260240161073e565b806136955761369360088a614968565b505b61369f8385612211565b62ffffff90991660009081526007602052604090209890985550929891975095509350505050565b600082815260016020526040812080548392906136e59084906156c4565b90915550506001600160a01b039092166000908152602081815260408083209383529290522080549091019055565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092019092526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b17905290600090613781908616836149f2565b9050600081511180156137a55750808060200190518101906137a39190615762565b155b156137c35760405163197138bd60e11b815260040160405180910390fd5b5050505050565b60008561ffff168761ffff1611806137e75750610fff8661ffff16115b806137f757506127108561ffff16115b8061380757506109c48361ffff16115b806138195750620fffff8262ffffff16115b1561383757604051631c07203f60e01b815260040160405180910390fd5b5060109590951b630fff00001661ffff9690961695909517601c9390931b64fff0000000169290921760289190911b663fff0000000000161760369190911b693fffffc00000000000001617604e9290921b6b0fffc00000000000000000001691909117605c9190911b6dfffff0000000000000000000000016176dffffffffffffffffffffffffffff19919091161790565b6000620fffff8262ffffff1611156138f557604051631c07203f60e01b815260040160405180910390fd5b700fffff0000000000000000000000000000198316700fffff0000000000000000000000000000607084901b161761136e565b60008061393484612bad565b62ffffff1690508015612e545760008361ffff1661395186612905565b62ffffff1602905060646063828002840201612e4f565b60008161ffff1661397884612b07565b61ffff16026402540be40002905092915050565b60008080836139a45750600160801b91506106a09050565b508260008112156139b6579015906000035b62100000811015613ba657600160801b9250846001600160801b038111156139e057911591600019045b60018216156139f15792830260801c925b800260801c6002821615613a075792830260801c925b800260801c6004821615613a1d5792830260801c925b800260801c6008821615613a335792830260801c925b800260801c6010821615613a495792830260801c925b800260801c6020821615613a5f5792830260801c925b800260801c6040821615613a755792830260801c925b8002608090811c90821615613a8c5792830260801c925b800260801c610100821615613aa35792830260801c925b800260801c610200821615613aba5792830260801c925b800260801c610400821615613ad15792830260801c925b800260801c610800821615613ae85792830260801c925b800260801c611000821615613aff5792830260801c925b800260801c612000821615613b165792830260801c925b800260801c614000821615613b2d5792830260801c925b800260801c618000821615613b445792830260801c925b800260801c62010000821615613b5c5792830260801c925b800260801c62020000821615613b745792830260801c925b800260801c62040000821615613b8c5792830260801c925b800260801c62080000821615613ba45792830260801c925b505b82613bce57604051631dba598d60e11b8152600481018690526024810185905260440161073e565b81613bd95782612515565b6125158360001961577f565b6000620fffff8262ffffff161115613c1057604051631c07203f60e01b815260040160405180910390fd5b7fffffffffffffffffffffffffff00000fffffffffffffffffffffffffffffffff831672fffff000000000000000000000000000000000608484901b161761136e565b600080613c5f42614065565b90507fffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff83167affffffffff0000000000000000000000000000000000000000000060b083901b161761136e565b806001600160801b0381168114612fb957604051632f45db3d60e21b815260040160405180910390fd5b60008167016345785d8a0000816001600160801b03161115613d0b57604051638630bc6b60e01b815260040160405180910390fd5b670de0b6b3a7640000670de0b6b3a763ffff6001600160801b03868116908616020104949350505050565b600060ff831684811b9061ffff6101008290031686901c906128fb9087906001901b868585614abd565b6000806000613d6f8686614b66565b9150915081600014613d85578360ff1682901c92505b8015613dc557600160ff85161b8110613db157604051638e471a8960e01b815260040160405180910390fd5b8360ff166101000361ffff1681901b830192505b50509392505050565b60008061ffff600884901c1660ff808516908114613e235760008281526002870160205260408120549350613e038483614b85565b90506000198114613e215760089290921b90911792506106a0915050565b505b5060ff80821690600883901c908214613e9d5760008181526001880160205260408120549450613e538584614b85565b90506000198114613e9b57600882901b8117600081815260028a01602052604090205495509350613e8385614b94565b60ff1660088560001c901b17955050505050506106a0565b505b60ff81811692508214613f0d57865493506000613eba8584614b85565b90506000198114613f0b5760008181526001890160205260409020549450905080613ee485614b94565b60ff16600883901b17600081815260028a01602052604090205495509350613e8385614b94565b505b5060009695505050505050565b60008061ffff600884901c1660ff84168015613f6d5760008281526002870160205260408120549350613f4d8483614c30565b90506000198114613f6b5760089290921b90911792506106a0915050565b505b5060ff8116600882901c8115613fcc5760008181526001880160205260408120549450613f9a8584614c30565b90506000198114613fca57600882901b8117600081815260028a01602052604090205495509350613e8385614c40565b505b60ff81169150811561403b57865493506000613fe88584614c30565b90506000198114614039576000818152600189016020526040902054945090508061401285614c40565b60ff16600883901b17600081815260028a01602052604090205495509350613e8385614c40565b505b5062ffffff9695505050505050565b600060d882901c6106a0565b60006106a08260d01c60ff1690565b8064ffffffffff81168114612fb9576040516350dbfc8760e11b815260040160405180910390fd5b60008061409984612582565b90508062ffffff168362ffffff16116140b4578281036120d4565b90910392915050565b64ffffffffff841662ffffff8481168202918482168102918416026140e18861420c565b6140eb9084615504565b92506140f688614222565b6141009083615504565b915061410b88614238565b6141159082615504565b9050955095509592505050565b60d082901b7aff000000000000000000000000000000000000000000000000000016609084901b79ffffffffffffffff00000000000000000000000000000000000016605086901b71ffffffffffffffff0000000000000000000016601088901b69ffffffffffffffff00001661ffff8a161717171760d882901b7fffffffffff0000000000000000000000000000000000000000000000000000001681176126af565b8161ffff81166141e95760405163944e113960e01b815260040160405180910390fd5b818461ffff600019860181169081106142045761420461544f565b015550505050565b60006106a08260101c67ffffffffffffffff1690565b60006106a08260501c67ffffffffffffffff1690565b60006106a08260901c67ffffffffffffffff1690565b600080808061425e600186615793565b61ffff16905060008060008961ffff1690505b83851161431c576000600161428686886156c4565b901c9050888183089a508b61ffff808d169081106142a6576142a661544f565b015493506142b384612b13565b92508964ffffffffff168364ffffffffff1611156142dd576142d66001826156dc565b9450614316565b8964ffffffffff168364ffffffffff161015614305576142fe8160016156c4565b9550614316565b838497509750505050505050614394565b50614271565b8164ffffffffff168964ffffffffff16101561436a5761ffff8a1661433f578799505b8a61ffff6000198c0181169081106143595761435961544f565b015483965096505050505050614394565b8760018b089950828b61ffff808d169081106143885761438861544f565b01549650965050505050505b94509492505050565b6000806000806143ac8861420c565b67ffffffffffffffff16905060006143c389614222565b67ffffffffffffffff16905060006143da8a614238565b67ffffffffffffffff16905064ffffffffff87166143fe57919450925090506144f1565b60006144098a61420c565b67ffffffffffffffff16905060006144208b614222565b67ffffffffffffffff16905060006144378c614238565b67ffffffffffffffff16905064ffffffffff8b1661445f57919750955093506144f192505050565b600061447564ffffffffff808d16908e166156c4565b9050808b64ffffffffff1685028d64ffffffffff168902018161449a5761449a615482565b049950808b64ffffffffff1684028d64ffffffffff16880201816144c0576144c0615482565b049850808b64ffffffffff1683028d64ffffffffff16870201816144e6576144e6615482565b049750505050505050505b9450945094915050565b600080600061450a8686614b66565b915091506128fb8686868585614abd565b6000816001141561452f5750607f19919050565b8161454d5760405163125946cf60e11b815260040160405180910390fd5b60019190911c9060006f80000000000000000000000000000000831061457557506001614590565b5060001982600160fe1b8161458c5761458c615482565b0492505b600061459f607f85901c614c40565b707f80000000000000000000000000000000607f82901b16935060ff16905083811c6f80000000000000000000000000000000811461461b576f400000000000000000000000000000005b600081131561461957908002607f1c90600160801b8210614611579384019360019190911c905b60011d6145ea565b505b50500260011b919050565b6000808061463e8460581c67ffffffffffffffff1690565b92506146548460181c67ffffffffffffffff1690565b91505062ffffff831672ffffffffffffffffffffffffffffffffffffff84118061468f5750670de0b6b3a76400008367ffffffffffffffff16115b806146ab5750670de0b6b3a76400008267ffffffffffffffff16115b1561114f57604051637752557f60e11b815260040160405180910390fd5b6000806001600160801b038516608086901c826146e7838389614cdb565b90508515806146f4575080155b15614706579350869250614394915050565b60006147128a896148e1565b90508061472757509350869250614394915050565b6147328288836144fb565b9550600061474187838a614d46565b9050808311156147e057600061475782856156dc565b9050600160801b811061479857608081901c8581116147765780614778565b855b905061478481876156dc565b9550614794608082901b836156dc565b9150505b8981106147cc5760006147ab8b8361577f565b90508681116147ba57806147bc565b865b90506147c881886156dc565b9650505b608085901b6001600160801b038716179a50505b50949997985050505050505050565b6000816147fe575060006128fb565b6001600160801b038416608085901c6000806148306106c86148208d8b612211565b8861482b818c6156c4565b61303f565b91509150836001600160801b0316826001600160801b0316111561489357600061487661485d8c8c612dca565b614867848761556f565b6001600160801b031690614d63565b905061488b816001600160801b031660801b90565b9550506148d3565b826001600160801b0316816001600160801b031611156148d35760006148c66148bc8c8c612dca565b614867858861556f565b6001600160801b03169550505b505050509695505050505050565b60006001600160801b038316608084901c612515828286614cdb565b8162ffffff168162ffffff161080156149195750608083901b15155b8061493e57508162ffffff168162ffffff1611801561493e57506001600160801b0383115b156149635760405163227bd87160e21b815262ffffff8216600482015260240161073e565b505050565b61ffff600882901c166000818152600284016020526040812054909190600160ff85161b811780821461314657600083815260028701602052604090208190558161313a57600883901c600081815260018089016020526040909120805460ff87169290921b82179055925082613138578654600160ff83161b17875550600193505050506106a0565b6060600080846001600160a01b031684604051614a0f919061568f565b6000604051808303816000865af19150503d8060008114614a4c576040519150601f19603f3d011682016040523d82523d6000602084013e614a51565b606091505b50915091508115614a96578051158015614a7357506001600160a01b0385163b155b15614a9157604051633b99915360e21b815260040160405180910390fd5b6120d4565b8051614ab5576040516373483fab60e11b815260040160405180910390fd5b805181602001fd5b600081614adb57838381614ad357614ad3615482565b049050612515565b838210614afb576040516313eae71560e01b815260040160405180910390fd5b600084868809600186198101871660008190038190049091018683119095039490940294038390049390931760029290940460038102831880820284030280820284030280820284030280820284030280820284030290810290920390910292909202949350505050565b6000806000198385098385029250828110838203039150509250929050565b600061136e8360018401614dcd565b60008160801b8015614ba857608091508092505b8260401b90508015614bbb579150604001815b8260201b90508015614bce579150602001815b8260101b90508015614be1579150601001815b8260081b90508015614bf4579150600801815b8260041b90508015614c07579150600401815b8260021b90508015614c1a579150600201815b508160011b15614c28576001015b60ff03919050565b600061136e836000198401614dfb565b60006001600160801b03821115614c595750608090811c905b67ffffffffffffffff821115614c7157604091821c91015b63ffffffff821115614c8557602091821c91015b61ffff821115614c9757601091821c91015b60ff821115614ca857600891821c91015b600f821115614cb957600491821c91015b6003821115614cca57600291821c91015b6001821115612fb957600101919050565b60008315614d16575080830281848281614cf757614cf7615482565b0414614d16576040516363f1e01f60e01b815260040160405180910390fd5b821561136e5760809290921b9182018281101561136e576040516363f1e01f60e01b815260040160405180910390fd5b6000614d538484846144fb565b90508180612d8157612d81615482565b60008167016345785d8a0000816001600160801b03161115614d9857604051638630bc6b60e01b815260040160405180910390fd5b6ec097ce7bc90715b34b9f1000000000806001600160801b03868116908616908102670de0b6b3a76400009190910102612e4f565b60ff81169190911c9060008215614df15781614de884614b94565b0160ff1661136e565b5060001992915050565b60ff8181031691821b916000908315614e215780614e1885614c40565b60ff16036120d4565b506000199392505050565b6001600160a01b0381168114614e4157600080fd5b50565b60008060408385031215614e5757600080fd5b8235614e6281614e2c565b946020939093013593505050565b60005b83811015614e8b578181015183820152602001614e73565b83811115612a825750506000910152565b6020815260008251806020840152614ebb816040850160208701614e70565b601f01601f19169190910160400192915050565b803562ffffff81168114612fb957600080fd5b600060208284031215614ef457600080fd5b61136e82614ecf565b60008083601f840112614f0f57600080fd5b50813567ffffffffffffffff811115614f2757600080fd5b6020830191508360208260051b8501011115612b0057600080fd5b60008060008060008060808789031215614f5b57600080fd5b8635614f6681614e2c565b95506020870135614f7681614e2c565b9450604087013567ffffffffffffffff80821115614f9357600080fd5b614f9f8a838b01614efd565b90965094506060890135915080821115614fb857600080fd5b50614fc589828a01614efd565b979a9699509497509295939492505050565b60008060008060608587031215614fed57600080fd5b8435614ff881614e2c565b9350602085013567ffffffffffffffff81111561501457600080fd5b61502087828801614efd565b909450925050604085013561503481614e2c565b939692955090935050565b600081518084526020808501945080840160005b8381101561506f57815187529582019590820190600101615053565b509495945050505050565b838152826020820152606060408201526000612515606083018461503f565b803561ffff81168114612fb957600080fd5b600080600080600080600080610100898b0312156150c857600080fd5b6150d189615099565b97506150df60208a01615099565b96506150ed60408a01615099565b95506150fb60608a01615099565b945061510960808a01614ecf565b935061511760a08a01615099565b925061512560c08a01614ecf565b915061513360e08a01614ecf565b90509295985092959890939650565b6000806000806040858703121561515857600080fd5b843567ffffffffffffffff8082111561517057600080fd5b61517c88838901614efd565b9096509450602087013591508082111561519557600080fd5b506151a287828801614efd565b95989497509550505050565b60208152600061136e602083018461503f565b8015158114614e4157600080fd5b600080604083850312156151e257600080fd5b82356151ed816151c1565b915060208301356151fd81614e2c565b809150509250929050565b600080600080600080600060e0888a03121561522357600080fd5b61522c88615099565b965061523a60208901615099565b955061524860408901615099565b945061525660608901615099565b935061526460808901614ecf565b925061527260a08901615099565b915061528060c08901614ecf565b905092959891949750929550565b6000602082840312156152a057600080fd5b813564ffffffffff8116811461136e57600080fd5b600080604083850312156152c857600080fd5b82356152d3816151c1565b9150612afd60208401614ecf565b600080604083850312156152f457600080fd5b82356001600160801b038116811461530b57600080fd5b915060208301356151fd816151c1565b60006020828403121561532d57600080fd5b5035919050565b60006020828403121561534657600080fd5b61136e82615099565b6000806040838503121561536257600080fd5b823561530b81614e2c565b6000806040838503121561538057600080fd5b82356151ed81614e2c565b600080600080606085870312156153a157600080fd5b84356153ac81614e2c565b935060208501359250604085013567ffffffffffffffff808211156153d057600080fd5b818701915087601f8301126153e457600080fd5b8135818111156153f357600080fd5b88602082850101111561540557600080fd5b95989497505060200194505050565b634e487b7160e01b600052604160045260246000fd5b60408152600061543d604083018561503f565b8281036020840152612515818561503f565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561547757600080fd5b813561136e81614e2c565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600064ffffffffff838116908316818110156154cc576154cc615498565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156154fb576154fb615498565b02949350505050565b600067ffffffffffffffff80831681851680830382111561552757615527615498565b01949350505050565b60006020828403121561554257600080fd5b815161136e81614e2c565b60006001600160801b0380831681851680830382111561552757615527615498565b60006001600160801b03838116908316818110156154cc576154cc615498565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156155c157600080fd5b8260051b8083602087013760009401602001938452509192915050565b6040815260006155f260408301868861558f565b82810360208401526126af81858761558f565b60408152600061561960408301858761558f565b82810360208401526128fb818561503f565b60006001600160a01b03808a168352808916602084015280881660408401525085606083015284608083015260c060a08301528260c0830152828460e0840137600060e0848401015260e0601f19601f850116830101905098975050505050505050565b600082516156a1818460208701614e70565b9190910192915050565b6000602082840312156156bd57600080fd5b5051919050565b600082198211156156d7576156d7615498565b500190565b6000828210156156ee576156ee615498565b500390565b600064ffffffffff80831681851680830382111561552757615527615498565b600061ffff8084168061572857615728615482565b92169190910692915050565b60008261574357615743615482565b600160ff1b82146000198414161561575d5761575d615498565b500590565b60006020828403121561577457600080fd5b815161136e816151c1565b60008261578e5761578e615482565b500490565b600061ffff838116908316818110156154cc576154cc61549856fea26469706673582212205adcacc1d216d119797176c20bff4d077411de5b9bc12719a34da1f62ddaef0764736f6c634300080a00330000000000000000000000008e42f2f4101563bf679975178e880fd87d3efd4e