@muffinfi/muffin-contracts
Version:
Smart contracts of Muffin Protocol
835 lines • 108 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "Lens",
"sourceName": "contracts/periphery/lens/Lens.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_manager",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "InvalidAmount",
"type": "error"
},
{
"inputs": [],
"name": "InvalidSwapPath",
"type": "error"
},
{
"inputs": [],
"name": "InvalidTierChoices",
"type": "error"
},
{
"inputs": [],
"name": "NotEnoughIntermediateOutput",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getDerivedPosition",
"outputs": [
{
"components": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"internalType": "int24",
"name": "tickLower",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickUpper",
"type": "int24"
}
],
"internalType": "struct IPositionLens.PositionInfo",
"name": "info",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint96",
"name": "liquidityD8",
"type": "uint96"
},
{
"internalType": "uint80",
"name": "feeGrowthInside0Last",
"type": "uint80"
},
{
"internalType": "uint80",
"name": "feeGrowthInside1Last",
"type": "uint80"
},
{
"internalType": "uint8",
"name": "limitOrderType",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "settlementSnapshotId",
"type": "uint32"
}
],
"internalType": "struct Positions.Position",
"name": "position",
"type": "tuple"
},
{
"internalType": "bool",
"name": "settled",
"type": "bool"
},
{
"internalType": "uint256",
"name": "amount0",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "feeAmount0",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "feeAmount1",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"components": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"internalType": "int24",
"name": "tickLower",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickUpper",
"type": "int24"
}
],
"internalType": "struct IPositionLens.PositionInfo",
"name": "info",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint96",
"name": "liquidityD8",
"type": "uint96"
},
{
"internalType": "uint80",
"name": "feeGrowthInside0Last",
"type": "uint80"
},
{
"internalType": "uint80",
"name": "feeGrowthInside1Last",
"type": "uint80"
},
{
"internalType": "uint8",
"name": "limitOrderType",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "settlementSnapshotId",
"type": "uint32"
}
],
"internalType": "struct Positions.Position",
"name": "position",
"type": "tuple"
}
],
"name": "getFeeAmounts",
"outputs": [
{
"internalType": "uint256",
"name": "feeAmount0",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "feeAmount1",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
}
],
"name": "getPoolId",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getPosition",
"outputs": [
{
"components": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"internalType": "int24",
"name": "tickLower",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickUpper",
"type": "int24"
}
],
"internalType": "struct IPositionLens.PositionInfo",
"name": "info",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint96",
"name": "liquidityD8",
"type": "uint96"
},
{
"internalType": "uint80",
"name": "feeGrowthInside0Last",
"type": "uint80"
},
{
"internalType": "uint80",
"name": "feeGrowthInside1Last",
"type": "uint80"
},
{
"internalType": "uint8",
"name": "limitOrderType",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "settlementSnapshotId",
"type": "uint32"
}
],
"internalType": "struct Positions.Position",
"name": "position",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "poolId",
"type": "bytes32"
},
{
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"internalType": "int24",
"name": "tickStart",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickEnd",
"type": "int24"
},
{
"internalType": "uint24",
"name": "maxCount",
"type": "uint24"
}
],
"name": "getTicks",
"outputs": [
{
"internalType": "uint256",
"name": "count",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "ticks",
"type": "bytes"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"internalType": "int24",
"name": "tickLower",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickUpper",
"type": "int24"
}
],
"internalType": "struct IPositionLens.PositionInfo",
"name": "info",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint96",
"name": "liquidityD8",
"type": "uint96"
},
{
"internalType": "uint80",
"name": "feeGrowthInside0Last",
"type": "uint80"
},
{
"internalType": "uint80",
"name": "feeGrowthInside1Last",
"type": "uint80"
},
{
"internalType": "uint8",
"name": "limitOrderType",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "settlementSnapshotId",
"type": "uint32"
}
],
"internalType": "struct Positions.Position",
"name": "position",
"type": "tuple"
},
{
"internalType": "bool",
"name": "settled",
"type": "bool"
}
],
"name": "getUnderlyingAmounts",
"outputs": [
{
"internalType": "uint256",
"name": "amount0",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount1",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "hub",
"outputs": [
{
"internalType": "contract IMuffinHubCombined",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "uint8",
"name": "tierId",
"type": "uint8"
},
{
"internalType": "int24",
"name": "tickLower",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickUpper",
"type": "int24"
}
],
"internalType": "struct IPositionLens.PositionInfo",
"name": "info",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint96",
"name": "liquidityD8",
"type": "uint96"
},
{
"internalType": "uint80",
"name": "feeGrowthInside0Last",
"type": "uint80"
},
{
"internalType": "uint80",
"name": "feeGrowthInside1Last",
"type": "uint80"
},
{
"internalType": "uint8",
"name": "limitOrderType",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "settlementSnapshotId",
"type": "uint32"
}
],
"internalType": "struct Positions.Position",
"name": "position",
"type": "tuple"
}
],
"name": "isSettled",
"outputs": [
{
"internalType": "bool",
"name": "settled",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "manager",
"outputs": [
{
"internalType": "contract IPositionManager",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"name": "muffinSwapCallback",
"outputs": [],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "path",
"type": "bytes"
},
{
"internalType": "int256",
"name": "amountDesired",
"type": "int256"
}
],
"name": "quote",
"outputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasUsed",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenIn",
"type": "address"
},
{
"internalType": "address",
"name": "tokenOut",
"type": "address"
},
{
"internalType": "uint256",
"name": "tierChoices",
"type": "uint256"
},
{
"internalType": "int256",
"name": "amountDesired",
"type": "int256"
}
],
"name": "quoteSingle",
"outputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gasUsed",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "path",
"type": "bytes"
},
{
"internalType": "int256",
"name": "amountDesired",
"type": "int256"
}
],
"name": "simulate",
"outputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeeAmt",
"type": "uint256"
},
{
"internalType": "uint256[]",
"name": "tierAmountsIn",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "tierAmountsOut",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "tierData",
"type": "uint256[]"
}
],
"internalType": "struct IQuoter.Hop[]",
"name": "hops",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "tokenIn",
"type": "address"
},
{
"internalType": "address",
"name": "tokenOut",
"type": "address"
},
{
"internalType": "uint256",
"name": "tierChoices",
"type": "uint256"
},
{
"internalType": "int256",
"name": "amountDesired",
"type": "int256"
}
],
"name": "simulateSingle",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "protocolFeeAmt",
"type": "uint256"
},
{
"internalType": "uint256[]",
"name": "tierAmountsIn",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "tierAmountsOut",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "tierData",
"type": "uint256[]"
}
],
"internalType": "struct IQuoter.Hop",
"name": "hop",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
}
],
"bytecode": "0x60c06040523480156200001157600080fd5b5060405162005684380380620056848339810160408190526200003491620000c9565b80806001600160a01b03166080816001600160a01b031681525050806001600160a01b031663365a86fc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200008e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b49190620000c9565b6001600160a01b031660a05250620000fb9050565b600060208284031215620000dc57600080fd5b81516001600160a01b0381168114620000f457600080fd5b9392505050565b60805160a0516155086200017c60003960008181610148015281816102f10152818161050e01528181610c1f01528181610e91015281816111990152818161130501528181611ab801528181611c3601528181611dd701528181611f270152612eb90152600081816101de01528181610f3701526110a301526155086000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806392d31cd41161008c578063eb02c30111610066578063eb02c3011461026c578063f0b69f5e1461028d578063f1371dd5146102b0578063f87e29e7146102c557600080fd5b806392d31cd414610226578063a7aa8dd914610239578063d8e9acb71461025957600080fd5b80633d04e039116100c85780633d04e0391461018f57806343ba86f9146101b7578063481c6a75146101d9578063897f1c4d1461020057600080fd5b80630d751724146100ef5780632ef61c2114610122578063365a86fc14610143575b600080fd5b6101026100fd366004614292565b6102e6565b604080519384526020840192909252908201526060015b60405180910390f35b610135610130366004614300565b610490565b604051908152602001610119565b61016a7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610119565b6101a261019d36600461459b565b6104e0565b60408051928352602083019190915201610119565b6101ca6101c5366004614292565b6106a8565b60405161011993929190614690565b61016a7f000000000000000000000000000000000000000000000000000000000000000081565b61021361020e36600461471f565b610b53565b6040516101199796959493929190614738565b610102610234366004614827565b610bff565b61024c610247366004614827565b610d57565b604051610119919061486d565b6101a2610267366004614880565b610e89565b61027f61027a36600461471f565b611017565b6040516101199291906148bf565b6102a061029b366004614985565b611173565b6040519015158152602001610119565b6102c36102be3660046149bb565b6112ad565b005b6102d86102d3366004614a48565b6112c1565b604051610119929190614b2a565b6000806000805a90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c6883ec56040518060c001604052808a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083018b90523060408085019190915260608401839052608084018390528051928352908201815260a090920152517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526103d59190600401614b43565b60408051808303816000875af192505050801561042d575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261042a91810190614bd8565b60015b610483573d80801561045b576040519150601f19603f3d011682016040523d82523d6000602084013e610460565b606091505b505a61046c9083614c2b565b92506104778161153c565b90955093506104869050565b50505b5093509350939050565b6040805173ffffffffffffffffffffffffffffffffffffffff80851660208301528316918101919091526000906060015b6040516020818303038152906040528051906020012090505b92915050565b60008060006104f2866080015161156e565b905060006105038760a0015161156e565b90506000856105e9577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dc65746561055a8a602001518b60400151610490565b60608b01516040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168152600481019290925260ff16602482015260440161010060405180830381865afa1580156105bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e09190614d4a565b60200151610600565b606087015160ff166001146105fe5782610600565b815b87519091505b6bffffffffffffffffffffffff81161561069c5760006b7fffffffffffffffffffffff6bffffffffffffffffffffffff8316116106455781600061065c565b6b7fffffffffffffffffffffff61065c8184614d67565b9250905060008061067785888861067287614d94565b6118c6565b9092509050610686828a614dd3565b98506106928189614dd3565b9750505050610606565b50505050935093915050565b60008060606106ec86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b292505050565b15610723576040517f3378279300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008085139050600061076b88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119fc92505050565b67ffffffffffffffff81111561078357610783614339565b6040519080825280602002602001820160405280156107ac578160200160208202803683370190505b509050805167ffffffffffffffff8111156107c9576107c9614339565b60405190808252806020026020018201604052801561083357816020015b6108206040518060c001604052806000815260200160008152602001600081526020016060815260200160608152602001606081525090565b8152602001906001900390816107e75790505b5092508560005b8251811015610abd57600080600061088d84888f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929493925050611a049050565b9250925092508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161061090e576040805173ffffffffffffffffffffffffffffffffffffffff808516602083015285169181019190915260600160405160208183030381529060405280519060200120610952565b6040805173ffffffffffffffffffffffffffffffffffffffff8086166020830152841691810191909152606001604051602081830303815290604052805190602001205b86858151811061096457610964614deb565b6020026020010181815250506109e486858151811061098557610985614deb565b60200260200101518373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161015156000881315151489806109cf575086155b6109dc57606488036109de565b875b84611a43565b8885815181106109f6576109f6614deb565b6020026020010181905250600080898681518110610a1657610a16614deb565b6020026020010151600001518a8781518110610a3457610a34614deb565b602002602001015160200151915091508815610a5b5785610a5357819b505b809650610aac565b85610a6857809a50610aa5565b86600003811015610aa5576040517f4b5f1a1e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160000396505b50506001909301925061083a915050565b508215610acc57809450610ad3565b8060000395505b50610add8161210d565b15610b48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f504f4f4c5f524550454154454400000000000000000000000000000000000000604482015260640160405180910390fd5b505093509350939050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526000806000806000610bc188611017565b9097509550610bd08787611173565b9450610bdd8787876104e0565b9094509250610bed888888610e89565b97999698509496939592949392915050565b6000806000805a905073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632ec31fbc8989898930600080806040519080825280601f01601f191660200182016040528015610c77576020820181803683370190505b506040518963ffffffff1660e01b8152600401610c9b989796959493929190614e1a565b60408051808303816000875af1925050508015610cf3575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610cf091810190614bd8565b60015b610d49573d808015610d21576040519150601f19603f3d011682016040523d82523d6000602084013e610d26565b606091505b505a610d329083614c2b565b9250610d3d8161153c565b9095509350610d4c9050565b50505b509450945094915050565b610d906040518060c001604052806000815260200160008152602001600081526020016060815260200160608152602001606081525090565b60008473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1610610e0d576040805173ffffffffffffffffffffffffffffffffffffffff808816602083015288169181019190915260600160405160208183030381529060405280519060200120610e51565b6040805173ffffffffffffffffffffffffffffffffffffffff8089166020830152871691810191909152606001604051602081830303815290604052805190602001205b9050610e7f816000851373ffffffffffffffffffffffffffffffffffffffff808916908a1610148587611a43565b9695505050505050565b6000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166343751ee0610edd88602001518960400151610490565b606089015160808a015160a08b01516040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152600481019490945273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024850152604484018d905260ff9092166064840152600290810b60848401520b60a482015260c4016040805180830381865afa158015610f9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc09190614e83565b60208701805188516040909901805169ffffffffffffffffffff8087169094528385169091526bffffffffffffffffffffffff909916930381168302603890811c9b9890920316909102901c965093945050505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040517feb02c301000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063eb02c3019060240161016060405180830381865afa158015611100573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111249190614ebd565b600291820b60a08a015291900b608088015260ff909116606087015273ffffffffffffffffffffffffffffffffffffffff91821660408701529181166020860152919091168352919391925050565b606081015160009060ff16156104da576000600160ff16836060015160ff1614905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663555ed4ad6111e587602001518860400151610490565b8760600151856111f95788608001516111ff565b8860a001515b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152600481019390935260ff909116602483015260020b60448201528415156064820152608401606060405180830381865afa15801561126d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112919190614fe6565b608087015163ffffffff91821691161094505050505092915050565b604051846000820152836020820152604081fd5b6000606081806112d1878761502f565b60020b12159050856112e161417a565b60006112ed8b8b61217b565b90505b8662ffffff168260600151101561151b5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631ca0027a6113498487612219565b6040518263ffffffff1660e01b815260040161136791815260200190565b602060405180830381865afa158015611384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a89190615093565b60608481015191925082919082901c9060c083901c9060d884901c9060f085901c9060f886901c901580156113e957506bffffffffffffffffffffffff8616155b801561140157506bffffffffffffffffffffffff8516155b15611412575050505050505061151b565b60405160e88b901b60208201527fffffffffffffffffffffffff000000000000000000000000000000000000000060a088811b8216602384015287901b16602f8201527fff0000000000000000000000000000000000000000000000000000000000000060f884811b8216603b84015283901b16603c8201526114b190603d016040516020818303038152906040526114aa906150ac565b8a90612238565b60008b6114be57846114c0565b835b90508060020b8b60020b14156114dd57505050505050505061151b565b8b6114f0578f60020b8160020b126114fa565b8f60020b8160020b135b1561150c57505050505050505061151b565b99506112f09650505050505050565b61152482612326565b5080516060909101519a909950975050505050505050565b600080825160401415611566578280602001905181019061155d9190614bd8565b91509150915091565b825183602001fd5b6000600282900b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff42755138015906115ab5750620bd8ab600283900b13155b6115b457600080fd5b6000808360020b126115c657826115cb565b826000035b62ffffff811691507001000000000000000000000000000000009060011615611604576ffffcb933bd6fad37aa2d162d1a5940010260801c5b6002821615611623576ffff97272373d413259a46990580e213a0260801c5b6004821615611642576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611661576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611680576fffcb9843d60f6159c9db58835c9266440260801c5b602082161561169f576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156116be576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156116dd576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156116fd576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b61020082161561171d576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561173d576ff3392b0822b70005940c7a398e4b70f30260801c5b61080082161561175d576fe7159475a2c29b7443b29c7fa6e889d90260801c5b61100082161561177d576fd097f3bdfd2022b8845ad8f792aa58250260801c5b61200082161561179d576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156117bd576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156117dd576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156117fe576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561181e576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561183d576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561185a576b048a170391f7dc42444e8fa20260801c5b60008460020b1261189857807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81611894576118946150f1565b0490505b60006701000000000000008206116118b15760006118b4565b60015b60ff16603882901c0192505050919050565b600080846fffffffffffffffffffffffffffffffff16866fffffffffffffffffffffffffffffffff161061192b57836fffffffffffffffffffffffffffffffff16866fffffffffffffffffffffffffffffffff1611611925578561192d565b8361192d565b845b955060006008600085600b0b1215611948578460000361194a565b845b6bffffffffffffffffffffffff16901b90506000600b85900b12611987576119738588836123e8565b92506119808688836124ee565b91506119a8565b6119928786836123e8565b60000392506119a28787836124ee565b60000391505b5094509492505050565b805160009061161410806119c857506014825111155b806104da5750505160167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec90910106151590565b516016900490565b6000808060168502611a198782016014015190565b878201602a810151601690910151919550935061ffff169150846104865750909591945092509050565b611a7c6040518060c001604052806000815260200160008152602001600081526020016060815260200160608152602001606081525090565b6060611a866141a8565b6040517f7951532d000000000000000000000000000000000000000000000000000000008152600481018890526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690637951532d90602401602060405180830381865afa158015611b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b389190615093565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001821b0195861695909150861580611b9157507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87145b15611bc8576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85611bff576040517fd2a0a82900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80861415611cdf576040517f35d603f5000000000000000000000000000000000000000000000000000000008152600481018a90527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906335d603f590602401600060405180830381865afa158015611c92573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611cd89190810190615120565b9350611e80565b8167ffffffffffffffff811115611cf857611cf8614339565b604051908082528060200260200182016040528015611d8557816020015b604080516101008101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181611d165790505b50935060005b8451811015611e7e576001811b871615611e76576040517fdc657465000000000000000000000000000000000000000000000000000000008152600481018b905260ff821660248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063dc6574659060440161010060405180830381865afa158015611e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e589190614d4a565b858281518110611e6a57611e6a614deb565b60200260200101819052505b600101611d8b565b505b5050604080516101008101825260008088138915158114835260208301529181018290526060810182905283516080820190611ec19060019081901b614c2b565b87168152604080518082018252627fffff8152600060208281019190915283015201611eeb6125a9565b815260006020909101526040517faa5976c1000000000000000000000000000000000000000000000000000000008152600481018a90529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063aa5976c1906024016040805180830381865afa158015611f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa691906151d4565b60ff16604083015250856000805b60008913611fcd57611fc8868b8b8b6125b4565b611fd9565b611fd9868b8b8b612864565b60c085015260005b86518110156120515760008061202a8e8e898b876006811061200557612005614deb565b60200201518d888151811061201c5761201c614deb565b602002602001015188612bc8565b90925090506120398286615203565b94506120458185615203565b93505050600101611fe1565b5061205c8284615277565b98508360200151612090577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c891215612096565b60648913155b806120a357506080840151155b156120ad576120b2565b611fb4565b606084015160408801526120c68587613018565b60a08a01526080890152606088015260208401516120ed57806120e8836152eb565b6120f7565b816120f7826152eb565b6020890152875250949998505050505050505050565b60006121188261325e565b60015b82518110156121725782818151811061213657612136614deb565b602002602001015183600183038151811061215357612153614deb565b6020026020010151141561216a5750600192915050565b60010161211b565b50600092915050565b60008083600460405160200161219b929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120905060006121e0826003614dd3565b6040805160ff87166020820152908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b60408051600283900b60208201529081018390526000906060016104c1565b80826020015183604001516064811061225357612253614deb565b60200201526040820180519061226882615324565b9052506060820180519061227b82615324565b9052506040820151606414156123225781516020808401516040516122a0920161535d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526122dc9291602001615392565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181529083526000908301526020820161231f61420c565b90525b5050565b6040810151156123e5576000816040015167ffffffffffffffff81111561234f5761234f614339565b604051908082528060200260200182016040528015612378578160200160208202803683370190505b50905060005b81518110156123d1578260200151816064811061239d5761239d614deb565b60200201518282815181106123b4576123b4614deb565b6020908102919091010152806123c981615324565b91505061237e565b5081516040516122a09083906020016153c1565b50565b60006fffffffffffffffffffffffffffffffff80851690841611801561240c579293925b6fffffffffffffffffffffffffffffffff83811685870382160290808716908616026124b6770100000000000000000000000000000000000000000000008310612484578361246f5761246a836901000000000000000000846132aa565b6133b4565b61246a836901000000000000000000846132e7565b8361249d5761246a604884901b83808204910615150190565b81604884901b816124b0576124b06150f1565b046133b4565b935082156124e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff840293505b5050509392505050565b60006fffffffffffffffffffffffffffffffff808516908416108015612512579293925b60008585036fffffffffffffffffffffffffffffffff16846fffffffffffffffffffffffffffffffff16029050612572826125685768ffffffffffffffffff8216151569010000000000000000008304016133b4565b604882901c6133b4565b925081156125a0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830292505b50509392505050565b6125b161422b565b90565b6125bc61422b565b600083126125cc576125cc6153f7565b6125d461422b565b6125dc61422b565b60008060005b8951811015612721576001811b8716612632577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86826006811061262857612628614deb565b6020020152612719565b60008a828151811061264657612646614deb565b60200260200101519050600081600001516fffffffffffffffffffffffffffffffff169050816040015162ffffff1681620186a00281612688576126886150f1565b0487846006811061269b5761269b614deb565b6020020181815250850194508a6126cd5760208201516fffffffffffffffffffffffffffffffff16810260481c6126f8565b81602001516fffffffffffffffffffffffffffffffff16604882901b816126f6576126f66150f1565b045b86846006811061270a5761270a614deb565b60200201818152508401935050505b6001016125e2565b5061272c8782615203565b905060005b8951811015612857577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86826006811061276d5761276d614deb565b60200201511461284f5760006127ba85836006811061278e5761278e614deb565b60200201516127b4858986600681106127a9576127a9614deb565b6020020151886133ea565b90613423565b8783600681106127cc576127cc614deb565b60200201819052131561284f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86826006811061280c5761280c614deb565b602002015284816006811061282357612823614deb565b60200201518303925083816006811061283e5761283e614deb565b602002015190910390506000612731565b600101612731565b5050505050949350505050565b61286c61422b565b6000831361287c5761287c6153f7565b61288461422b565b61288c61422b565b60008060005b8951811015612a09576001811b87166128e2577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8682600681106128d8576128d8614deb565b6020020152612a01565b60008a82815181106128f6576128f6614deb565b6020908102919091010151805160408201519192506fffffffffffffffffffffffffffffffff1690612938620186a0830262ffffff8316808204910615150190565b88856006811061294a5761294a614deb565b6020020181815250860195508b6129a357602083015161299e906fffffffffffffffffffffffffffffffff1683026402540be40062ffffff8416800269010000000000000000000204808204910615150190565b6129df565b60208301516fffffffffffffffffffffffffffffffff1662ffffff8216908102026d02540be40000000000000000000083028181049190061515015b8785600681106129f1576129f1614deb565b6020020181815250850194505050505b600101612892565b50612a148782614dd3565b9050818102600083838381612a2b57612a2b6150f1565b04148015612a5957507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211155b905060005b8b51811015612bb9577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff888260068110612a9a57612a9a614deb565b602002015114612bb1576000612b1c878360068110612abb57612abb614deb565b602002015184612aee57612ae961246a888c8760068110612ade57612ade614deb565b60200201518b6132e7565b6127b4565b878a8560068110612b0157612b01614deb565b6020020151880281612b1557612b156150f1565b0490613423565b898360068110612b2e57612b2e614deb565b602002018190521215612bb1577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff888260068110612b6e57612b6e614deb565b6020020152868160068110612b8557612b85614deb565b602002015185039450858160068110612ba057612ba0614deb565b602002015190930392506000612a5e565b600101612a5e565b50505050505050949350505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8660c001518460068110612c0257612c02614deb565b60200201511415612c185750600090508061300d565b84516fffffffffffffffffffffffffffffffff16612c6a57612c558660a001518760000151612c4b578560a0015161342f565b856080015161342f565b6fffffffffffffffffffffffffffffffff1685525b6000612ca98888602001518960c001518760068110612c8b57612c8b614deb565b602002015188602001518a600001518a600001518b6040015161347d565b6fffffffffffffffffffffffffffffffff9091166020890152919450925090507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831415612cfe57600080925092505061300d565b866020015115612d2557602086018051840190526040860180516000849003019052612d3e565b6020860180518301905260408601805160008590030190525b60408781015160608901805160ff92831685029290920491820190528651928190039290916000916fffffffffffffffffffffffffffffffff169084901b81612d8957612d896150f1565b049050886000015115612db15760c087018051820169ffffffffffffffffffff169052612dc8565b60e087018051820169ffffffffffffffffffff1690525b50505084600001516fffffffffffffffffffffffffffffffff1684602001516fffffffffffffffffffffffffffffffff16141561300d578551600090612e12578460a00151612e18565b84608001515b9050600281900b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff427551480612e525750600281900b620bd8ab145b15612e6b57506080860180516001851b1916905261300d565b6000808752600160608801526040517fe3642509000000000000000000000000000000000000000000000000000000008152600481018b905260ff86166024820152600283900b60448201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e36425099060640161010060405180830381865afa158015612f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f3a9190615431565b805160208201518a519293506bffffffffffffffffffffffff9182169291169015612fb657875170ffffffffffffffffffffffffffffffff00600884811b82169084901b90911691909101036fffffffffffffffffffffffffffffffff1688526040830151600290810b60808a015284900b60a0890152613008565b875170ffffffffffffffffffffffffffffffff00600883811b82169085901b90911691909101036fffffffffffffffffffffffffffffffff168852600284810b60808a01526060840151900b60a08901525b505050505b965096945050505050565b6060806060835167ffffffffffffffff81111561303757613037614339565b604051908082528060200260200182016040528015613060578160200160208202803683370190505b509050835167ffffffffffffffff81111561307d5761307d614339565b6040519080825280602002602001820160405280156130a6578160200160208202803683370190505b509250835167ffffffffffffffff8111156130c3576130c3614339565b6040519080825280602002602001820160405280156130ec578160200160208202803683370190505b50915060005b84518160ff161015613256576000868260ff166006811061311557613115614deb565b60200201519050600081602001511180613130575080606001515b1561324d576000868360ff168151811061314c5761314c614deb565b6020026020010151905061316381602001516136b5565b600290810b6060830181905260a083015190910b14156131ab576060810180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160020b90525b80600001516fffffffffffffffffffffffffffffffff16608082602001516fffffffffffffffffffffffffffffffff16901b17848460ff16815181106131f3576131f3614deb565b6020026020010181815250508160200151868460ff168151811061321957613219614deb565b6020026020010181815250508160400151858460ff168151811061323f5761323f614deb565b602002602001018181525050505b506001016130f2565b509250925092565b600081511161326c57600080fd5b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8151111561329a57600080fd5b6123e58160006001845103613c38565b60006132b78484846132e7565b9050600082806132c9576132c96150f1565b84860911156132e057806132dc81615324565b9150505b9392505050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050806000141561333f576000841161333457600080fd5b5082900490506132e0565b80841161334b57600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156133e6576133e66153f7565b5090565b60008084126134065761340161246a8585856132aa565b61341b565b61341761246a8560000385856132e7565b6000035b949350505050565b60006132e08284615277565b6000826000015160020b8260020b141561344e575060208201516104da565b6134578261156e565b6fffffffffffffffffffffffffffffffff8116602085015260029290920b909252919050565b846000808080808c613499576134948a8a8a6124ee565b6134a4565b6134a48a8a8a6123e8565b905062ffffff871680028c156135aa577b6df37f675ef6eadf5ab9a2072d44268d97df837e6748956e5c6c211787126134e657806402540be4008804026134f1565b6402540be400878202045b925081831215613522578d6135105761350b8b8a85613dc2565b61351b565b61351b8b8a85613f33565b945061357e565b89945081925061357b7b6df37f675ef6eadf5ab9a2072d44268d97df837e6748956e5c6c21178412613564578184061515828504015b6402540be400026133b4565b61246a846402540be4000283808204910615150190565b96505b8d6135935761358e8b868b6123e8565b61359e565b61359e8b868b6124ee565b9550828703935061363e565b818713156135d9578d6135c7576135c28b8a89613dc2565b6135d2565b6135d28b8a89613f33565b94506135e0565b8994508196505b8d6135f5576135f08b868b6123e8565b613600565b6136008b868b6124ee565b92506136367b6df37f675ef6eadf5ab9a2072d44268d97df837e6748956e5c6c2117841261356457818406151582850401613558565b955082860393505b821580156136705750896fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff1614155b156136a4577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9650600095508a9450600093505b505050975097509750979350505050565b60006fffffffffffffffffffffffffffffffff821662010003118015906136fe57506ffffdd8371ce3ef742f98c78a4732240d6fffffffffffffffffffffffffffffffff831611155b61370757600080fd5b6fffffffffffffffffffffffffffffffff821680600068010000000000000000821061373557604091821c91015b640100000000821061374957602091821c91015b62010000821061375b57601091821c91015b610100821061376c57600891821c91015b6010821061377c57600491821c91015b6004821061378c57600291821c91015b6002821061379c57600191821c91015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8810160401b607f82810385901b8002901c70010000000000000000000000000000000081106137f857678000000000000000919091179060011c5b8002607f1c700100000000000000000000000000000000811061382757674000000000000000919091179060011c5b8002607f1c700100000000000000000000000000000000811061385657672000000000000000919091179060011c5b8002607f1c700100000000000000000000000000000000811061388557671000000000000000919091179060011c5b8002607f1c70010000000000000000000000000000000081106138b457670800000000000000919091179060011c5b8002607f1c70010000000000000000000000000000000081106138e357670400000000000000919091179060011c5b8002607f1c700100000000000000000000000000000000811061391257670200000000000000919091179060011c5b8002607f1c700