15 txs
17 calls
constructor
constructor()
functions
controller
viewfunction controller() view returns (address)
correctPriceDirection
purefunction correctPriceDirection(address base, address quote, uint160 sqrtPriceX96) pure returns (uint160 sqrtPriceX96Corrected)
factory
viewfunction factory() view returns (address)
funder
viewfunction funder() view returns (address)
getController
viewfunction getController() view returns (address _controller)
getFunder
viewfunction getFunder() view returns (address _funder)
getSqrtPriceX96FromPrice
purefunction getSqrtPriceX96FromPrice(int8 decimalDiff, uint80 price_12Decimals) pure returns (uint160 sqrtPriceX96)
getTotalValueEth12
viewfunction getTotalValueEth12() view returns (uint128 valueEth12)
getTotalValueUsd12
viewfunction getTotalValueUsd12() view returns (uint128 valueUsd12)
getUsd12ValueIn
viewfunction getUsd12ValueIn(address token) view returns (uint128 valueUsd12)
indexFromPositionId
viewfunction indexFromPositionId(uint256) view returns (uint8)
indexFromTokenAddress
viewfunction indexFromTokenAddress(address) view returns (uint8)
liquidityPositions
viewfunction liquidityPositions(uint256) view returns (uint256)
nLiquidityPositions
viewfunction nLiquidityPositions() view returns (uint8)
nTokensHeld
viewfunction nTokensHeld() view returns (uint8)
numLiquidityPositionsByToken
viewfunction numLiquidityPositionsByToken(address) view returns (uint16)
owner
viewfunction owner() view returns (address)
sqrt
purefunction sqrt(uint256 x) pure returns (uint128)
swapRouter
viewfunction swapRouter() view returns (address)
tokensHeld
viewfunction tokensHeld(uint256) view returns (address)
utils
viewfunction utils() view returns (address)
v4PoolManager
viewfunction v4PoolManager() view returns (address)
v4PositionIdToBase
viewfunction v4PositionIdToBase(uint256) view returns (address)
v4PositionIdToQuote
viewfunction v4PositionIdToQuote(uint256) view returns (address)
v4PositionManager
viewfunction v4PositionManager() view returns (address)
validEmergencyTokens
viewfunction validEmergencyTokens(address) view returns (bool)
addEmergencyTokens
nonpayablefunction addEmergencyTokens(address[] tokens)
collectFees
nonpayablefunction collectFees(uint256 positionId)
createPosition
nonpayablefunction createPosition(tuple key, address quote, uint80 lowPrice12, uint80 highPrice12, uint256 toAdd) returns (uint256 positionId)
depositEth
payablefunction depositEth() payable
depositToken
nonpayablefunction depositToken(address token, uint256 amount)
destroyPosition
nonpayablefunction destroyPosition(uint256 positionId)
emergencyCircuitBreaker
nonpayablefunction emergencyCircuitBreaker(address storeOfValueToken)
lockEmergencyTokens
nonpayablefunction lockEmergencyTokens()
modifyLiquidity
nonpayablefunction modifyLiquidity(uint256 positionId, uint256 newBaseBal, uint256 newQuoteBal)
obtainTokens
nonpayablefunction obtainTokens(address token0, address token1, uint256 amount0, uint256 amount1)
renounceOwnership
nonpayablefunction renounceOwnership()
rescueTokens
nonpayablefunction rescueTokens(address token)
setController
nonpayablefunction setController(address newController)
setFunder
nonpayablefunction setFunder(address newFunder)
setUtils
nonpayablefunction setUtils(address utilsAdr)
swapTokensInto
nonpayablefunction swapTokensInto(address tokenFrom, address tokenTo, uint256 maxIn, uint256 maxOut) returns (uint256 tokensIn, uint256 tokensOut)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
withdrawEth
nonpayablefunction withdrawEth(address destination, uint256 amount)
withdrawToken
nonpayablefunction withdrawToken(address token, address destination, uint256 amount)
events
ControllerSet
event ControllerSet(address newController, address oldController)
Deposited
event Deposited(address token, uint256 amount)
EmergencyCircuitBreakerFlipped
event EmergencyCircuitBreakerFlipped(address storeOfValueToken)
FunderSet
event FunderSet(address newController, address oldController)
LiquidityFeesCollected
event LiquidityFeesCollected(uint256 poolPosition, address base, address quote, uint256 baseTaken, uint256 quoteTaken)
LiquidityModified
event LiquidityModified(uint256 poolPosition, address base, address quote, int128 liquidityChange)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PositionBurned
event PositionBurned(uint256 poolPosition, address base, address quote, uint256 baseTaken, uint256 quoteTaken)
PositionMinted
event PositionMinted(uint256 poolPosition, address base, address quote, uint80 minPrice, uint80 maxPrice, uint256 toAdd)
TokensSwapped
event TokensSwapped(address from, address to, uint256 fromAmt, uint256 toAmt)
Withdrawn
event Withdrawn(address token, uint256 amount)
errors
No errors.
creation bytecode
0x60e060405273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260a0527388e6a0c2ddd26feeb64f039a2c41296fcb3f564060c052600e805460ff199081169091556018805482169055601c80549091169055348015610075575f80fd5b5061007f33610202565b6080516001600160a01b039081165f908152600160208190526040808320805460ff19908116841790915560a05190941680845281842080548616841790559280527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb498054909416909117909255905163095ea7b360e01b815273e592427a0aece92de3edee1f18e0157c0586156460048201525f19602482015263095ea7b3906044016020604051808303815f875af115801561013f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101639190610377565b5060805160405163095ea7b360e01b815273e592427a0aece92de3edee1f18e0157c0586156460048201525f1960248201526001600160a01b039091169063095ea7b3906044016020604051808303815f875af11580156101c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ea9190610377565b506101f433610251565b6101fd336102b8565b61039d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610259610318565b600280546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917e7582b62407f53d49cfc72e7ddab574c06ef3b8aced104b54b7bed4681ee54a91015b60405180910390a15050565b6102c0610318565b600380546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917f9fb5233a5c1113ee4f5aafa72ecf995c4c5bc0c057ecbcad707ea04ebc829c6691016102ac565b5f546001600160a01b031633146103755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b5f60208284031215610387575f80fd5b81518015158114610396575f80fd5b9392505050565b60805160a05160c0516159a36104735f395f50505f8181610fd10152818161153601528181611b5301528181611c1101528181611eed01528181611f20015281816122bd01528181612ecd01528181612f15015281816134ef0152818161358c015281816135db0152818161377a01528181613c440152613cb901525f8181610f9f0152818161160201528181611b310152818161225d01528181612362015281816126120152818161264501528181612f7b015281816131690152818161395801528181613b410152613bb601526159a35ff3fe6080604052600436106102c4575f3560e01c80638172047911610176578063bc329198116100d4578063df2a558b11610083578063f2fde38b11610060578063f2fde38b146108a5578063f60b36e3146108c4578063f77c4791146108e357005b8063df2a558b1461081c578063e2f4dd431461084a578063ed4ab0f81461087157005b8063c31c9c07116100b1578063c31c9c07146107af578063c45a0155146107d6578063c4b19b54146107fd57005b8063bc32919814610732578063bf0e622b1461074b578063c0c8eca61461078d57005b80639ba6924911610130578063b17acdcd1161010d578063b17acdcd146106d5578063b1df47d8146106f4578063b3a579431461071357005b80639ba6924914610656578063a9e88b8f1461066a578063ac75886f146106a857005b80638da5cb5b1161015e5780638da5cb5b146105fc57806392eefe9b146106185780639a7fe3a11461063757005b806381720479146105ab5780638abb9845146105df57005b806339040ed1116102235780634a2539c3116101dd578063677342ce116101ba578063677342ce146105595780636995350114610578578063715018a61461059757005b80634a2539c3146104e65780635a29638d1461050557806363011d1a1461052457005b8063439370b11161020b578063439370b1146104a0578063483e0cd7146104a8578063495915d3146104c757005b806339040ed11461044757806342d9843e1461047257005b806319cc33571161027f5780633018205f1161025c5780633018205f146103ec57806332c4171d14610409578063338b5dea1461042857005b806319cc33571461039a5780631b9a91a4146103ae5780631fba9eda146103cd57005b806302c512ca116102ad57806302c512ca1461030b578063041ae8801461035c5780630acc8cd11461037b57005b8062ae3bf8146102cd57806301e33667146102ec57005b366102cb57005b005b3480156102d8575f80fd5b506102cb6102e7366004614f4b565b610902565b3480156102f7575f80fd5b506102cb610306366004614f66565b610a80565b348015610316575f80fd5b5061033f610325366004614fa4565b601a6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610367575f80fd5b5060035461033f906001600160a01b031681565b348015610386575f80fd5b506102cb610395366004614f4b565b610c33565b3480156103a5575f80fd5b506102cb610cb3565b3480156103b9575f80fd5b506102cb6103c8366004614fbb565b610ce8565b3480156103d8575f80fd5b5061033f6103e7366004614ffc565b610dc6565b3480156103f7575f80fd5b506002546001600160a01b031661033f565b348015610414575f80fd5b506102cb610423366004615037565b610e28565b348015610433575f80fd5b506102cb610442366004614fbb565b61108c565b348015610452575f80fd5b50600e546104609060ff1681565b60405160ff9091168152602001610353565b34801561047d575f80fd5b5061046061048c366004614fa4565b60196020525f908152604090205460ff1681565b6102cb61123b565b3480156104b3575f80fd5b506102cb6104c236600461507a565b611275565b3480156104d2575f80fd5b506102cb6104e13660046150a3565b6113fb565b3480156104f1575f80fd5b506102cb610500366004614fa4565b611684565b348015610510575f80fd5b5060045461033f906001600160a01b031681565b34801561052f575f80fd5b50610538611aee565b6040516fffffffffffffffffffffffffffffffff9091168152602001610353565b348015610564575f80fd5b50610538610573366004614fa4565b611f5f565b348015610583575f80fd5b506102cb610592366004614f4b565b6120e0565b3480156105a2575f80fd5b506102cb612122565b3480156105b6575f80fd5b506105ca6105c5366004615037565b612135565b60408051928352602083019190915201610353565b3480156105ea575f80fd5b506003546001600160a01b031661033f565b348015610607575f80fd5b505f546001600160a01b031661033f565b348015610623575f80fd5b506102cb610632366004614f4b565b6121d3565b348015610642575f80fd5b50610538610651366004614f4b565b61224a565b348015610661575f80fd5b50610538612289565b348015610675575f80fd5b50610698610684366004614f4b565b60016020525f908152604090205460ff1681565b6040519015158152602001610353565b3480156106b3575f80fd5b506106c76106c2366004614fa4565b612680565b604051908152602001610353565b3480156106e0575f80fd5b506102cb6106ef366004614fa4565b612696565b3480156106ff575f80fd5b506106c761070e366004615114565b6126a3565b34801561071e575f80fd5b5061033f61072d36600461517b565b612ba1565b34801561073d575f80fd5b506018546104609060ff1681565b348015610756575f80fd5b5061077a610765366004614f4b565b60056020525f908152604090205461ffff1681565b60405161ffff9091168152602001610353565b348015610798575f80fd5b5061033f6e04444c5dc75cb358380d2e3de08a9081565b3480156107ba575f80fd5b5061033f73e592427a0aece92de3edee1f18e0157c0586156481565b3480156107e1575f80fd5b5061033f731f98431c8ad98523631ae4a59f267346ea31f98481565b348015610808575f80fd5b5061033f610817366004614fa4565b612bf7565b348015610827575f80fd5b50610460610836366004614f4b565b600f6020525f908152604090205460ff1681565b348015610855575f80fd5b5061033f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e81565b34801561087c575f80fd5b5061033f61088b366004614fa4565b601b6020525f90815260409020546001600160a01b031681565b3480156108b0575f80fd5b506102cb6108bf366004614f4b565b612c16565b3480156108cf575f80fd5b506102cb6108de366004614f4b565b612cbd565b3480156108ee575f80fd5b5060025461033f906001600160a01b031681565b61090a613059565b6001600160a01b0381165f908152600f6020526040902054600e5460ff9182169116811015806109635750816001600160a01b031660068260ff1660088110610955576109556151c3565b01546001600160a01b031614155b6109ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616e6e6f74202772657363756527206465706f73697473000000000000000060448201526064015b60405180910390fd5b816001600160a01b031663a9059cbb6109ee5f546001600160a01b031690565b6109f7856130cc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610a57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7b91906151f0565b505050565b6003546001600160a01b03163314610af4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610b59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7d91906151f0565b610be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c6564000000000000000000000000000000000060448201526064016109c5565b610bec83613167565b604080516001600160a01b0385168152602081018390527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a1505050565b610c3b613059565b600380546001600160a01b038381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560408051938452911660208301819052917f9fb5233a5c1113ee4f5aafa72ecf995c4c5bc0c057ecbcad707ea04ebc829c6691015b60405180910390a15050565b610cbb613059565b601c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6003546001600160a01b03163314610d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b6040516001600160a01b0383169082156108fc029083905f818181858888f19350505050158015610d8f573d5f803e3d5ffd5b50604080515f8152602081018390527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59101610ca7565b5f80610e018369ffffffffffffffffffff16780100000000000000000000000000000000000000000000000086600c0160ff16600a0a61335d565b9050610e0c81611f5f565b6fffffffffffffffffffffffffffffffff169150505b92915050565b6002546001600160a01b0316331480610e4057503330145b610ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b5f610eb0856130cc565b90505f610ebc856130cc565b9050838210158015610ece5750828110155b15610eda575050611086565b5f805f848710610eec57848703610eee565b5f5b9150838610610eff57838603610f01565b5f5b90508685108015610f1157508584115b15610f525785840392505f610f36898b86620f4240620f7cd888025b04613a98613426565b915050808310610f4857808303610f4a565b5f5b925050610f98565b8584108015610f6057508685115b15610f985786850392505f610f808a8a86620f4240620f7cd88702610f2d565b915050808210610f9257808203610f94565b5f5b9250505b610fc589897f00000000000000000000000000000000000000000000000000000000000000008585613846565b9092509050610ff789897f00000000000000000000000000000000000000000000000000000000000000008585613846565b909250905061100989895f8585613846565b90925090508115801561101a575080155b611080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f556e64657266756e64656400000000000000000000000000000000000000000060448201526064016109c5565b50505050505b50505050565b6003546001600160a01b03163314611100576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290526001600160a01b038316906323b872dd906064016020604051808303815f875af1158015611169573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061118d91906151f0565b6111f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c6564000000000000000000000000000000000060448201526064016109c5565b6111fc82613943565b604080516001600160a01b0384168152602081018390527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c49101610ca7565b604080515f81523460208201527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4910160405180910390a1565b6002546001600160a01b031633146112e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b5f838152601a6020908152604080832054601b9092528220546001600160a01b039182169291169061131a836130cc565b90505f611326836130cc565b600480546040517f080085220000000000000000000000000000000000000000000000000000000081529182018a90526001600160a01b0387811660248401528681166044840152606483018690526084830184905260a483018a905260c483018990529293505f92169063080085229060e401602060405180830381865afa1580156113b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d9919061523c565b90506113e58882613e01565b6113f185858989610e28565b5050505050505050565b611403613059565b601c5460ff1615611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f6c6f636b6564000000000000000000000000000000000000000000000000000060448201526064016109c5565b5f611479612289565b600802662386f26fc100000190505f5b60ff8116831115611086575f84848360ff168181106114aa576114aa6151c3565b90506020020160208101906114bf9190614f4b565b6001600160a01b038181165f8181526001602081905260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790556004805491517f7afd0a86000000000000000000000000000000000000000000000000000000008152908101929092527f0000000000000000000000000000000000000000000000000000000000000000831660248301526fffffffffffffffffffffffffffffffff87166044830152929350911690637afd0a86906064016020604051808303815f875af115801561159f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c3919061525c565b50600480546040517f7afd0a860000000000000000000000000000000000000000000000000000000081526001600160a01b03848116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201525f6044820152911690637afd0a86906064016020604051808303815f875af1158015611656573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061167a919061525c565b5050600101611489565b6002546001600160a01b031633146116f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b5f818152601a6020908152604080832054601b9092528220546001600160a01b0391821692911690611729836130cc565b90505f611735836130cc565b90505f60036011604051602001611756929190918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b60608152602001906001900390816117975790505060408051602081018a90525f9181018290526060810182905260808082015260a081019190915290915060c001604051602081830303815290604052815f815181106117fa576117fa6151c3565b602090810291909101810191909152604080516001600160a01b03808a16938201939093529187169082015230606082015260800160405160208183030381529060405281600181518110611851576118516151c3565b602002602001018190525073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b031663dd46508f83836040516020016118929291906152c3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526118cb42603c615383565b6040518363ffffffff1660e01b81526004016118e8929190615396565b5f604051808303815f87803b1580156118ff575f80fd5b505af1158015611911573d5f803e3d5ffd5b505050505f84611920886130cc565b61192a91906153b7565b90505f84611937886130cc565b61194191906153b7565b6001600160a01b0389165f908152600560205260408120805492935061ffff909216919061196e836153ca565b82546101009290920a61ffff8181021990931691831602179091556001600160a01b0389165f908152600560205260408120805490921692506119b0836153ca565b825461ffff9182166101009390930a9283029190920219909116179055506018805460ff16905f6119e083615405565b82546101009290920a60ff81810219909316918316021790915560185416159050611a8c575f8981526019602052604090205460185460ff918216916010911660088110611a3057611a306151c3565b015460108260ff1660088110611a4857611a486151c3565b01558060195f601060ff841660088110611a6457611a646151c3565b015481526020019081526020015f205f6101000a81548160ff021916908360ff160217905550505b604080518a81526001600160a01b038a81166020830152891681830152606081018490526080810183905290517f5501b833962ceaf131361ff8d59683c382ab00f523035d0fc4c2ffc19bef3a459181900360a00190a1505050505050505050565b5f611afc620f424047615417565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909150611bcc907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038316906370a08231906024015b602060405180830381865afa158015611ba3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc7919061544f565b6140b6565b611bd69082615466565b90505f5b600e5460ff9081169082161015611c9a57611c8e60068260ff1660088110611c0457611c046151c3565b01546001600160a01b03167f0000000000000000000000000000000000000000000000000000000000000000600660ff851660088110611c4657611c466151c3565b01546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401611b88565b90910190600101611bda565b505f5b60185460ff9081169082161015611f5b575f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e631efeed33601060ff851660088110611cdf57611cdf6151c3565b01546040518263ffffffff1660e01b8152600401611cff91815260200190565b602060405180830381865afa158015611d1a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3e919061548e565b90505f8073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e637ba03aad601060ff871660088110611d7257611d726151c3565b01546040518263ffffffff1660e01b8152600401611d9291815260200190565b60c060405180830381865afa158015611dad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd19190615529565b915091505f611dfa611de48460a0902090565b6e04444c5dc75cb358380d2e3de08a909061421b565b50506004549192505f918291506001600160a01b031663c72e160b84611e2b611e268860081c60020b90565b6142e6565b611e3b611e268960201c60020b90565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152918316602483015290911660448201526fffffffffffffffffffffffffffffffff891660648201526084016040805180830381865afa158015611ebc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ee091906155ba565b91509150611f12855f01517f0000000000000000000000000000000000000000000000000000000000000000846140b6565b88019750611f4585602001517f0000000000000000000000000000000000000000000000000000000000000000836140b6565b90970196505060019094019350611c9d92505050565b5090565b5f815f03611f6e57505f919050565b8160017001000000000000000000000000000000008210611f945760809190911c9060401b5b680100000000000000008210611faf5760409190911c9060201b5b6401000000008210611fc65760209190911c9060101b5b620100008210611fdb5760109190911c9060081b5b6101008210611fef5760089190911c9060041b5b601082106120025760049190911c9060021b5b6008821061200e5760011b5b600181858161201f5761201f61520f565b048201901c905060018185816120375761203761520f565b048201901c9050600181858161204f5761204f61520f565b048201901c905060018185816120675761206761520f565b048201901c9050600181858161207f5761207f61520f565b048201901c905060018185816120975761209761520f565b048201901c905060018185816120af576120af61520f565b0491909101901c5f6120c18286615417565b90508082106120d057806120d2565b815b95945050505050565b919050565b6120e8613059565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b61212a613059565b6121335f6145e3565b565b6002545f9081906001600160a01b031633148061215157503330145b6121b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b6121c686868686613a98613426565b9150915094509492505050565b6121db613059565b600280546001600160a01b038381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560408051938452911660208301819052917e7582b62407f53d49cfc72e7ddab574c06ef3b8aced104b54b7bed4681ee54a9101610ca7565b5f80612255836130cc565b9050612282837f0000000000000000000000000000000000000000000000000000000000000000836140b6565b9392505050565b600480546040517fea4bc51c0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116938201939093525f92670de0b6b3a764000092169063ea4bc51c90602401602060405180830381865afa158015612317573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061233b91906155dc565b6123519069ffffffffffffffffffff16476155f7565b61235b9190615417565b90506123867f000000000000000000000000000000000000000000000000000000000000000061224a565b6123909082615466565b90505f5b600e5460ff90811690821610156123da576123ce60068260ff16600881106123be576123be6151c3565b01546001600160a01b031661224a565b90910190600101612394565b505f5b60185460ff9081169082161015611f5b575f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e631efeed33601060ff85166008811061241f5761241f6151c3565b01546040518263ffffffff1660e01b815260040161243f91815260200190565b602060405180830381865afa15801561245a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247e919061548e565b90505f8073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e637ba03aad601060ff8716600881106124b2576124b26151c3565b01546040518263ffffffff1660e01b81526004016124d291815260200190565b60c060405180830381865afa1580156124ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125119190615529565b915091505f612524611de48460a0902090565b50506004549192505f918291506001600160a01b031663c72e160b84612550611e268860081c60020b90565b612560611e268960201c60020b90565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152918316602483015290911660448201526fffffffffffffffffffffffffffffffff891660648201526084016040805180830381865afa1580156125e1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061260591906155ba565b91509150612637855f01517f0000000000000000000000000000000000000000000000000000000000000000846140b6565b8801975061266a85602001517f0000000000000000000000000000000000000000000000000000000000000000836140b6565b909701965050600190940193506123dd92505050565b6010816008811061268f575f80fd5b0154905081565b6126a0815f613e01565b50565b6002545f906001600160a01b03163314612719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b601854600860ff9091161061278a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574206f66206d656d6f72790000000000000000000000000000000000000060448201526064016109c5565b73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b03166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127fe919061544f565b90505f6001600160a01b0386166128186020890189614f4b565b6001600160a01b031614612838576128336020880188614f4b565b612848565b6128486040880160208901614f4b565b90505f866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612887573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ab919061560e565b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061290b919061560e565b612915919061562e565b90505f612927838961072d858b610dc6565b90505f612939848a61072d868b610dc6565b90505f612958611de4612951368e90038e018e61566c565b60a0902090565b5050509050816001600160a01b0316836001600160a01b0316111561297b579091905b5f61298784848a61464a565b90506129968c838686856146b4565b85601a5f8981526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a601b5f8981526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060055f876001600160a01b03166001600160a01b031681526020019081526020015f205f81819054906101000a900461ffff1680929190612a40906156e6565b82546101009290920a61ffff8181021990931691831602179091556001600160a01b038d165f90815260056020526040812080549092169250612a82836156e6565b825461ffff9182166101009390930a928302919092021990911617905550601854879060109060ff1660088110612abb57612abb6151c3565b0155601880545f89815260196020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff93841617905582549091169190612b0a83615706565b82546101009290920a60ff81810219909316919092169190910217905550604080518881526001600160a01b0388811660208301528d168183015269ffffffffffffffffffff8c811660608301528b16608082015260a081018a905290517f29cd472535c058e9f744cc9cead6f8c38cbe5ea230674d825060f275884bdd729181900360c00190a150505050505095945050505050565b5f826001600160a01b0316846001600160a01b03161015612bc3575080612282565b612bef6001600160a01b0383167801000000000000000000000000000000000000000000000000615417565b949350505050565b60068160088110612c06575f80fd5b01546001600160a01b0316905081565b612c1e613059565b6001600160a01b038116612cb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109c5565b6126a0816145e3565b6002546001600160a01b0316331480612cdf57505f546001600160a01b031633145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4163636573732064656e6965640000000000000000000000000000000000000060448201526064016109c5565b6001600160a01b0381165f9081526001602052604090205460ff16612dc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016109c5565b60185460ff165b60ff811615612e66577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0130634a2539c3601060ff841660088110612e1457612e146151c3565b01546040518263ffffffff1660e01b8152600401612e3491815260200190565b5f604051808303815f87803b158015612e4b575f80fd5b505af1158015612e5d573d5f803e3d5ffd5b50505050612dcd565b50600e5460ff165b60ff811615612f0f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f600660ff831660088110612eb057612eb06151c3565b01546001600160a01b03908116915083168114612f0957612f06817f0000000000000000000000000000000000000000000000000000000000000000612ef5846130cc565b6001600160a01b03620124f8613426565b50505b50612e6e565b50612f477f000000000000000000000000000000000000000000000000000000000000000082476001600160a01b03620124f8613426565b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152612ff0907f00000000000000000000000000000000000000000000000000000000000000009083906001600160a01b038316906370a0823190602401602060405180830381865afa158015612fcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ef5919061544f565b5050600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040516001600160a01b03821681527f2cc79b200fc7fdf7af6be005fc77813bfacedb82066816356eed5b7df46194709060200160405180910390a150565b5f546001600160a01b03163314612133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c5565b5f6001600160a01b03821615613160576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015613137573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061315b919061544f565b610e22565b4792915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614806131ae57506001600160a01b038116155b156131b65750565b6001600160a01b0381165f908152600f6020526040902054600e5460ff91821691168110801561320e5750816001600160a01b031660068260ff1660088110613201576132016151c3565b01546001600160a01b0316145b801561322257506064613220836130cc565b105b801561324757506001600160a01b0382165f9081526005602052604090205461ffff16155b1561335957600e805460ff16905f61325e83615405565b82546101009290920a60ff818102199093169183160217909155600e541615905061335957600e5460069060ff166008811061329c5761329c6151c3565b01546001600160a01b0316600660ff8316600881106132bd576132bd6151c3565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905580600f5f600660ff84166008811061330e5761330e6151c3565b01546001600160a01b0316815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff929092169190911790555b5050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f036133b0575f84116133a5575f80fd5b508290049050612282565b8084116133bb575f80fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600480546040517f64aa79a30000000000000000000000000000000000000000000000000000000081526001600160a01b03888116938201939093528683166024820152604481018690526064810185905262ffffff841660848201525f92839283928392909116906364aa79a39060a401606060405180830381865afa1580156134b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134d7919061571b565b90955090925090506001600160a01b03891661355e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015613546575f80fd5b505af1158015613558573d5f803e3d5ffd5b50505050505b5f6040518061010001604052805f6001600160a01b03168c6001600160a01b03161461358a578b6135ac565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b031681526020015f6001600160a01b03168b6001600160a01b0316146135d9578a6135fb565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03168152602001846001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015613645573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613669919061574f565b62ffffff168152602001306001600160a01b031681526020014281526020018681526020018381526020015f6001600160a01b0316815250905073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663414bf389826040518263ffffffff1660e01b81526004016136e3919061576a565b6020604051808303815f875af11580156136ff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613723919061544f565b93506001600160a01b038a161561373d5761373d8a613167565b6001600160a01b0389166137de576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156137c3575f80fd5b505af11580156137d5573d5f803e3d5ffd5b505050506137e7565b6137e789613943565b604080516001600160a01b03808d1682528b166020820152908101869052606081018590527f25f1d03755df23c30e25db2dbd3891e31ce084bdfbfc46f9fe5e446ee5f9b2d49060800160405180910390a15050509550959350505050565b5f80846001600160a01b0316876001600160a01b03161415801561387c5750846001600160a01b0316866001600160a01b031614155b15613937575f61388b866130cc565b9050620f4240811015801561389f57505f85115b156138ee575f806138cf888b85620f42406138bd8c620f7cd86155f7565b6138c79190615417565b613a98613426565b9150915081830392508681116138e7578087036138e9565b5f5b965050505b620f4240811015801561390057505f84115b15613935575f61391d878984620f42406138bd8a620f7cd86155f7565b91505084811161392f57808503613931565b5f5b9450505b505b50919590945092505050565b6001600160a01b0381161580159061398d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614155b156126a0576040517f095ea7b300000000000000000000000000000000000000000000000000000000815273e592427a0aece92de3edee1f18e0157c0586156460048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248201526001600160a01b0382169063095ea7b3906044016020604051808303815f875af1158015613a28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a4c91906151f0565b506001600160a01b0381165f818152600f602052604090205460069060ff1660088110613a7b57613a7b6151c3565b01546001600160a01b0316141580613ab35750600e546001600160a01b0382165f908152600f602052604090205460ff918216911610155b156126a057600e54600860ff90911610613b29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574206f66206d656d6f72790000000000000000000000000000000000000060448201526064016109c5565b5f613b32612289565b613b3d9060046157fb565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614613c4257600480546040517f7afd0a860000000000000000000000000000000000000000000000000000000081526001600160a01b03858116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff84166044820152911690637afd0a86906064016020604051808303815f875af1158015613c1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c40919061525c565b505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614613d4557600480546040517f7afd0a860000000000000000000000000000000000000000000000000000000081526001600160a01b03858116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff84166044820152911690637afd0a86906064016020604051808303815f875af1158015613d1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d43919061525c565b505b600e54829060069060ff1660088110613d6057613d606151c3565b0180546001600160a01b039283167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055600e80549184165f908152600f6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff948516179055815490921691613de483615706565b91906101000a81548160ff021916908360ff160217905550505050565b5f8082600f0b12613e12575f613e15565b60015b5f83600f0b12613e2657600d613e29565b60115b604080516020810193909352820152606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b6060815260200190600190039081613e7c579050509050835f84600f0b12613ea45783613ead565b613ead84615826565b6040805160208101939093526fffffffffffffffffffffffffffffffff909116908201525f606082018190526080820181905260a08083015260c082015260e001604051602081830303815290604052815f81518110613f0f57613f0f6151c3565b6020908102919091018101919091525f858152601a8252604080822054601b8452918190205481516001600160a01b0393841694810194909452919091169082015230606082015260800160405160208183030381529060405281600181518110613f7c57613f7c6151c3565b602002602001018190525073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b031663dd46508f8383604051602001613fbd9291906152c3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052613ff642603c615383565b6040518363ffffffff1660e01b8152600401614013929190615396565b5f604051808303815f87803b15801561402a575f80fd5b505af115801561403c573d5f803e3d5ffd5b5050505f858152601a6020908152604080832054601b8352928190205481518981526001600160a01b03948516938101939093529290921681830152600f86900b606082015290517f1172e6c2fa5b068f7396efd2ed20f26bf1ce7899860acd635416a62a99bb975c92509081900360800190a150505050565b5f806001600160a01b0385161561412c57846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015614103573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614127919061560e565b61412f565b60125b90505f846001600160a01b0316866001600160a01b0316146141f157600480546040517f2b0697830000000000000000000000000000000000000000000000000000000081526001600160a01b03898116938201939093528783166024820152869290911690632b06978390604401602060405180830381865afa1580156141b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141dd91906155dc565b69ffffffffffffffffffff160290506141fb565b5064e8d4a5100083025b8160ff16600a0a81816142105761421061520f565b049695505050505050565b5f805f805f61422986614aab565b6040517f1e2eaeaf000000000000000000000000000000000000000000000000000000008152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa15801561428a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142ae919061544f565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b60020b5f60ff82901d80830118620d89e8811115614328576143287f8b86327a0000000000000000000000000000000000000000000000000000000084614ae7565b7001fffcb933bd6fad37aa2d162d1a5940016001821602700100000000000000000000000000000000186002821615614371576ffff97272373d413259a46990580e213a0260801c5b6004821615614390576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156143af576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156143ce576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156143ed576fff973b41fa98c081472e6896dfb254c00260801c5b604082161561440c576fff2ea16466c96a3843ec78b326b528610260801c5b608082161561442b576ffe5dee046a99a2a811c461f1969c30530260801c5b61010082161561444b576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b61020082161561446b576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561448b576ff3392b0822b70005940c7a398e4b70f30260801c5b6108008216156144ab576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156144cb576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156144eb576fa9f746462d870fdf8a65dc1f90e061e50260801c5b61400082161561450b576f70d869a156d2a1b890bb3df62baf32f70260801c5b61800082161561452b576f31be135f97d08fd981231505542fcfa60260801c5b6201000082161561454c576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561456c576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561458b576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156145a8576b048a170391f7dc42444e8fa20260801c5b5f8413156145d3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff045b63ffffffff0160201c9392505050565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f826001600160a01b0316846001600160a01b03161115614669579192915b5f614694856001600160a01b0316856001600160a01b03166c01000000000000000000000000614af6565b90506120d26146af84838888036001600160a01b0316614af6565b614b46565b600480546040517fc72e160b0000000000000000000000000000000000000000000000000000000081526001600160a01b0387811693820193909352858316602482015284831660448201526fffffffffffffffffffffffffffffffff841660648201525f928392169063c72e160b906084016040805180830381865afa158015614741573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061476591906155ba565b909250905061479161477a6020890189614f4b565b61478a60408a0160208b01614f4b565b8484610e28565b6040517f020000000000000000000000000000000000000000000000000000000000000060208201527f0d0000000000000000000000000000000000000000000000000000000000000060218201525f90602201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b60608152602001906001900390816148265790505090508861484e6080820160608301615862565b61485e60808c0160608d01615862565b60020b61486a8a614b89565b60020b8161487a5761487a61520f565b050261488c60808c0160608d01615862565b61489c60808d0160608e01615862565b60020b6148a88a614b89565b60020b816148b8576148b861520f565b0502600a886103ff026fffffffffffffffffffffffffffffffff16901c878730306040516020016148f891906001600160a01b0391909116815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261493a989796959493929160200161587d565b604051602081830303815290604052815f8151811061495b5761495b6151c3565b6020026020010181905250885f0160208101906149789190614f4b565b61498860408b0160208c01614f4b565b604080516001600160a01b0393841660208201529290911690820152606001604051602081830303815290604052816001815181106149c9576149c96151c3565b60200260200101819052505f42603c0190505f6149fe8b5f0160208101906149f19190614f4b565b6001600160a01b03161590565b614a08575f614a0a565b855b905073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b031663dd46508f828686604051602001614a439291906152c3565b604051602081830303815290604052856040518463ffffffff1660e01b8152600401614a70929190615396565b5f604051808303818588803b158015614a87575f80fd5b505af1158015614a99573d5f803e3d5ffd5b50505050505050505050505050505050565b6040515f90614aca908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b815f528060020b60045260245ffd5b5f838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870982811083820303915050808411614b34575f80fd5b805f036133bb57508290049050612282565b806fffffffffffffffffffffffffffffffff811681146120db576120db7f93dafdf100000000000000000000000000000000000000000000000000000000614e86565b5f73fffd8963efd1fc6a506488495d951d51639616827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffd895d83016001600160a01b03161115614bfb57614bfb7f614875240000000000000000000000000000000000000000000000000000000083614e8e565b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b16805f614c2582614ea3565b60ff16905060808110614c4057607f810383901c9150614c4a565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581027ffffffffffffffffffffffffffffffffffd709b7e5480fba5a50fed5e62ffc5568101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b14614e7757886001600160a01b0316614e5c826142e6565b6001600160a01b03161115614e715781614e79565b80614e79565b815b9998505050505050505050565b805f5260045ffd5b815f526001600160a01b03811660045260245ffd5b5f808211614eaf575f80fd5b507f0706060506020500060203020504000106050205030304010505030400000000601f6f8421084210842108cc6318c6db6d54be6fffffffffffffffffffffffffffffffff841160071b84811c67ffffffffffffffff1060061b1784811c63ffffffff1060051b1784811c61ffff1060041b1784811c60ff1060031b1793841c1c161a1790565b6001600160a01b03811681146126a0575f80fd5b5f60208284031215614f5b575f80fd5b813561228281614f37565b5f805f60608486031215614f78575f80fd5b8335614f8381614f37565b92506020840135614f9381614f37565b929592945050506040919091013590565b5f60208284031215614fb4575f80fd5b5035919050565b5f8060408385031215614fcc575f80fd5b8235614fd781614f37565b946020939093013593505050565b69ffffffffffffffffffff811681146126a0575f80fd5b5f806040838503121561500d575f80fd5b8235805f0b811461501c575f80fd5b9150602083013561502c81614fe5565b809150509250929050565b5f805f806080858703121561504a575f80fd5b843561505581614f37565b9350602085013561506581614f37565b93969395505050506040820135916060013590565b5f805f6060848603121561508c575f80fd5b505081359360208301359350604090920135919050565b5f80602083850312156150b4575f80fd5b823567ffffffffffffffff8111156150ca575f80fd5b8301601f810185136150da575f80fd5b803567ffffffffffffffff8111156150f0575f80fd5b8560208260051b8401011115615104575f80fd5b6020919091019590945092505050565b5f805f805f85870361012081121561512a575f80fd5b60a0811215615137575f80fd5b5085945060a086013561514981614f37565b935060c086013561515981614fe5565b925060e086013561516981614fe5565b94979396509194610100013592915050565b5f805f6060848603121561518d575f80fd5b833561519881614f37565b925060208401356151a881614f37565b915060408401356151b881614f37565b809150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215615200575f80fd5b81518015158114612282575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6020828403121561524c575f80fd5b815180600f0b8114612282575f80fd5b5f6020828403121561526c575f80fd5b815161228281614f37565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f6152d56040830185615277565b828103602084015280845180835260208301915060208160051b840101602087015f5b83811015615348577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552615332838351615277565b60209586019590935091909101906001016152f8565b509098975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610e2257610e22615356565b604081525f6153a86040830185615277565b90508260208301529392505050565b81810381811115610e2257610e22615356565b5f61ffff8216806153dd576153dd615356565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b5f60ff8216806153dd576153dd615356565b5f8261544a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f6020828403121561545f575f80fd5b5051919050565b6fffffffffffffffffffffffffffffffff8181168382160190811115610e2257610e22615356565b5f6020828403121561549e575f80fd5b81516fffffffffffffffffffffffffffffffff81168114612282575f80fd5b60405160a0810167ffffffffffffffff81118282101715615505577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405290565b62ffffff811681146126a0575f80fd5b8060020b81146126a0575f80fd5b5f8082840360c081121561553b575f80fd5b60a0811215615548575f80fd5b506155516154bd565b835161555c81614f37565b8152602084015161556c81614f37565b6020820152604084015161557f8161550b565b604082015260608401516155928161551b565b606082015260808401516155a581614f37565b608082015260a0939093015192949293505050565b5f80604083850312156155cb575f80fd5b505080516020909101519092909150565b5f602082840312156155ec575f80fd5b815161228281614fe5565b8082028115828204841417610e2257610e22615356565b5f6020828403121561561e575f80fd5b815160ff81168114612282575f80fd5b5f82810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808112607f82131715610e2257610e22615356565b5f60a082840312801561567d575f80fd5b506156866154bd565b823561569181614f37565b815260208301356156a181614f37565b602082015260408301356156b48161550b565b604082015260608301356156c78161551b565b606082015260808301356156da81614f37565b60808201529392505050565b5f61ffff821661ffff81036156fd576156fd615356565b60010192915050565b5f60ff821660ff81036156fd576156fd615356565b5f805f6060848603121561572d575f80fd5b835161573881614f37565b602085015160409095015190969495509392505050565b5f6020828403121561575f575f80fd5b81516122828161550b565b5f610100820190506001600160a01b0383511682526001600160a01b03602084015116602083015262ffffff604084015116604083015260608301516157bb60608401826001600160a01b03169052565b506080830151608083015260a083015160a083015260c083015160c083015260e08301516157f460e08401826001600160a01b03169052565b5092915050565b6fffffffffffffffffffffffffffffffff81811683821602908116908181146157f4576157f4615356565b5f81600f0b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000810361585a5761585a615356565b5f0392915050565b5f60208284031215615872575f80fd5b81356122828161551b565b5f893561588981614f37565b6001600160a01b0316825260208a01356158a281614f37565b6001600160a01b0316602083015260408a01356158be8161550b565b62ffffff16604083015260608a01356158d68161551b565b60020b606083015260808a01356158ec81614f37565b6001600160a01b03166080830152600289810b60a084015288900b60c08301526fffffffffffffffffffffffffffffffff871660e083015285610100830152846101208301526159486101408301856001600160a01b03169052565b61018061016083015261595f610180830184615277565b9a995050505050505050505056fea26469706673582212209d3850561ac3d2a187c3b6a7fffa60de9314c1dc3f012616361833c4b0b2824464736f6c634300081a0033