5 txs
6 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
0x60e060405273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260a0527388e6a0c2ddd26feeb64f039a2c41296fcb3f564060c052600e805460ff199081169091556018805482169055601c80549091169055348015610075575f80fd5b5061007f33610202565b6080516001600160a01b039081165f908152600160208190526040808320805460ff19908116841790915560a05190941680845281842080548616841790559280527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb498054909416909117909255905163095ea7b360e01b815273e592427a0aece92de3edee1f18e0157c0586156460048201525f19602482015263095ea7b3906044016020604051808303815f875af115801561013f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101639190610377565b5060805160405163095ea7b360e01b815273e592427a0aece92de3edee1f18e0157c0586156460048201525f1960248201526001600160a01b039091169063095ea7b3906044016020604051808303815f875af11580156101c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ea9190610377565b506101f433610251565b6101fd336102b8565b61039d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610259610318565b600280546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917e7582b62407f53d49cfc72e7ddab574c06ef3b8aced104b54b7bed4681ee54a91015b60405180910390a15050565b6102c0610318565b600380546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917f9fb5233a5c1113ee4f5aafa72ecf995c4c5bc0c057ecbcad707ea04ebc829c6691016102ac565b5f546001600160a01b031633146103755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b5f60208284031215610387575f80fd5b81518015158114610396575f80fd5b9392505050565b60805160a05160c051615f0b6104425f395f50505f81816110f8015281816116b801528181611d4f01528181611e270152818161212a0152818161215d0152818161252e01528181613843015281816139070152818161397d01528181613b52015261406e01525f81816110c60152818161179101528181611d2d015281816124c1015281816125e5015281816128bc015281816128ef0152613f960152615f0b5ff3fe6080604052600436106102e1575f3560e01c80638172047911610186578063bc329198116100dc578063df2a558b11610087578063f2fde38b11610062578063f2fde38b14610927578063f60b36e314610946578063f77c479114610965575f80fd5b8063df2a558b14610891578063e2f4dd43146108bf578063ed4ab0f8146108e6575f80fd5b8063c31c9c07116100b7578063c31c9c0714610824578063c45a01551461084b578063c4b19b5414610872575f80fd5b8063bc329198146107a7578063bf0e622b146107c0578063c0c8eca614610802575f80fd5b80639ba692491161013c578063b17acdcd11610117578063b17acdcd1461074a578063b1df47d814610769578063b3a5794314610788575f80fd5b80639ba69249146106cb578063a9e88b8f146106df578063ac75886f1461071d575f80fd5b80638da5cb5b1161016c5780638da5cb5b1461066457806392eefe9b1461068d5780639a7fe3a1146106ac575f80fd5b806381720479146106065780638abb98451461063a575f80fd5b806339040ed11161023b5780634a2539c3116101f1578063677342ce116101cc578063677342ce146105b457806369953501146105d3578063715018a6146105f2575f80fd5b80634a2539c3146105345780635a29638d1461055357806363011d1a1461057f575f80fd5b8063439370b111610221578063439370b1146104ee578063483e0cd7146104f6578063495915d314610515575f80fd5b806339040ed11461049557806342d9843e146104c0575f80fd5b806319cc33571161029b5780633018205f116102765780633018205f1461042d57806332c4171d14610457578063338b5dea14610476575f80fd5b806319cc3357146103db5780631b9a91a4146103ef5780631fba9eda1461040e575f80fd5b806302c512ca116102cb57806302c512ca14610325578063041ae880146103905780630acc8cd1146103bc575f80fd5b8062ae3bf8146102e557806301e3366714610306575b5f80fd5b3480156102f0575f80fd5b506103046102ff36600461544b565b610991565b005b348015610311575f80fd5b50610304610320366004615466565b610b5d565b348015610330575f80fd5b5061036661033f3660046154a4565b601a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561039b575f80fd5b506003546103669073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103c7575f80fd5b506103046103d636600461544b565b610d37565b3480156103e6575f80fd5b50610304610dc4565b3480156103fa575f80fd5b506103046104093660046154bb565b610df9565b348015610419575f80fd5b506103666104283660046154fc565b610ef1565b348015610438575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610366565b348015610462575f80fd5b50610304610471366004615537565b610f53565b348015610481575f80fd5b506103046104903660046154bb565b6111b3565b3480156104a0575f80fd5b50600e546104ae9060ff1681565b60405160ff9091168152602001610387565b3480156104cb575f80fd5b506104ae6104da3660046154a4565b60196020525f908152604090205460ff1681565b610304611389565b348015610501575f80fd5b5061030461051036600461557a565b6113c3565b348015610520575f80fd5b5061030461052f3660046155a3565b611570565b34801561053f575f80fd5b5061030461054e3660046154a4565b611825565b34801561055e575f80fd5b506004546103669073ffffffffffffffffffffffffffffffffffffffff1681565b34801561058a575f80fd5b50610593611cea565b6040516fffffffffffffffffffffffffffffffff9091168152602001610387565b3480156105bf575f80fd5b506105936105ce3660046154a4565b61219c565b3480156105de575f80fd5b506103046105ed36600461544b565b61231d565b3480156105fd575f80fd5b5061030461236c565b348015610611575f80fd5b50610625610620366004615537565b61237f565b60408051928352602083019190915201610387565b348015610645575f80fd5b5060035473ffffffffffffffffffffffffffffffffffffffff16610366565b34801561066f575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff16610366565b348015610698575f80fd5b506103046106a736600461544b565b61242a565b3480156106b7575f80fd5b506105936106c636600461544b565b6124ae565b3480156106d6575f80fd5b506105936124ed565b3480156106ea575f80fd5b5061070d6106f936600461544b565b60016020525f908152604090205460ff1681565b6040519015158152602001610387565b348015610728575f80fd5b5061073c6107373660046154a4565b61292a565b604051908152602001610387565b348015610755575f80fd5b506103046107643660046154a4565b612940565b348015610774575f80fd5b5061073c610783366004615614565b61294d565b348015610793575f80fd5b506103666107a236600461567b565b612f1b565b3480156107b2575f80fd5b506018546104ae9060ff1681565b3480156107cb575f80fd5b506107ef6107da36600461544b565b60056020525f908152604090205461ffff1681565b60405161ffff9091168152602001610387565b34801561080d575f80fd5b506103666e04444c5dc75cb358380d2e3de08a9081565b34801561082f575f80fd5b5061036673e592427a0aece92de3edee1f18e0157c0586156481565b348015610856575f80fd5b50610366731f98431c8ad98523631ae4a59f267346ea31f98481565b34801561087d575f80fd5b5061036661088c3660046154a4565b612f98565b34801561089c575f80fd5b506104ae6108ab36600461544b565b600f6020525f908152604090205460ff1681565b3480156108ca575f80fd5b5061036673bd216513d74c8cf14cf4747e6aaa6420ff64ee9e81565b3480156108f1575f80fd5b506103666109003660046154a4565b601b6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015610932575f80fd5b5061030461094136600461544b565b612fc4565b348015610951575f80fd5b5061030461096036600461544b565b613078565b348015610970575f80fd5b506002546103669073ffffffffffffffffffffffffffffffffffffffff1681565b610999613360565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600f6020526040902054600e5460ff918216911681101580610a1957508173ffffffffffffffffffffffffffffffffffffffff1660068260ff16600881106109fe576109fe6156c3565b015473ffffffffffffffffffffffffffffffffffffffff1614155b610a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616e6e6f74202772657363756527206465706f73697473000000000000000060448201526064015b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610abe5f5473ffffffffffffffffffffffffffffffffffffffff1690565b610ac7856133e0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af1158015610b34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b5891906156f0565b505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a7b565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610c50573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7491906156f0565b610cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610a7b565b610ce383613495565b6040805173ffffffffffffffffffffffffffffffffffffffff85168152602081018390527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a1505050565b610d3f613360565b6003805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560408051938452911660208301819052917f9fb5233a5c1113ee4f5aafa72ecf995c4c5bc0c057ecbcad707ea04ebc829c6691015b60405180910390a15050565b610dcc613360565b601c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60035473ffffffffffffffffffffffffffffffffffffffff163314610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a7b565b60405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083905f818181858888f19350505050158015610eba573d5f803e3d5ffd5b50604080515f8152602081018390527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59101610db8565b5f80610f2c8369ffffffffffffffffffff16780100000000000000000000000000000000000000000000000086600c0160ff16600a0a613697565b9050610f378161219c565b6fffffffffffffffffffffffffffffffff169150505b92915050565b60025473ffffffffffffffffffffffffffffffffffffffff16331480610f7857503330145b610fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a7b565b5f610fe8856133e0565b90505f610ff4856133e0565b90508382101580156110065750828110155b156110125750506111ad565b5f805f84871061102457848703611026565b5f5b915083861061103757838603611039565b5f5b9050868510801561104957508584115b1561107f5785840392505f611063898b8686613a98613760565b91505080831061107557808303611077565b5f5b9250506110bf565b858410801561108d57508685115b156110bf5786850392505f6110a78a8a8685613a98613760565b9150508082106110b9578082036110bb565b5f5b9250505b6110ec89897f00000000000000000000000000000000000000000000000000000000000000008585613c5d565b909250905061111e89897f00000000000000000000000000000000000000000000000000000000000000008585613c5d565b909250905061113089895f8585613c5d565b909250905081158015611141575080155b6111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f556e64657266756e6465640000000000000000000000000000000000000000006044820152606401610a7b565b50505050505b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a7b565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810182905273ffffffffffffffffffffffffffffffffffffffff8316906323b872dd906064016020604051808303815f875af11580156112aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112ce91906156f0565b611334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610a7b565b61133d82613d6c565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c49101610db8565b604080515f81523460208201527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4910160405180910390a1565b60025473ffffffffffffffffffffffffffffffffffffffff163314611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a7b565b5f838152601a6020908152604080832054601b90925282205473ffffffffffffffffffffffffffffffffffffffff91821692911690611482836133e0565b90505f61148e836133e0565b600480546040517f080085220000000000000000000000000000000000000000000000000000000081529182018a905273ffffffffffffffffffffffffffffffffffffffff87811660248401528681166044840152606483018690526084830184905260a483018a905260c483018990529293505f92169063080085229060e401602060405180830381865afa15801561152a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154e919061570f565b905061155a88826141c2565b61156685868989610f53565b5050505050505050565b611578613360565b601c5460ff16156115e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f6c6f636b656400000000000000000000000000000000000000000000000000006044820152606401610a7b565b5f6115ee6124ed565b600802666a94d74f4300000190505f5b60ff81168311156111ad575f84848360ff1681811061161f5761161f6156c3565b9050602002016020810190611634919061544b565b73ffffffffffffffffffffffffffffffffffffffff8181165f8181526001602081905260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790556004805491517f7afd0a86000000000000000000000000000000000000000000000000000000008152908101929092527f0000000000000000000000000000000000000000000000000000000000000000831660248301526fffffffffffffffffffffffffffffffff87166044830152929350911690637afd0a86906064016020604051808303815f875af1158015611721573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611745919061572f565b50600480546040517f7afd0a8600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff86166044820152911690637afd0a86906064016020604051808303815f875af11580156117f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061181b919061572f565b50506001016115fe565b60025473ffffffffffffffffffffffffffffffffffffffff1633146118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a7b565b5f818152601a6020908152604080832054601b90925282205473ffffffffffffffffffffffffffffffffffffffff918216929116906118e4836133e0565b90505f6118f0836133e0565b90505f60036011604051602001611911929190918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b60608152602001906001900390816119525790505060408051602081018a90525f9181018290526060810182905260808082015260a081019190915290915060c001604051602081830303815290604052815f815181106119b5576119b56156c3565b6020908102919091018101919091526040805173ffffffffffffffffffffffffffffffffffffffff808a16938201939093529187169082015230606082015260800160405160208183030381529060405281600181518110611a1957611a196156c3565b602002602001018190525073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e73ffffffffffffffffffffffffffffffffffffffff1663dd46508f8383604051602001611a67929190615796565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052611aa042603c615856565b6040518363ffffffff1660e01b8152600401611abd929190615869565b5f604051808303815f87803b158015611ad4575f80fd5b505af1158015611ae6573d5f803e3d5ffd5b505050505f84611af5886133e0565b611aff919061588a565b90505f84611b0c886133e0565b611b16919061588a565b73ffffffffffffffffffffffffffffffffffffffff89165f908152600560205260408120805492935061ffff9092169190611b508361589d565b82546101009290920a61ffff81810219909316918316021790915573ffffffffffffffffffffffffffffffffffffffff89165f90815260056020526040812080549092169250611b9f8361589d565b825461ffff9182166101009390930a9283029190920219909116179055506018805460ff16905f611bcf836158d8565b82546101009290920a60ff81810219909316918316021790915560185416159050611c7b575f8981526019602052604090205460185460ff918216916010911660088110611c1f57611c1f6156c3565b015460108260ff1660088110611c3757611c376156c3565b01558060195f601060ff841660088110611c5357611c536156c3565b015481526020019081526020015f205f6101000a81548160ff021916908360ff160217905550505b604080518a815273ffffffffffffffffffffffffffffffffffffffff8a81166020830152891681830152606081018490526080810183905290517f5501b833962ceaf131361ff8d59683c382ab00f523035d0fc4c2ffc19bef3a459181900360a00190a1505050505050505050565b5f611cf8620f424047615917565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909150611dd5907f0000000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906024015b602060405180830381865afa158015611dac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd0919061594f565b61449e565b611ddf9082615966565b90505f5b600e5460ff9081169082161015611ebd57611eb160068260ff1660088110611e0d57611e0d6156c3565b015473ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000600660ff851660088110611e5c57611e5c6156c3565b01546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401611d91565b90910190600101611de3565b505f5b60185460ff9081169082161015612198575f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e631efeed33601060ff851660088110611f0257611f026156c3565b01546040518263ffffffff1660e01b8152600401611f2291815260200190565b602060405180830381865afa158015611f3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f61919061598e565b90505f8073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e637ba03aad601060ff871660088110611f9557611f956156c3565b01546040518263ffffffff1660e01b8152600401611fb591815260200190565b60c060405180830381865afa158015611fd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff49190615a29565b915091505f61201d6120078460a0902090565b6e04444c5dc75cb358380d2e3de08a9090614631565b50506004549192505f9182915073ffffffffffffffffffffffffffffffffffffffff1663c72e160b8461205b6120568860081c60020b90565b614716565b61206b6120568960201c60020b90565b60405160e085901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9384166004820152918316602483015290911660448201526fffffffffffffffffffffffffffffffff891660648201526084016040805180830381865afa1580156120f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061211d9190615aba565b9150915061214f855f01517f00000000000000000000000000000000000000000000000000000000000000008461449e565b8801975061218285602001517f00000000000000000000000000000000000000000000000000000000000000008361449e565b90970196505060019094019350611ec092505050565b5090565b5f815f036121ab57505f919050565b81600170010000000000000000000000000000000082106121d15760809190911c9060401b5b6801000000000000000082106121ec5760409190911c9060201b5b64010000000082106122035760209190911c9060101b5b6201000082106122185760109190911c9060081b5b610100821061222c5760089190911c9060041b5b6010821061223f5760049190911c9060021b5b6008821061224b5760011b5b600181858161225c5761225c6158ea565b048201901c90506001818581612274576122746158ea565b048201901c9050600181858161228c5761228c6158ea565b048201901c905060018185816122a4576122a46158ea565b048201901c905060018185816122bc576122bc6158ea565b048201901c905060018185816122d4576122d46158ea565b048201901c905060018185816122ec576122ec6158ea565b0491909101901c5f6122fe8286615917565b905080821061230d578061230f565b815b95945050505050565b919050565b612325613360565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612374613360565b61237d5f614a13565b565b6002545f90819073ffffffffffffffffffffffffffffffffffffffff163314806123a857503330145b61240e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a7b565b61241d86868686613a98613760565b9150915094509492505050565b612432613360565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560408051938452911660208301819052917e7582b62407f53d49cfc72e7ddab574c06ef3b8aced104b54b7bed4681ee54a9101610db8565b5f806124b9836133e0565b90506124e6837f00000000000000000000000000000000000000000000000000000000000000008361449e565b9392505050565b600480546040517fea4bc51c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116938201939093525f929091169063ea4bc51c90602401602060405180830381865afa158015612580573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125a49190615adc565b6125c29069ffffffffffffffffffff16670de0b6b3a7640000615af7565b6125de906fffffffffffffffffffffffffffffffff1647615917565b90506126097f00000000000000000000000000000000000000000000000000000000000000006124ae565b6126139082615966565b90505f5b600e5460ff908116908216101561266a5761265e60068260ff1660088110612641576126416156c3565b015473ffffffffffffffffffffffffffffffffffffffff166124ae565b90910190600101612617565b505f5b60185460ff9081169082161015612198575f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e631efeed33601060ff8516600881106126af576126af6156c3565b01546040518263ffffffff1660e01b81526004016126cf91815260200190565b602060405180830381865afa1580156126ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061270e919061598e565b90505f8073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e637ba03aad601060ff871660088110612742576127426156c3565b01546040518263ffffffff1660e01b815260040161276291815260200190565b60c060405180830381865afa15801561277d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a19190615a29565b915091505f6127b46120078460a0902090565b50506004549192505f9182915073ffffffffffffffffffffffffffffffffffffffff1663c72e160b846127ed6120568860081c60020b90565b6127fd6120568960201c60020b90565b60405160e085901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9384166004820152918316602483015290911660448201526fffffffffffffffffffffffffffffffff891660648201526084016040805180830381865afa15801561288b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128af9190615aba565b915091506128e1855f01517f00000000000000000000000000000000000000000000000000000000000000008461449e565b8801975061291485602001517f00000000000000000000000000000000000000000000000000000000000000008361449e565b9097019650506001909401935061266d92505050565b60108160088110612939575f80fd5b0154905081565b61294a815f6141c2565b50565b6002545f9073ffffffffffffffffffffffffffffffffffffffff1633146129d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610a7b565b601854600860ff90911610612a41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574206f66206d656d6f7279000000000000000000000000000000000000006044820152606401610a7b565b73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e73ffffffffffffffffffffffffffffffffffffffff166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a9e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ac2919061594f565b90505f73ffffffffffffffffffffffffffffffffffffffff8616612ae9602089018961544b565b73ffffffffffffffffffffffffffffffffffffffff1614612b1657612b11602088018861544b565b612b26565b612b26604088016020890161544b565b90505f8673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b969190615b29565b8273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bdf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c039190615b29565b612c0d9190615b49565b90505f612c1f83896107a2858b610ef1565b90505f612c31848a6107a2868b610ef1565b90505f612c50612007612c49368e90038e018e615b87565b60a0902090565b50505090508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161115612c8d579091905b5f612c9984848a614a87565b9050612ca88c83868685614b32565b85601a5f8981526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a601b5f8981526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81819054906101000a900461ffff1680929190612da090615c01565b82546101009290920a61ffff81810219909316918316021790915573ffffffffffffffffffffffffffffffffffffffff8d165f90815260056020526040812080549092169250612def83615c01565b825461ffff9182166101009390930a928302919092021990911617905550601854879060109060ff1660088110612e2857612e286156c3565b0155601880545f89815260196020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff93841617905582549091169190612e7783615c21565b82546101009290920a60ff818102199093169190921691909102179055506040805188815273ffffffffffffffffffffffffffffffffffffffff88811660208301528d168183015269ffffffffffffffffffff8c811660608301528b16608082015260a081018a905290517f29cd472535c058e9f744cc9cead6f8c38cbe5ea230674d825060f275884bdd729181900360c00190a150505050505095945050505050565b5f8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161015612f575750806124e6565b612f9073ffffffffffffffffffffffffffffffffffffffff83167801000000000000000000000000000000000000000000000000615917565b949350505050565b60068160088110612fa7575f80fd5b015473ffffffffffffffffffffffffffffffffffffffff16905081565b612fcc613360565b73ffffffffffffffffffffffffffffffffffffffff811661306f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a7b565b61294a81614a13565b60025473ffffffffffffffffffffffffffffffffffffffff163314806130b457505f5473ffffffffffffffffffffffffffffffffffffffff1633145b61311a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4163636573732064656e696564000000000000000000000000000000000000006044820152606401610a7b565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001602052604090205460ff166131a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c696420746f6b656e000000000000000000000000000000000000006044820152606401610a7b565b60185460ff165b60ff811615613248577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0130634a2539c3601060ff8416600881106131f6576131f66156c3565b01546040518263ffffffff1660e01b815260040161321691815260200190565b5f604051808303815f87803b15801561322d575f80fd5b505af115801561323f573d5f803e3d5ffd5b505050506131af565b50600e5460ff165b60ff8116156132eb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f600660ff831660088110613292576132926156c3565b015473ffffffffffffffffffffffffffffffffffffffff9081169150831681146132e5576132e281846132c4846133e0565b73ffffffffffffffffffffffffffffffffffffffff620124f8613760565b50505b50613250565b50600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016905560405173ffffffffffffffffffffffffffffffffffffffff821681527f2cc79b200fc7fdf7af6be005fc77813bfacedb82066816356eed5b7df46194709060200160405180910390a150565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7b565b5f73ffffffffffffffffffffffffffffffffffffffff82161561348e576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015613465573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613489919061594f565b610f4d565b4792915050565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600f6020526040902054600e5460ff91821691168110801561351457508173ffffffffffffffffffffffffffffffffffffffff1660068260ff16600881106134fa576134fa6156c3565b015473ffffffffffffffffffffffffffffffffffffffff16145b801561352857506064613526836133e0565b105b801561355a575073ffffffffffffffffffffffffffffffffffffffff82165f9081526005602052604090205461ffff16155b1561369357600e805460ff16905f613571836158d8565b82546101009290920a60ff818102199093169183160217909155600e541615905061369357600e5460069060ff16600881106135af576135af6156c3565b015473ffffffffffffffffffffffffffffffffffffffff16600660ff8316600881106135dd576135dd6156c3565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905580600f5f600660ff84166008811061363b5761363b6156c3565b015473ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff929092169190911790555b5050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f036136ea575f84116136df575f80fd5b5082900490506124e6565b8084116136f5575f80fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600480546040517f64aa79a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116938201939093528683166024820152604481018690526064810185905262ffffff841660848201525f92839283928392909116906364aa79a39060a401606060405180830381865afa1580156137fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061381e9190615c36565b909550909250905073ffffffffffffffffffffffffffffffffffffffff89166138bf577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b1580156138a7575f80fd5b505af11580156138b9573d5f803e3d5ffd5b50505050505b5f6040518061010001604052805f73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614613905578b613927565b7f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff161461397b578a61399d565b7f00000000000000000000000000000000000000000000000000000000000000005b73ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a259190615c6a565b62ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018681526020018381526020015f73ffffffffffffffffffffffffffffffffffffffff16815250905073e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b8152600401613ac69190615c85565b6020604051808303815f875af1158015613ae2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b06919061594f565b935073ffffffffffffffffffffffffffffffffffffffff8916613bc3576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024015f604051808303815f87803b158015613ba8575f80fd5b505af1158015613bba573d5f803e3d5ffd5b50505050613bcc565b613bcc89613d6c565b73ffffffffffffffffffffffffffffffffffffffff8a1615613bf157613bf18a613495565b6040805173ffffffffffffffffffffffffffffffffffffffff808d1682528b166020820152908101869052606081018590527f25f1d03755df23c30e25db2dbd3891e31ce084bdfbfc46f9fe5e446ee5f9b2d49060800160405180910390a15050509550959350505050565b5f808473ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015613cc757508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15613d60575f613cd6866133e0565b9050620f42408110158015613cea57505f85115b15613d1f575f80613d00888b858a613a98613760565b915091508183039250868111613d1857808703613d1a565b5f5b965050505b620f42408110158015613d3157505f84115b15613d5e575f613d4687898488613a98613760565b915050848111613d5857808503613d5a565b5f5b9450505b505b50919590945092505050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273e592427a0aece92de3edee1f18e0157c0586156460048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602482015273ffffffffffffffffffffffffffffffffffffffff82169063095ea7b3906044016020604051808303815f875af1158015613e0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e3391906156f0565b5073ffffffffffffffffffffffffffffffffffffffff81165f818152600f602052604090205460069060ff1660088110613e6f57613e6f6156c3565b015473ffffffffffffffffffffffffffffffffffffffff16141580613ec15750600e5473ffffffffffffffffffffffffffffffffffffffff82165f908152600f602052604090205460ff918216911610155b1561294a57600e54600860ff90911610613f37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574206f66206d656d6f7279000000000000000000000000000000000000006044820152606401610a7b565b5f613f406124ed565b613f4b906004615af7565b600480546040517f7afd0a8600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff841660448201529293501690637afd0a86906064016020604051808303815f875af1158015613ffe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614022919061572f565b50600480546040517f7afd0a8600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff84166044820152911690637afd0a86906064016020604051808303815f875af11580156140d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140f8919061572f565b50600e54829060069060ff1660088110614114576141146156c3565b01805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055600e80549184165f908152600f6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff9485161790558154909216916141a583615c21565b91906101000a81548160ff021916908360ff160217905550505050565b5f8082600f0b126141d3575f6141d6565b60015b5f83600f0b126141e757600d6141ea565b60115b604080516020810193909352820152606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b606081526020019060019003908161423d579050509050835f84600f0b12614265578361426e565b61426e84615d43565b6040805160208101939093526fffffffffffffffffffffffffffffffff909116908201525f606082018190526080820181905260a08083015260c082015260e001604051602081830303815290604052815f815181106142d0576142d06156c3565b6020908102919091018101919091525f858152601a8252604080822054601b84529181902054815173ffffffffffffffffffffffffffffffffffffffff9384169481019490945291909116908201523060608201526080016040516020818303038152906040528160018151811061434a5761434a6156c3565b602002602001018190525073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e73ffffffffffffffffffffffffffffffffffffffff1663dd46508f8383604051602001614398929190615796565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526143d142603c615856565b6040518363ffffffff1660e01b81526004016143ee929190615869565b5f604051808303815f87803b158015614405575f80fd5b505af1158015614417573d5f803e3d5ffd5b5050505f858152601a6020908152604080832054601b83529281902054815189815273ffffffffffffffffffffffffffffffffffffffff948516938101939093529290921681830152600f86900b606082015290517f1172e6c2fa5b068f7396efd2ed20f26bf1ce7899860acd635416a62a99bb975c92509081900360800190a150505050565b5f808473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156144e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061450d9190615b29565b90505f8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146145ff57600480546040517f2b06978300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116938201939093528783166024820152869290911690632b06978390604401602060405180830381865afa1580156145be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145e29190615adc565b69ffffffffffffffffffff166145f89190615d7f565b9050614611565b61460e8464e8d4a51000615d7f565b90505b8160ff16600a0a8181614626576146266158ea565b049695505050505050565b5f805f805f61463f86614f6a565b6040517f1e2eaeaf000000000000000000000000000000000000000000000000000000008152600481018290529091505f9073ffffffffffffffffffffffffffffffffffffffff891690631e2eaeaf90602401602060405180830381865afa1580156146ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146d1919061594f565b905073ffffffffffffffffffffffffffffffffffffffff811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b60020b5f60ff82901d80830118620d89e8811115614758576147587f8b86327a0000000000000000000000000000000000000000000000000000000084614fa6565b7001fffcb933bd6fad37aa2d162d1a59400160018216027001000000000000000000000000000000001860028216156147a1576ffff97272373d413259a46990580e213a0260801c5b60048216156147c0576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156147df576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156147fe576fffcb9843d60f6159c9db58835c9266440260801c5b602082161561481d576fff973b41fa98c081472e6896dfb254c00260801c5b604082161561483c576fff2ea16466c96a3843ec78b326b528610260801c5b608082161561485b576ffe5dee046a99a2a811c461f1969c30530260801c5b61010082161561487b576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b61020082161561489b576ff987a7253ac413176f2b074cf7815e540260801c5b6104008216156148bb576ff3392b0822b70005940c7a398e4b70f30260801c5b6108008216156148db576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156148fb576fd097f3bdfd2022b8845ad8f792aa58250260801c5b61200082161561491b576fa9f746462d870fdf8a65dc1f90e061e50260801c5b61400082161561493b576f70d869a156d2a1b890bb3df62baf32f70260801c5b61800082161561495b576f31be135f97d08fd981231505542fcfa60260801c5b6201000082161561497c576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561499c576e5d6af8dedb81196699c329225ee6040260801c5b620400008216156149bb576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156149d8576b048a170391f7dc42444e8fa20260801c5b5f841315614a03577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff045b63ffffffff0160201c9392505050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161115614ac0579192915b5f614b058573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000614fb5565b905061230f614b2d848388880373ffffffffffffffffffffffffffffffffffffffff16614fb5565b615005565b600480546040517fc72e160b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811693820193909352858316602482015284831660448201526fffffffffffffffffffffffffffffffff841660648201525f928392169063c72e160b906084016040805180830381865afa158015614bcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614bf09190615aba565b9092509050614c1c614c05602089018961544b565b614c1560408a0160208b0161544b565b8484610f53565b6040517f020000000000000000000000000000000000000000000000000000000000000060208201527f0d0000000000000000000000000000000000000000000000000000000000000060218201525f90602201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b6060815260200190600190039081614cb157905050905088614cd96080820160608301615d96565b614ce960808c0160608d01615d96565b60020b614cf58a615048565b60020b81614d0557614d056158ea565b0502614d1760808c0160608d01615d96565b614d2760808d0160608e01615d96565b60020b614d338a615048565b60020b81614d4357614d436158ea565b0502600a886103ff026fffffffffffffffffffffffffffffffff16901c87873030604051602001614d90919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052614dd29897969594939291602001615db1565b604051602081830303815290604052815f81518110614df357614df36156c3565b6020026020010181905250885f016020810190614e10919061544b565b614e2060408b0160208c0161544b565b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015260600160405160208183030381529060405281600181518110614e6e57614e6e6156c3565b60200260200101819052505f42603c0190505f614eb08b5f016020810190614e96919061544b565b73ffffffffffffffffffffffffffffffffffffffff161590565b614eba575f614ebc565b855b905073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e73ffffffffffffffffffffffffffffffffffffffff1663dd46508f828686604051602001614f02929190615796565b604051602081830303815290604052856040518463ffffffff1660e01b8152600401614f2f929190615869565b5f604051808303818588803b158015614f46575f80fd5b505af1158015614f58573d5f803e3d5ffd5b50505050505050505050505050505050565b6040515f90614f89908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b815f528060020b60045260245ffd5b5f838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870982811083820303915050808411614ff3575f80fd5b805f036136f5575082900490506124e6565b806fffffffffffffffffffffffffffffffff81168114612318576123187f93dafdf10000000000000000000000000000000000000000000000000000000061536c565b5f73fffd8963efd1fc6a506488495d951d51639616827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffd895d830173ffffffffffffffffffffffffffffffffffffffff1611156150c7576150c77f614875240000000000000000000000000000000000000000000000000000000083615374565b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b16805f6150f182615396565b60ff1690506080811061510c57607f810383901c9150615116565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581027ffffffffffffffffffffffffffffffffffd709b7e5480fba5a50fed5e62ffc5568101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461535d578873ffffffffffffffffffffffffffffffffffffffff1661533582614716565b73ffffffffffffffffffffffffffffffffffffffff161115615357578161535f565b8061535f565b815b9998505050505050505050565b805f5260045ffd5b815f5273ffffffffffffffffffffffffffffffffffffffff811660045260245ffd5b5f8082116153a2575f80fd5b507f0706060506020500060203020504000106050205030304010505030400000000601f6f8421084210842108cc6318c6db6d54be6fffffffffffffffffffffffffffffffff841160071b84811c67ffffffffffffffff1060061b1784811c63ffffffff1060051b1784811c61ffff1060041b1784811c60ff1060031b1793841c1c161a1790565b73ffffffffffffffffffffffffffffffffffffffff8116811461294a575f80fd5b5f6020828403121561545b575f80fd5b81356124e68161542a565b5f805f60608486031215615478575f80fd5b83356154838161542a565b925060208401356154938161542a565b929592945050506040919091013590565b5f602082840312156154b4575f80fd5b5035919050565b5f80604083850312156154cc575f80fd5b82356154d78161542a565b946020939093013593505050565b69ffffffffffffffffffff8116811461294a575f80fd5b5f806040838503121561550d575f80fd5b8235805f0b811461551c575f80fd5b9150602083013561552c816154e5565b809150509250929050565b5f805f806080858703121561554a575f80fd5b84356155558161542a565b935060208501356155658161542a565b93969395505050506040820135916060013590565b5f805f6060848603121561558c575f80fd5b505081359360208301359350604090920135919050565b5f80602083850312156155b4575f80fd5b823567ffffffffffffffff8111156155ca575f80fd5b8301601f810185136155da575f80fd5b803567ffffffffffffffff8111156155f0575f80fd5b8560208260051b8401011115615604575f80fd5b6020919091019590945092505050565b5f805f805f85870361012081121561562a575f80fd5b60a0811215615637575f80fd5b5085945060a08601356156498161542a565b935060c0860135615659816154e5565b925060e0860135615669816154e5565b94979396509194610100013592915050565b5f805f6060848603121561568d575f80fd5b83356156988161542a565b925060208401356156a88161542a565b915060408401356156b88161542a565b809150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215615700575f80fd5b815180151581146124e6575f80fd5b5f6020828403121561571f575f80fd5b815180600f0b81146124e6575f80fd5b5f6020828403121561573f575f80fd5b81516124e68161542a565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f6157a8604083018561574a565b828103602084015280845180835260208301915060208160051b840101602087015f5b8381101561581b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086840301855261580583835161574a565b60209586019590935091909101906001016157cb565b509098975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610f4d57610f4d615829565b604081525f61587b604083018561574a565b90508260208301529392505050565b81810381811115610f4d57610f4d615829565b5f61ffff8216806158b0576158b0615829565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b5f60ff8216806158b0576158b0615829565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261594a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f6020828403121561595f575f80fd5b5051919050565b6fffffffffffffffffffffffffffffffff8181168382160190811115610f4d57610f4d615829565b5f6020828403121561599e575f80fd5b81516fffffffffffffffffffffffffffffffff811681146124e6575f80fd5b60405160a0810167ffffffffffffffff81118282101715615a05577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405290565b62ffffff8116811461294a575f80fd5b8060020b811461294a575f80fd5b5f8082840360c0811215615a3b575f80fd5b60a0811215615a48575f80fd5b50615a516159bd565b8351615a5c8161542a565b81526020840151615a6c8161542a565b60208201526040840151615a7f81615a0b565b60408201526060840151615a9281615a1b565b60608201526080840151615aa58161542a565b608082015260a0939093015192949293505050565b5f8060408385031215615acb575f80fd5b505080516020909101519092909150565b5f60208284031215615aec575f80fd5b81516124e6816154e5565b6fffffffffffffffffffffffffffffffff8181168382160290811690818114615b2257615b22615829565b5092915050565b5f60208284031215615b39575f80fd5b815160ff811681146124e6575f80fd5b5f82810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808112607f82131715610f4d57610f4d615829565b5f60a0828403128015615b98575f80fd5b50615ba16159bd565b8235615bac8161542a565b81526020830135615bbc8161542a565b60208201526040830135615bcf81615a0b565b60408201526060830135615be281615a1b565b60608201526080830135615bf58161542a565b60808201529392505050565b5f61ffff821661ffff8103615c1857615c18615829565b60010192915050565b5f60ff821660ff8103615c1857615c18615829565b5f805f60608486031215615c48575f80fd5b8351615c538161542a565b602085015160409095015190969495509392505050565b5f60208284031215615c7a575f80fd5b81516124e681615a0b565b5f6101008201905073ffffffffffffffffffffffffffffffffffffffff835116825273ffffffffffffffffffffffffffffffffffffffff602084015116602083015262ffffff60408401511660408301526060830151615cfd606084018273ffffffffffffffffffffffffffffffffffffffff169052565b506080830151608083015260a083015160a083015260c083015160c083015260e0830151615b2260e084018273ffffffffffffffffffffffffffffffffffffffff169052565b5f81600f0b7fffffffffffffffffffffffffffffffff800000000000000000000000000000008103615d7757615d77615829565b5f0392915050565b8082028115828204841417610f4d57610f4d615829565b5f60208284031215615da6575f80fd5b81356124e681615a1b565b5f8935615dbd8161542a565b73ffffffffffffffffffffffffffffffffffffffff16825260208a0135615de38161542a565b73ffffffffffffffffffffffffffffffffffffffff16602083015260408a0135615e0c81615a0b565b62ffffff16604083015260608a0135615e2481615a1b565b60020b606083015260808a0135615e3a8161542a565b73ffffffffffffffffffffffffffffffffffffffff166080830152600289810b60a084015288900b60c08301526fffffffffffffffffffffffffffffffff871660e08301528561010083015284610120830152615eb061014083018573ffffffffffffffffffffffffffffffffffffffff169052565b610180610160830152615ec761018083018461574a565b9a995050505050505050505056fea2646970667358221220f15d7ade8be3efa53ae175bc6e4b8755c2ae2c9fd5a81332c18bc50e5b4691ee64736f6c634300081a0033