0 txs
14.1k calls
constructor
constructor(address _poolManager, address _lendingPool, address _baseAsset)
functions
balanceOf
viewfunction balanceOf(address owner) view returns (uint256)
borrowRateSnapshot
viewfunction borrowRateSnapshot() view returns (uint128 borrowIndex, uint80 lastInterestRate, uint48 timestamp)
collateralToken
viewfunction collateralToken() view returns (address)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
EMERGENCY_ROLE
viewfunction EMERGENCY_ROLE() view returns (bytes32)
fxUSD
viewfunction fxUSD() view returns (address)
getApproved
viewfunction getApproved(uint256 tokenId) view returns (address)
getCloseFeeRatio
viewfunction getCloseFeeRatio() view returns (uint256)
getDebtAndCollateralIndex
viewfunction getDebtAndCollateralIndex() view returns (uint256, uint256)
getDebtAndCollateralShares
viewfunction getDebtAndCollateralShares() view returns (uint256, uint256)
getDebtRatioRange
viewfunction getDebtRatioRange() view returns (uint256, uint256)
getFundingRatio
viewfunction getFundingRatio() view returns (uint256)
getLiquidateRatios
viewfunction getLiquidateRatios() view returns (uint256, uint256)
getMaxRedeemRatioPerTick
viewfunction getMaxRedeemRatioPerTick() view returns (uint256)
getNextPositionId
viewfunction getNextPositionId() view returns (uint32)
getNextTreeNodeId
viewfunction getNextTreeNodeId() view returns (uint48)
getOpenFeeRatio
viewfunction getOpenFeeRatio() view returns (uint256)
getOpenRatio
viewfunction getOpenRatio() view returns (uint256 ratio, uint256 step)
getPosition
viewfunction getPosition(uint256 tokenId) view returns (uint256 rawColls, uint256 rawDebts)
getPositionDebtRatio
viewfunction getPositionDebtRatio(uint256 tokenId) view returns (uint256 debtRatio)
getRebalanceRatios
viewfunction getRebalanceRatios() view returns (uint256, uint256)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getTopTick
viewfunction getTopTick() view returns (int16)
getTotalRawCollaterals
viewfunction getTotalRawCollaterals() view returns (uint256)
getTotalRawDebts
viewfunction getTotalRawDebts() view returns (uint256)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isApprovedForAll
viewfunction isApprovedForAll(address owner, address operator) view returns (bool)
isBorrowPaused
viewfunction isBorrowPaused() view returns (bool)
isRedeemPaused
viewfunction isRedeemPaused() view returns (bool)
name
viewfunction name() view returns (string)
ownerOf
viewfunction ownerOf(uint256 tokenId) view returns (address)
pegKeeper
viewfunction pegKeeper() view returns (address)
poolManager
viewfunction poolManager() view returns (address)
positionData
viewfunction positionData(uint256) view returns (int16 tick, uint48 nodeId, uint96 colls, uint96 debts)
positionMetadata
viewfunction positionMetadata(uint256) view returns (bytes32)
priceOracle
viewfunction priceOracle() view returns (address)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
symbol
viewfunction symbol() view returns (string)
tickBitmap
viewfunction tickBitmap(int8) view returns (uint256)
tickData
viewfunction tickData(int256) view returns (uint48)
tickTreeData
viewfunction tickTreeData(uint256) view returns (bytes32 metadata, bytes32 value)
tokenURI
viewfunction tokenURI(uint256 tokenId) view returns (string)
approve
nonpayablefunction approve(address to, uint256 tokenId)
getRootNodeAndCompress
nonpayablefunction getRootNodeAndCompress(uint256 node) returns (uint256 root, uint256 collRatio, uint256 debtRatio)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(address admin, string name_, string symbol_, address _collateralToken, address _priceOracle)
liquidate
nonpayablefunction liquidate(uint256 maxRawDebts, uint256 reservedRawColls) returns (tuple result)
operate
nonpayablefunction operate(uint256 positionId, int256 newRawColl, int256 newRawDebt, address owner) returns (uint256, int256, int256, uint256)
rebalance
nonpayablefunction rebalance(int16 tick, uint256 maxRawDebts) returns (tuple result)
rebalance
nonpayablefunction rebalance(uint256 maxRawDebts) returns (tuple result)
redeem
nonpayablefunction redeem(uint256 rawDebts) returns (uint256 rawColls)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
safeTransferFrom
nonpayablefunction safeTransferFrom(address from, address to, uint256 tokenId, bytes data)
safeTransferFrom
nonpayablefunction safeTransferFrom(address from, address to, uint256 tokenId)
setApprovalForAll
nonpayablefunction setApprovalForAll(address operator, bool approved)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 tokenId)
updateBorrowAndRedeemStatus
nonpayablefunction updateBorrowAndRedeemStatus(bool borrowStatus, bool redeemStatus)
updateCloseFeeRatio
nonpayablefunction updateCloseFeeRatio(uint256 ratio)
updateDebtRatioRange
nonpayablefunction updateDebtRatioRange(uint256 minRatio, uint256 maxRatio)
updateFundingRatio
nonpayablefunction updateFundingRatio(uint256 ratio)
updateLiquidateRatios
nonpayablefunction updateLiquidateRatios(uint256 debtRatio, uint256 bonusRatio)
updateMaxRedeemRatioPerTick
nonpayablefunction updateMaxRedeemRatioPerTick(uint256 ratio)
updateOpenRatio
nonpayablefunction updateOpenRatio(uint256 ratio, uint256 step)
updatePriceOracle
nonpayablefunction updatePriceOracle(address newOracle)
updateRebalanceRatios
nonpayablefunction updateRebalanceRatios(uint256 debtRatio, uint256 bonusRatio)
events
Approval
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)
ApprovalForAll
event ApprovalForAll(address indexed owner, address indexed operator, bool approved)
CollateralIndexSnapshot
event CollateralIndexSnapshot(uint256 index)
DebtIndexSnapshot
event DebtIndexSnapshot(uint256 index)
Initialized
event Initialized(uint64 version)
PositionSnapshot
event PositionSnapshot(uint256 position, int16 tick, uint256 collShares, uint256 debtShares, uint256 price)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
SnapshotAaveBorrowIndex
event SnapshotAaveBorrowIndex(uint256 borrowIndex, uint256 timestamp)
TickMovement
event TickMovement(int16 oldTick, int16 newTick, uint256 collShares, uint256 debtShares, uint256 price)
Transfer
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)
UpdateBorrowStatus
event UpdateBorrowStatus(bool status)
UpdateCloseFeeRatio
event UpdateCloseFeeRatio(uint256 oldRatio, uint256 newRatio)
UpdateDebtRatioRange
event UpdateDebtRatioRange(uint256 minDebtRatio, uint256 maxDebtRatio)
UpdateFundingRatio
event UpdateFundingRatio(uint256 oldRatio, uint256 newRatio)
UpdateLiquidateRatios
event UpdateLiquidateRatios(uint256 debtRatio, uint256 bonusRatio)
UpdateMaxRedeemRatioPerTick
event UpdateMaxRedeemRatioPerTick(uint256 ratio)
UpdateOpenRatio
event UpdateOpenRatio(uint256 ratio, uint256 step)
UpdatePriceOracle
event UpdatePriceOracle(address oldOracle, address newOracle)
UpdateRebalanceRatios
event UpdateRebalanceRatios(uint256 debtRatio, uint256 bonusRatio)
UpdateRedeemStatus
event UpdateRedeemStatus(bool status)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
ERC721IncorrectOwner
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner)
ERC721InsufficientApproval
error ERC721InsufficientApproval(address operator, uint256 tokenId)
ERC721InvalidApprover
error ERC721InvalidApprover(address approver)
ERC721InvalidOperator
error ERC721InvalidOperator(address operator)
ERC721InvalidOwner
error ERC721InvalidOwner(address owner)
ERC721InvalidReceiver
error ERC721InvalidReceiver(address receiver)
ERC721InvalidSender
error ERC721InvalidSender(address sender)
ERC721NonexistentToken
error ERC721NonexistentToken(uint256 tokenId)
ErrorBorrowPaused
error ErrorBorrowPaused()
ErrorCallerNotPoolManager
error ErrorCallerNotPoolManager()
ErrorCollateralTooSmall
error ErrorCollateralTooSmall()
ErrorDebtRatioTooLarge
error ErrorDebtRatioTooLarge()
ErrorDebtRatioTooSmall
error ErrorDebtRatioTooSmall()
ErrorDebtTooSmall
error ErrorDebtTooSmall()
ErrorInsufficientCollateralToLiquidate
error ErrorInsufficientCollateralToLiquidate()
ErrorNoSupplyAndNoBorrow
error ErrorNoSupplyAndNoBorrow()
ErrorNotPositionOwner
error ErrorNotPositionOwner()
ErrorOverflow
error ErrorOverflow()
ErrorPoolUnderCollateral
error ErrorPoolUnderCollateral()
ErrorPositionInLiquidationMode
error ErrorPositionInLiquidationMode()
ErrorRebalanceDebtRatioNotReached
error ErrorRebalanceDebtRatioNotReached()
ErrorRebalanceOnLiquidatablePosition
error ErrorRebalanceOnLiquidatablePosition()
ErrorRebalanceOnLiquidatableTick
error ErrorRebalanceOnLiquidatableTick()
ErrorRedeemPaused
error ErrorRedeemPaused()
ErrorTickNotMoved
error ErrorTickNotMoved()
ErrorValueTooLarge
error ErrorValueTooLarge()
ErrorWithdrawExceedSupply
error ErrorWithdrawExceedSupply()
ErrorZeroAddress
error ErrorZeroAddress()
InvalidInitialization
error InvalidInitialization()
NotInitializing
error NotInitializing()
creation bytecode
0x610120604052348015610010575f80fd5b5060405161623038038061623083398101604081905261002f9161015d565b82806001600160a01b031660a0816001600160a01b031681525050806001600160a01b0316636dbe4bb96040518163ffffffff1660e01b8152600401602060405180830381865afa158015610086573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100aa919061019d565b6001600160a01b03166080816001600160a01b031681525050806001600160a01b031662799a5e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100fe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610122919061019d565b6001600160a01b0390811660c05292831660e052501661010052506101bd565b80516001600160a01b0381168114610158575f80fd5b919050565b5f805f6060848603121561016f575f80fd5b61017884610142565b925061018660208501610142565b915061019460408501610142565b90509250925092565b5f602082840312156101ad575f80fd5b6101b682610142565b9392505050565b60805160a05160c05160e05161010051615fe96102475f395f8181611b5301528181611bff0152613bb401525f8181611b7d01528181611c2c0152613bec01525f81816103dd01528181610b950152612bc401525f81816109c501528181610a81015281816114ad015281816120220152818161233101526127d701525f6106fe0152615fe95ff3fe608060405234801561000f575f80fd5b50600436106103d4575f3560e01c806370f3c4b111610200578063b71348d11161011f578063dc4c90d3116100b4578063eb02c30111610084578063eb02c30114610a21578063ee65a03c14610a34578063efc5824014610a3c578063f499301814610a4f578063f9d45fd214610a62575f80fd5b8063dc4c90d3146109c0578063df9cbd3a146109e7578063e985e9c514610a06578063e9a0e8fa14610a19575f80fd5b8063d032c4e5116100ef578063d032c4e514610941578063d296d1f114610954578063d547741f1461099a578063db006a75146109ad575f80fd5b8063b71348d114610900578063b88d4fde14610913578063c64dc8ca14610926578063c87b56dd1461092e575f80fd5b806395e79d6111610195578063a22cb46511610165578063a22cb4651461085e578063a9cc2e3b14610871578063b2016bd4146108db578063b67b730b146108ed575f80fd5b806395e79d61146107a7578063960a8b92146107af578063a0ab910e146107ce578063a217fddf14610857575f80fd5b8063861b4cfe116101d0578063861b4cfe1461077157806391d1485414610784578063939c0a0c1461079757806395d89b411461079f575f80fd5b806370f3c4b11461073357806375413fdd1461073b5780637f20a8c61461074357806384c1999b1461075e575f80fd5b80632a033873116102f757806349f348371161028c57806363d36fa41161025c57806363d36fa4146106d6578063673835fd146106de5780636cf1dbed146106e65780636dbe4bb9146106f957806370a0823114610720575f80fd5b806349f3483714610667578063581bc9c914610695578063623d3a13146106bb5780636352211e146106c3575f80fd5b80633cd9b53c116102c75780633cd9b53c146106265780633dee1f441461062e5780633edf0d4e1461064157806342842e0e14610654575f80fd5b80632a033873146105e55780632f2ff15d146105ed57806336568abe1461060057806339d1fc8214610613575f80fd5b8063143d557c1161036d578063248a9ca31161033d578063248a9ca31461058557806324b3339214610598578063256f3eb4146105bf5780632630c12f146105d2575f80fd5b8063143d557c146105015780631a0dde1c1461051e57806320df43591461053d57806323b872dd14610572575f80fd5b806306fdde03116103a857806306fdde031461048f5780630723d571146104a4578063081812fc146104d9578063095ea7b3146104ec575f80fd5b8062799a5e146103d857806301ffc9a71461041c578063032d22761461043f578063067f4ddd14610472575b5f80fd5b6103ff7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61042f61042a366004615614565b610a6a565b6040519015158152602001610413565b61045261044d366004615643565b610a7a565b604080519485526020850193909352918301526060820152608001610413565b61047a6113da565b60405163ffffffff9091168152602001610413565b6104976113e8565b60405161041391906156af565b6104b76104b23660046156c1565b611489565b6040805182518152602080840151908201529181015190820152606001610413565b6103ff6104e73660046156f0565b61179a565b6104ff6104fa366004615707565b6117ae565b005b6105096117bd565b60408051928352602083019190915201610413565b6105266117cf565b60405165ffffffffffff9091168152602001610413565b6105647fbf233dd2aafeb4d50879c4aa5c81e96d92f6e6945c906a58f9f2d1c1631b4b2681565b604051908152602001610413565b6104ff610580366004615723565b6117d8565b6105646105933660046156f0565b611866565b6105266105a63660046156f0565b60096020525f908152604090205465ffffffffffff1681565b6104ff6105cd3660046156f0565b611886565b6001546103ff906001600160a01b031681565b610564611899565b6104ff6105fb366004615761565b6118a2565b6104ff61060e366004615761565b6118be565b6104ff61062136600461578f565b6118f6565b61042f611909565b6104ff61063c3660046157aa565b611919565b6104ff61064f3660046156f0565b61192d565b6104ff610662366004615723565b611940565b61067a6106753660046156f0565b61195a565b60408051938452602084019290925290820152606001610413565b6105096106a33660046156f0565b600a6020525f90815260409020805460019091015482565b61050961197e565b6103ff6106d13660046156f0565b611988565b610509611992565b61056461199c565b6104ff6106f436600461589d565b611a2e565b6103ff7f000000000000000000000000000000000000000000000000000000000000000081565b61056461072e36600461578f565b611d12565b61042f611d6a565b610509611d77565b61074b611d81565b60405160019190910b8152602001610413565b6104ff61076c3660046157aa565b611d8a565b61056461077f3660046156f0565b611d9e565b61042f610792366004615761565b611e72565b610509611ea8565b610497611eb2565b610564611ef0565b6105646107bd36600461593a565b60086020525f908152604090205481565b61081c6107dc3660046156f0565b60066020525f9081526040902054600181900b9065ffffffffffff62010000820416906001600160601b03600160401b8204811691600160a01b90041684565b6040805160019590950b855265ffffffffffff90931660208501526001600160601b0391821692840192909252166060820152608001610413565b6105645f81565b6104ff61086c366004615966565b611ef9565b60ca546108a6906001600160801b03811690600160801b81046001600160501b031690600160d01b900465ffffffffffff1683565b604080516001600160801b0390941684526001600160501b03909216602084015265ffffffffffff1690820152606001610413565b5f546103ff906001600160a01b031681565b6104ff6108fb3660046157aa565b611f04565b6104ff61090e366004615992565b611f18565b6104ff6109213660046159ae565b611f54565b610564611f6b565b61049761093c3660046156f0565b611f74565b6104ff61094f3660046156f0565b611fe5565b6109676109623660046157aa565b611ff8565b60405161041391908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b6104ff6109a8366004615761565b612311565b6105646109bb3660046156f0565b61232d565b6103ff7f000000000000000000000000000000000000000000000000000000000000000081565b6105646109f53660046156f0565b60076020525f908152604090205481565b61042f610a14366004615a29565b612647565b610509612693565b610509610a2f3660046156f0565b61269d565b610564612773565b6104ff610a4a3660046157aa565b61279f565b6104b7610a5d3660046156f0565b6127b3565b610564612ada565b5f610a7482612aff565b92915050565b5f808080337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610ac757604051630a7c22bf60e11b815260040160405180910390fd5b86158015610ad3575085155b15610af157604051633d38350560e01b815260040160405180910390fd5b8615801590610b195750610b08633b9aca00615a69565b87138015610b195750633b9aca0087125b15610b37576040516347017a4d60e01b815260040160405180910390fd5b8515801590610b5f5750610b4e633b9aca00615a69565b86138015610b5f5750633b9aca0086125b15610b7d5760405163ba63dfbf60e01b815260040160405180910390fd5b5f86138015610c15575060025460011680610c1557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166349aa2e816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bef573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c139190615a83565b155b15610c3357604051636264b44f60e11b815260040160405180910390fd5b610c8d6040518061016001604052805f81526020015f65ffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b60015f9054906101000a90046001600160a01b03166001600160a01b031663a51ff4a26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d019190615a9e565b610140820152610d0f612b23565b610100830152610120820152610d23612b4b565b60e083015260c08201525f899003610d4b57610d3e86612cfd565b63ffffffff169850610e97565b856001600160a01b0316610d5e8a611988565b6001600160a01b031614158015610d7d57505f881280610d7d57505f87135b15610d9b576040516315e005e960e01b815260040160405180910390fd5b5f610da58a612d49565b9050610db081612ecd565b805160010b825260208082015165ffffffffffff16908301526060808201516001600160601b0390811691840191909152604080830151909116908301525f891280610dfb57505f88135b15610e95575f610e1583604001518460c001516001613036565b90505f610e2c84606001518560e00151600161304f565b90505f610e37613060565b50610140860151909150610e4b8483615ab5565b610e559190615ab5565b670de0b6b3a7640000610e688185615ab5565b610e729190615ab5565b1115610e915760405163d374189360e01b815260040160405180910390fd5b5050505b505b5f80891315610f0157610ea989613083565b9050610eb5818a615acc565b9850610ec7898360c00151600161304f565b60808301819052604083018051610edf908390615aeb565b905250608082015161010083018051610ef9908390615aeb565b905250610fd3565b5f891215610fd357600160ff1b8903610f4b57610f2882604001518360c001516001613036565b610f3190615a69565b98508160400151610f4190615a69565b6080830152610fa0565b610f62610f578a615a69565b8360c001515f61304f565b610f6b90615a69565b60808301819052604083015190610f8190615a69565b1115610fa057604051631daef16360e01b815260040160405180910390fd5b608082015160408301805182019052610100830180519091019052610fc489613083565b9050610fd0818a615afe565b98505b5f88131561102457610fea888360e001515f613036565b60a08301819052606083018051611002908390615aeb565b90525060a08201516101208301805161101c908390615aeb565b9052506110d9565b5f8812156110d957600160ff1b880361106d5761104a82606001518360e001515f61304f565b61105390615a69565b9750816060015161106390615a69565b60a0830152611093565b61108461107989615a69565b8360e001515f613036565b61108d90615a69565b60a08301525b8160a001516110a190615a69565b826060018181516110b29190615b1d565b90525060a08201516110c390615a69565b82610120018181516110d59190615b1d565b9052505b5f6110ee83604001518460c001516001613036565b90505f61110584606001518560e00151600161304f565b90505f806111116130ed565b61014088015191935091506111268583615ab5565b6111309190615ab5565b670de0b6b3a76400006111438186615ab5565b61114d9190615ab5565b111561116c576040516309c89bf560e41b815260040160405180910390fd5b61014086015161117c8584615ab5565b6111869190615ab5565b670de0b6b3a76400006111998186615ab5565b6111a39190615ab5565b10156111c25760405163e91ee88760e01b815260040160405180910390fd5b505050506111da826040015183606001516001613110565b65ffffffffffff166020840152825260408201516001600160601b03101561121557604051631f21544b60e11b815260040160405180910390fd5b60608201516001600160601b03101561124157604051631f21544b60e11b815260040160405180910390fd5b6040518060800160405280835f015160010b8152602001836020015165ffffffffffff16815260200183604001516001600160601b0316815260200183606001516001600160601b031681525060065f8c81526020019081526020015f205f820151815f015f6101000a81548161ffff021916908360010b61ffff1602179055506020820151815f0160026101000a81548165ffffffffffff021916908365ffffffffffff1602179055506040820151815f0160086101000a8154816001600160601b0302191690836001600160601b031602179055506060820151815f0160146101000a8154816001600160601b0302191690836001600160601b0316021790555090505061135b826101200151836101000151613235565b7f87c6d2a0cd0c74f592aa5180672ba8d1f3646cb6e00d7622a7cbb4aa7aeb93b88a835f0151846040015185606001518661014001516040516113c395949392919094855260019390930b602085015260408401919091526060830152608082015260a00190565b60405180910390a198999798969795505050505050565b5f6113e361325c565b905090565b5f80516020615f74833981519152805460609190819061140790615b30565b80601f016020809104026020016040519081016040528092919081815260200182805461143390615b30565b801561147e5780601f106114555761010080835404028352916020019161147e565b820191905f5260205f20905b81548152906001019060200180831161146157829003601f168201915b505050505091505090565b6114aa60405180606001604052805f81526020015f81526020015f81525090565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146114f357604051630a7c22bf60e11b815260040160405180910390fd5b5f806114fd612b4b565b915091505f60015f9054906101000a90046001600160a01b03166001600160a01b03166398d5fdca6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611552573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115769190615b68565b50600188810b5f9081526009602090815260408083205465ffffffffffff16808452600a9092528220909201549294509092506115c06115b88383608061326a565b876001613036565b90505f6115da6115d28460808061326a565b87600161304f565b90505f806115e6613278565b915091505f6115f3613060565b509050876116018685615ab5565b61160b9190615ab5565b670de0b6b3a764000061161e8187615ab5565b6116289190615ab5565b101561164757604051632a866e9760e21b815260040160405180910390fd5b876116528683615ab5565b61165c9190615ab5565b670de0b6b3a764000061166f8187615ab5565b6116799190615ab5565b106116975760405163056c59b760e51b815260040160405180910390fd5b6116a485858a868661329a565b60208c018190528c10156116ba5760208b018c90525b5f6116cb8c602001518b6001613036565b905088670de0b6b3a76400008d602001516116e69190615ab5565b6116f09190615ba7565b808d52633b9aca0090611704908590615ab5565b61170e9190615ba7565b60408d01528b5161171f9087615b1d565b8c60400151111561173c578b516117369087615b1d565b60408d01525b5f61175b8d604001518e5f01516117539190615aeb565b8d600161304f565b905061176a8f82848d5f61333c565b5f80611774612b23565b91509150611786848303848303613235565b505050505050505050505050505092915050565b5f6117a4826135a8565b50610a74826135df565b6117b9828233613618565b5050565b5f806117c7613278565b915091509091565b5f6113e3613625565b6001600160a01b03821661180657604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f611812838333613637565b9050836001600160a01b0316816001600160a01b031614611860576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016117fd565b50505050565b5f9081525f80516020615f94833981519152602052604090206001015490565b5f61189081613739565b6117b982613746565b5f6113e36137b7565b6118ab82611866565b6118b481613739565b61186083836137c9565b6001600160a01b03811633146118e75760405163334bd91960e11b815260040160405180910390fd5b6118f18282613871565b505050565b5f61190081613739565b6117b9826138ea565b5f6113e3600254600190811c1690565b5f61192381613739565b6118f1838361394b565b5f61193781613739565b6117b9826139c4565b6118f183838360405180602001604052805f815250611f54565b5f80808061196781613739565b61197085613a2c565b919790965090945092505050565b5f806117c76130ed565b5f610a74826135a8565b5f806117c7613b66565b5f805f6119a7613b79565b6040805160608101825260ca546001600160801b0381168252600160801b81046001600160501b03166020830152600160d01b900465ffffffffffff169181019190915291935091505f906119fb90613b9b565b9150505f82821115611a1f57826001830381611a1957611a19615b93565b04611a22565b60015b93909302949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f81158015611a735750825b90505f8267ffffffffffffffff166001148015611a8f5750303b155b905081158015611a9d575080155b15611abb5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611ae557845460ff60401b1916600160401b1785555b611aef8989613cf1565b611af98787613d03565b611b01613d2e565b611b09613d4e565b611b11613d60565b611b1b5f8b6137c9565b50611b30620f424066b1a2bc2ec5000061394b565b611b3c620f4240613746565b60405163386497fd60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063386497fd90602401602060405180830381865afa158015611bc4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611be89190615a9e565b6040516335ea6a7560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301529192505f917f000000000000000000000000000000000000000000000000000000000000000016906335ea6a75906024016101e060405180830381865afa158015611c72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c969190615c40565b9050611cbe82633b9aca008360800151611cb09190615d6a565b6001600160801b0316613da9565b50508315611d0657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b5f5f80516020615f748339815191526001600160a01b038316611d4a576040516322718ad960e21b81525f60048201526024016117fd565b6001600160a01b039092165f908152600390920160205250604090205490565b5f6113e360025460011690565b5f806117c7612b23565b5f6113e3613e4c565b5f611d9481613739565b6118f18383613e65565b5f805f611daa8461269d565b915091505f60015f9054906101000a90046001600160a01b03166001600160a01b03166398d5fdca6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611dff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e239190615b68565b50509050825f03611e3857505f949350505050565b611e428382615ab5565b670de0b6b3a7640000611e558185615ab5565b611e5f9190615ab5565b611e699190615ba7565b95945050505050565b5f9182525f80516020615f94833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f806117c7613b79565b7f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930180546060915f80516020615f748339815191529161140790615b30565b5f6113e3613ebf565b6117b9338383613ed1565b5f611f0e81613739565b6118f18383613f80565b7fbf233dd2aafeb4d50879c4aa5c81e96d92f6e6945c906a58f9f2d1c1631b4b26611f4281613739565b611f4b83613fda565b6118f18261401f565b611f5f8484846117d8565b61186084848484614061565b5f6113e3614180565b6060611f7f826135a8565b505f611f9560408051602081019091525f815290565b90505f815111611fb35760405180602001604052805f815250611fde565b80611fbd84614192565b604051602001611fce929190615dae565b6040516020818303038152906040525b9392505050565b5f611fef81613739565b6117b982614222565b61201f60405180608001604052805f81526020015f81526020015f81526020015f81525090565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461206857604051630a7c22bf60e11b815260040160405180910390fd5b6120c6604051806101a001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6080810184905260a081018390526120dc613060565b60e083015260c082015260015460408051634c6afee560e11b815290516001600160a01b03909216916398d5fdca916004808201926060929091908290030181865afa15801561212e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121529190615b68565b5061010083015250612162612b4b565b610140830152610120820152612176612b23565b6101608301526101808201525f61218b613e4c565b905060015b6080830151156122e657806121bf576121b56121ad600184615dc2565b600890614266565b90925090506122d8565b6121d4828461012001518561014001516142c1565b6060870181905260408701919091526020860191909152908452670de0b6b3a764000090612203908290615ab5565b61220d9190615ab5565b8360c0015184610100015185604001516122279190615ab5565b6122319190615ab5565b111561225357633b9aca008360600151101561224e57505f612190565b6122e6565b5f805f806122618688614338565b9350935093509350838860200181815161227b9190615aeb565b90525087518390899061228f908390615aeb565b9052506040880180518391906122a6908390615aeb565b9052506060880180518291906122bd908390615aeb565b9052506122ce6121ad600188615dc2565b9096509450505050505b618000600183900b01612190575b6122fa836101800151846101600151613235565b6123088361014001516145b9565b50505092915050565b61231a82611866565b61232381613739565b6118608383613871565b5f337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461237757604051630a7c22bf60e11b815260040160405180910390fd5b600254600190811c161561239e57604051637e7f033f60e11b815260040160405180910390fd5b5f806123a8612b4b565b915091505f806123b6612b23565b915091505f60015f9054906101000a90046001600160a01b03166001600160a01b03166376cde5646040518163ffffffff1660e01b8152600401602060405180830381865afa15801561240b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242f9190615a9e565b90505f61243e83876001613036565b90505f61244d8587600161304f565b90506124598383615ab5565b61246b670de0b6b3a764000083615ab5565b1061248957604051636fa8dc8960e01b815260040160405180910390fd5b50505f612494613e4c565b905060015f6124a48a8884613036565b90505b801561263057816124ca576124c06121ad600185615dc2565b9093509150612622565b600183810b5f9081526009602090815260408083205465ffffffffffff16808452600a909252822090920154906125038260808061326a565b90505f6125128382608061326a565b905087612521828e6001613036565b61252b9190615ab5565b670de0b6b3a7640000612540848e600161304f565b61254a9190615ab5565b111561255c575f9550505050506124a7565b505f633b9aca0061256b613ebf565b6125759084615ab5565b61257f9190615ba7565b90508481111561258c5750835b5f88670de0b6b3a76400006125a3848f600161304f565b6125ad9190615ab5565b6125b79190615ba7565b90505f6125c6828f600161304f565b90506125d68982858d600161333c565b6125e08388615b1d565b9650818f6125ee9190615aeb565b9e506125fa818c615b1d565b9a50612606838d615b1d565b9b506126166121ad60018b615dc2565b90995097505050505050505b618000600184900b016124a7575b61263a8686613235565b5050505050505050919050565b6001600160a01b039182165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020908152604080832093909416825291909152205460ff1690565b5f806117c7613060565b5f8181526006602090815260409182902082516080810184529054600181900b825265ffffffffffff620100008204169282018390526001600160601b03600160401b82048116948301859052600160a01b90910416606082018190529115612741575f80612717836020015165ffffffffffff166145fc565b9250925050603c828661272a9190615ab5565b901c9450603c61273a8286615ab5565b901c935050505b5f8061274b613b66565b9150915061275b85826001613036565b94506127698483600161304f565b9350505050915091565b5f8061277d612b23565b9150505f612789613b66565b91505061279882826001613036565b9250505090565b5f6127a981613739565b6118f18383614679565b6127d460405180606001604052805f81526020015f81526020015f81525090565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461281d57604051630a7c22bf60e11b815260040160405180910390fd5b6128756040518061018001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b60808101839052612884613278565b60c083015260a082015260015460408051634c6afee560e11b815290516001600160a01b03909216916398d5fdca916004808201926060929091908290030181865afa1580156128d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128fa9190615b68565b5060e083015250612909612b4b565b61012083015261010082015261291d612b23565b6101408301526101608201525f612932613060565b5090505f61293e613e4c565b905060015b608084015115612abd578061296a576129606121ad600184615dc2565b9092509050612aaf565b61297f828561010001518661012001516142c1565b6060880181905260408801919091526020870191909152908552670de0b6b3a7640000906129ae908290615ab5565b6129b89190615ab5565b838560e0015186604001516129cd9190615ab5565b6129d79190615ab5565b116129e357505f612943565b633b9aca00846060015110156129fa57505f612943565b670de0b6b3a7640000808560600151612a139190615ab5565b612a1d9190615ab5565b8460a001518560e001518660400151612a369190615ab5565b612a409190615ab5565b11612abd575f805f612a5285886146d2565b9250925092508288602001818151612a6a9190615aeb565b905250875182908990612a7e908390615aeb565b905250604088018051829190612a95908390615aeb565b905250612aa66121ad600187615dc2565b90955093505050505b618000600183900b01612943575b612ad1846101600151856101400151613235565b50505050919050565b5f80612ae4612b23565b5090505f612af0613b66565b5090506127988282600161304f565b5f6001600160e01b03198216637965db0b60e01b1480610a745750610a748261480f565b6005545f908190612b368183608061326a565b9250612b448160808061326a565b9150509091565b5f80612b55613b66565b6040805160608101825260ca546001600160801b0381168252600160801b81046001600160501b03166020830152600160d01b900465ffffffffffff16918101829052919450919250905f90612bab9042615b1d565b90508015612cf7575f80612bbe84613b9b565b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370d00a586040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c429190615a83565b15612cea575f612c50612b23565b9150505f612c6082896001613036565b90505f612c79670de0b6b3a76400006301e13380615ab5565b86612c848685615ab5565b612c8e9190615ab5565b612c989190615ba7565b9050633b9aca00612ca76137b7565b612cb19083615ab5565b612cbb9190615ba7565b9050612cc78183615b1d565b612cd1838b615ab5565b612cdb9190615ba7565b9850612ce68961485e565b5050505b612cf48282613da9565b50505b50509091565b5f612d0661325c565b9050612d14816001016148a1565b612d215f428160286148c3565b63ffffffff82165f81815260076020526040902091909155612d449083906148d7565b919050565b604080516080810182525f808252602082018190529181018290526060810191909152505f8181526006602090815260409182902082516080810184529054600181900b825265ffffffffffff620100008204169282018390526001600160601b03600160401b8204811694830194909452600160a01b9004909216606083015215612d44575f805f612de7846020015165ffffffffffff16613a2c565b925092509250603c8285604001516001600160601b0316612e089190615ab5565b6001600160601b03911c811660408601526060850151603c91612e2d91849116615ab5565b6001600160601b03911c81166060860190815263ffffffff90941660208087019182525f88815260069091526040908190208751815493519289015197518516600160a01b026001600160a01b0398909516600160401b029790971667ffffffffffffffff65ffffffffffff93909316620100000267ffffffffffffffff1990941661ffff90981697909717929092171694909417179092555050919050565b806020015165ffffffffffff165f03612ee35750565b60208082015165ffffffffffff165f908152600a909152604081206001015490612f0f8260808061326a565b60408401519091505f906001600160601b0316612f2e8483608061326a565b612f389190615b1d565b90505f84606001516001600160601b031683612f549190615b1d565b9050612f6384835f60806148c3565b9350612f7284826080806148c3565b60208087015165ffffffffffff165f908152600a90915260409020600101819055935080158015612fa257505f83115b1561302f5760208581015165ffffffffffff165f908152600a9091526040812054617fff60309190911c61ffff1690811161ffff190217905061300b600882600881901c5f90810b815260209290925260409091208054600160ff9093169290921b9091189055565b5f613014613e4c565b90508160010b8160010b0361302c5761302c81614938565b50505b5050505050565b5f61304784600160601b8585614976565b949350505050565b5f6130478484600160601b85614976565b6003545f90819061307481605a603c61326a565b9250612b44816096601e61326a565b5f808213156130c3575f61309561199c565b9050633b9aca008111156130aa5750633b9aca005b633b9aca006130b98285615ab5565b611fde9190615ba7565b633b9aca006130d0614180565b6130d984615a69565b6130e39190615ab5565b610a749190615ba7565b6002545f908190613101816062603c61326a565b9250612b4481609e603c61326a565b5f80831561322d578280156131285750633b9aca0084125b156131465760405163ba63dfbf60e01b815260040160405180910390fd5b61315085856149ab565b915061315b82614a19565b65ffffffffffff81165f908152600a6020526040812060010154919250866131858383608061326a565b61318f9190615aeb565b90505f8661319f8460808061326a565b6131a99190615aeb565b90506131b883835f60806148c3565b92506131c783826080806148c3565b65ffffffffffff85165f908152600a60205260409020600101819055925086810361320e57600885811c5f90810b8152602091909152604090208054600160ff88161b1890555b613216613e4c565b60010b8513156132295761322985614a40565b5050505b935093915050565b60055461324581845f60806148c3565b905061325481836080806148c3565b600555505050565b6002545f906113e390601260205b6001901b5f190191901c1690565b6003545f90819061328b8183603c61326a565b9250612b4481603c601e61326a565b5f633b9aca006132aa8382615aeb565b6132bc85670de0b6b3a7640000615ab5565b6132c69190615ab5565b6132d09190615ba7565b6132e2670de0b6b3a764000080615ab5565b6132ec9190615b1d565b866132f78686615ab5565b6133019190615ab5565b670de0b6b3a76400006133148189615ab5565b61331e9190615ab5565b6133289190615b1d565b6133329190615ba7565b9695505050505050565b600185900b5f9081526009602052604090205465ffffffffffff1661336086614a5b565b50600886811c5f90810b8152602091909152604090208054600160ff89161b18905565ffffffffffff81165f908152600a602052604081206001810154905490916133ad8382608061326a565b90505f6133bc8460808061326a565b90505f6133c98a84615b1d565b90505f6133d68a84615b1d565b90505f846133e86001603c1b85615ab5565b6133f29190615ba7565b90505f846134046001603c1b85615ab5565b61340e9190615ba7565b905061341d87836040806148c3565b965061342d8782608060406148c3565b9650600160ff1b9150508115613494575f61344984845f613110565b90925090506134638765ffffffffffff83165f60306148c3565b96508d60010b821480156134745750895b156134925760405163eb4e098760e01b815260040160405180910390fd5b505b600160ff1b81036134f9576040805160018f900b8152617fff19602082015290810184905260608101839052608081018b90527f5fe96f4d1f13c468b9090d9e0bfa3b28cf26e4fe6439122f08ddbf605998e8a99060a00160405180910390a161354e565b6040805160018f810b825283900b602082015290810184905260608101839052608081018b90527f5fe96f4d1f13c468b9090d9e0bfa3b28cf26e4fe6439122f08ddbf605998e8a99060a00160405180910390a15b5f613557613e4c565b90508d60010b8160010b14801561357157508d60010b8214155b1561357f5761357f81614938565b50505065ffffffffffff9095165f908152600a6020526040902092909255505050505050505050565b5f806135b383614aee565b90506001600160a01b038116610a7457604051637e27328960e01b8152600481018490526024016117fd565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b6118f18383836001614b27565b6002545f906113e3906032603061326a565b5f5f80516020615f748339815191528161365085614aee565b90506001600160a01b0384161561366c5761366c818587614c3a565b6001600160a01b038116156136a8576136875f865f80614b27565b6001600160a01b0381165f908152600383016020526040902080545f190190555b6001600160a01b038616156136d8576001600160a01b0386165f9081526003830160205260409020805460010190555b5f85815260028301602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a495945050505050565b6137438133614c9e565b50565b61375481633b9aca00614cd7565b60c9545f61376582605a601e61326a565b90506137758284605a601e6148c3565b60c95560408051828152602081018590527fdaf49fa2ee916dacec50caa3c51a56add055165efaf1f17d25725fcd2c99193591015b60405180910390a1505050565b60c9545f906113e3906078602061326a565b5f5f80516020615f948339815191526137e28484611e72565b613861575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556138173390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610a74565b5f915050610a74565b5092915050565b5f5f80516020615f9483398151915261388a8484611e72565b15613861575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610a74565b600180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527ff3920b145a63851522088bd18b14d6bb919fbd12ac87f12498d6001c727ba070910160405180910390a15050565b61395982633b9aca00614cd7565b61396b81670de0b6b3a7640000614cd7565b60c95461397b81845f601e6148c3565b905061398b8183601e603c6148c3565b60c95560408051848152602081018490527f8874dc26eed942ffa0cacd0a09a6a0e782d014442e67ed2c7d3bcf61b759f63791016137aa565b6139d28163ffffffff614cd7565b60c9545f6139e3826078602061326a565b90506139f38284607860206148c3565b60c95560408051828152602081018590527fe6bbe7a165b8fa6949fe8e2bb60416d7af3b8149e381b428196d08c2a166b63591016137aa565b805f8080805b84825d505f848152600a60205260408120546001929092019190613a588282603061326a565b9050805f03613a675750613a6e565b9450613a32565b505f848152600a6020526040908190205490613a8c9082908061326a565b9350613a9b816080604061326a565b92506001821115613b5d575f613ab2600284615b1d565b90505b805c5f818152600a60205260409081902054919850909250603c90613adc9084908061326a565b613ae69087615ab5565b901c9450603c613af9836080604061326a565b613b039086615ab5565b901c9350613b1482875f60306148c3565b9150613b2382866040806148c3565b9150613b338285608060406148c3565b5f888152600a6020526040902081905591508015613b5b57613b5481615de5565b9050613ab5565b505b50509193909250565b6004545f908190612b368183608061326a565b60c9545f908190613b8c8183601e61326a565b9250612b4481601e603c61326a565b805160405163386497fd60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f9283926001600160801b03909116917f0000000000000000000000000000000000000000000000000000000000000000169063386497fd90602401602060405180830381865afa158015613c31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c559190615a9e565b92505f846040015165ffffffffffff1642613c709190615b1d565b9050610708811015613c915784602001516001600160501b03169250613cea565b613c9b8183615ab5565b670de0b6b3a7640000613cae8487615b1d565b613cbc906301e13380615ab5565b613cc69190615ab5565b613cd09190615ba7565b9250825f03613cea5784602001516001600160501b031692505b5050915091565b613cf9614cf8565b6117b98282614d41565b613d0b614cf8565b5f80546001600160a01b0319166001600160a01b0384161790556117b9816138ea565b613d36614cf8565b613d406001614d71565b613d4c617fff19614a40565b565b613d56614cf8565b613d4c60016148a1565b613d68614cf8565b613d75600160601b6145b9565b613d82600160601b61485e565b613d9c6706f05b59d3b20000670be52ee321c36db6613e65565b613d4c630bebc200614222565b6040805160608101825260ca80546001600160801b0386168084526001600160501b038616602085018190524265ffffffffffff8116868801819052600160d01b026001600160d01b03600160801b939093026001600160d01b0319909516909317939093171617909155915190917f4bb06cac844a363088e8f86dfbc70a781d8369fdbd4caa71228facb72d50dfc9916137aa91868252602082015260400190565b60028054617fff911c61ffff1690811161ffff19021790565b600254613e7681846062603c6148c3565b9050613e868183609e603c6148c3565b60025560408051848152602081018490527f9f4d9f603359ea7747a1caa931ec105693f4fa63d739ca60d729ca98a683bff091016137aa565b6002545f906113e39060da601e61326a565b5f80516020615f748339815191526001600160a01b038316613f1157604051630b61174360e31b81526001600160a01b03841660048201526024016117fd565b6001600160a01b038481165f818152600584016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b600354613f918184605a603c6148c3565b9050613fa181836096601e6148c3565b60035560408051848152602081018490527f7adbf035b2e2ae03a957c0cd561744f4010902e1001c2d41086c06f54504b71691016137aa565b60025460011916811760025560405181151581527f0c62bbdfbcbe8bf3480c55ec19a4923a65eb876e49568f084595873b64cf8386906020015b60405180910390a150565b60025460021916600182901b1760025560405181151581527fe92fbb024677220febae1048128887af04da8455f22497316b00bb175be6b3ed90602001614014565b6001600160a01b0383163b1561186057604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906140a3903390889087908790600401615dfa565b6020604051808303815f875af19250505080156140dd575060408051601f3d908101601f191682019092526140da91810190615e2c565b60015b614144573d80801561410a576040519150601f19603f3d011682016040523d82523d5f602084013e61410f565b606091505b5080515f0361413c57604051633250574960e11b81526001600160a01b03851660048201526024016117fd565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461302f57604051633250574960e11b81526001600160a01b03851660048201526024016117fd565b60c9545f906113e390605a601e61326a565b60605f61419e83614d8a565b60010190505f8167ffffffffffffffff8111156141bd576141bd6157ca565b6040519080825280601f01601f1916602001820160405280156141e7576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846141f157509392505050565b600254614233908260da601e6148c3565b6002556040518181527fa81c6ce7b85dedd389acede97c4c68e7ccd76ae970023b8af6a32d3d5b75e8ae90602001614014565b600881901c5f81810b8152602084905260408120549091600160ff851690811b80015f19019283168015159390846142a3578260ff1687036142b4565b6142ac81614e61565b830360ff1687035b9550505050509250929050565b600183810b5f9081526009602090815260408083205465ffffffffffff16808452600a90925282209092015490918291829182916143018184608061326a565b955061430f8160808061326a565b945061431d86896001613036565b935061432b8588600161304f565b9250505093509350935093565b5f805f805f8560a0015186604001516143519190615aeb565b905085606001519450856080015185111561436e57856080015194505b610100860151614386670de0b6b3a764000087615ab5565b6143909190615ba7565b93505f80876060015187036143ab57876020015191506143bf565b6143bc878961014001516001613036565b91505b858311614413578295508760a001519350670de0b6b3a7640000886101000151846143ea9190615ab5565b6143f49190615ba7565b9650614407878961014001516001613036565b88519092509050614494565b633b9aca008860e00151876144289190615ab5565b6144329190615ba7565b94505f61443f8787615aeb565b9050838111156144585750826144558782615b1d565b95505b8860400151811061447e5760408901516144729082615b1d565b89519095509150614492565b61448f818a6101200151600161304f565b91505b505b838860a0018181516144a69190615b1d565b9052508751811480156144bc5750876020015182105b15614553575f6144e2838a602001516144d59190615b1d565b8a6101400151600161304f565b9050886020015192508189610160018181516144fe9190615b1d565b90525061018089018051849190614516908390615b1d565b90525061018089015161452d600160601b83615ab5565b6145379190615ba7565b89610140018181516145499190615aeb565b9052506145829050565b8088610160018181516145669190615b1d565b9052506101808801805183919061457e908390615b1d565b9052505b86886080018181516145949190615b1d565b915081815250506145ad8982848b61010001515f61333c565b50505092959194509250565b6004546145c990825f60806148c3565b6004556040518181527f0eb47678af0fcacabbadc23b52144abfc1b9341bfb37b6ede42d22bb243defda90602001614014565b5f6001603c1b805b5f848152600a60205260408120549061461f8282603061326a565b9050603c61462f8360408061326a565b6146399086615ab5565b901c9350603c61464c836080604061326a565b6146569085615ab5565b901c9250805f03614668575050614671565b94506146049050565b929390929150565b60035461468981845f603c6148c3565b90506146998183603c601e6148c3565b60035560408051848152602081018490527f15658fc22e6d738d694640c7ec144edc24a5217d8e1b1cb6a17973b1f1c9287591016137aa565b5f805f6146f6846040015185606001518660e001518760a001518860c0015161329a565b9250828460800151101561470c57836080015192505b5f61471e848661012001516001613036565b60e0860151909150614738670de0b6b3a764000086615ab5565b6147429190615ba7565b9250633b9aca008560c00151846147599190615ab5565b6147639190615ba7565b91508285604001516147759190615b1d565b82111561478f5782856040015161478c9190615b1d565b91505b5f6147aa61479d8486615aeb565b876101000151600161304f565b90506147bd8782848960e001515f61333c565b8086610140018181516147d09190615b1d565b905250610160860180518391906147e8908390615b1d565b9052506080860180518691906147ff908390615b1d565b9150818152505050509250925092565b5f6001600160e01b031982166380ac58cd60e01b148061483f57506001600160e01b03198216635b5e139f60e01b145b80610a7457506301ffc9a760e01b6001600160e01b0319831614610a74565b60045461486e90826080806148c3565b6004556040518181527fae4d80815d6017051882e2605756a6374b276db7e0552860fa6b7c320a20be0190602001614014565b6002546148bd9063ffffffff808416906012906020906148c316565b60025550565b6001901b5f1901811b1992909216911b1790565b6001600160a01b03821661490057604051633250574960e11b81525f60048201526024016117fd565b5f61490c83835f613637565b90506001600160a01b038116156118f1576040516339e3563760e11b81525f60048201526024016117fd565b617fff19600182900b131561496d575f6149566121ad600184615dc2565b90925090508015614967575061496d565b50614938565b61374381614a40565b5f600182600181111561498b5761498b615e47565b146149a05761499b858585614f4a565b611e69565b611e69858585614f77565b5f80836149bc600160601b85615ab5565b6149c69190615ba7565b90506149d181614f83565b509150617ffe198212156149e657617ffe1991505b5f6149f08361537a565b905081811015614a01576001909201915b617fff831315614a1157617fff92505b505092915050565b5f8181526009602052604081205465ffffffffffff1690819003612d4457610a7482614a5b565b600280549082901b6203fffc166203fffc19909116176148bd565b5f614a64613625565b9050614a7281600101614d71565b600182900b5f908152600960205260408120805465ffffffffffff191665ffffffffffff841617905567ffff000000000000603084901b169050614abd816001603c1b6040806148c3565b9050614ad1816001603c1b608060406148c3565b65ffffffffffff83165f908152600a602052604090205550919050565b5f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b5f80516020615f748339815191528180614b4957506001600160a01b03831615155b15614c0a575f614b58856135a8565b90506001600160a01b03841615801590614b845750836001600160a01b0316816001600160a01b031614155b8015614b975750614b958185612647565b155b15614bc05760405163a9fbf51f60e01b81526001600160a01b03851660048201526024016117fd565b8215614c085784866001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5f93845260040160205250506040902080546001600160a01b0319166001600160a01b0392909216919091179055565b614c4583838361559b565b6118f1576001600160a01b038316614c7357604051637e27328960e01b8152600481018290526024016117fd565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016117fd565b614ca88282611e72565b6117b95760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016117fd565b808211156117b957604051634df52d2560e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d4c57604051631afcd79f60e31b815260040160405180910390fd5b614d49614cf8565b5f80516020615f7483398151915280614d628482615e9f565b50600181016118608382615e9f565b6002546148bd9065ffffffffffff8316603260306148c3565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310614dc85772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614df4576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310614e1257662386f26fc10000830492506010015b6305f5e1008310614e2a576305f5e100830492506008015b6127108310614e3e57612710830492506004015b60648310614e50576064830492506002015b600a8310610a745760010192915050565b5f808211614e6d575f80fd5b600160801b8210614e8b57608091821c91614e889082615f5a565b90505b600160401b8210614ea957604091821c91614ea69082615f5a565b90505b6401000000008210614ec857602091821c91614ec59082615f5a565b90505b620100008210614ee557601091821c91614ee29082615f5a565b90505b6101008210614f0157600891821c91614efe9082615f5a565b90505b60108210614f1c57600491821c91614f199082615f5a565b90505b60048210614f3757600291821c91614f349082615f5a565b90505b60028210612d4457610a74600182615f5a565b5f81600181614f598688615ab5565b614f639190615aeb565b614f6d9190615b1d565b6130479190615ba7565b5f81614f6d8486615ab5565b5f80630235b87f83107473d85bca016a2338b31715f8e13054c005f8b995d384111715614fae575f80fd5b600160601b83105f818015614fd3576714adf4b7320334b9607a1b8690049150614fea565b600160601b6a52b7d2dcc80cd2e400000087020491505b506f037af932b2affa9738cc6c38caaaa44a811061502c57614000841793506f037af932b2affa9738cc6c38caaaa44a6a52b7d2dcc80cd2e400000082020490505b6d010f7a088a76f267264caa114f0a811061506957612000841793506d010f7a088a76f267264caa114f0a6a52b7d2dcc80cd2e400000082020490505b6b95da74f87f839fc2e0dc5bd881106150a257611000841793506b95da74f87f839fc2e0dc5bd86a52b7d2dcc80cd2e400000082020490505b6b06f55dedafd8491caed5a1b881106150db57610800841793506b06f55dedafd8491caed5a1b86a52b7d2dcc80cd2e400000082020490505b6b017fdd10ee11e624491b4cc0811061511457610400841793506b017fdd10ee11e624491b4cc06a52b7d2dcc80cd2e400000082020490505b6ab23131bf0c30217b0a2c69811061514b57610200841793506ab23131bf0c30217b0a2c696a52b7d2dcc80cd2e400000082020490505b6a79683edcb9280d797aded6811061518257610100841793506a79683edcb9280d797aded66a52b7d2dcc80cd2e400000082020490505b6a64366e2f9919f0d9b0dc9081106151b8576080841793506a64366e2f9919f0d9b0dc906a52b7d2dcc80cd2e400000082020490505b6a5b0bcda5a78850646b0a8181106151ee576040841793506a5b0bcda5a78850646b0a816a52b7d2dcc80cd2e400000082020490505b6a56c840f992c70f959ae80f8110615224576020841793506a56c840f992c70f959ae80f6a52b7d2dcc80cd2e400000082020490505b6a54b9cd178695194f9be09f811061525a576010841793506a54b9cd178695194f9be09f6a52b7d2dcc80cd2e400000082020490505b6a53b7458aff204b5e65d6808110615290576008841793506a53b7458aff204b5e65d6806a52b7d2dcc80cd2e400000082020490505b6a53372a2f38c240d689e40081106152c6576004841793506a53372a2f38c240d689e4006a52b7d2dcc80cd2e400000082020490505b6a52f76617a04499e664000081106152fc576002841793506a52f76617a04499e66400006a52b7d2dcc80cd2e400000082020490505b6a52d79660f3dec355c000008110615332576001841793506a52d79660f3dec355c000006a52b7d2dcc80cd2e400000082020490505b818015615353579319936a52d79660f3dec355c00000868302049350615366565b816a52b7d2dcc80cd2e400000087020493505b50505082811115615375575f80fd5b915091565b5f81600160ff1b83161561538e57825f0390505b617fff81111561539c575f80fd5b600160801b60018216156153bd57506fff9dd7de423466c20352b1246ce4856f5b60028216156153dc576fff3bd55f4488ad277531fa1c725a66d00260801c5b60048216156153fb576ffe78410fd6498b73cb96a6917f8532590260801c5b600882161561541a576ffcf2d9987c9be178ad5bfeffaa1232730260801c5b6010821615615439576ff9ef02c4529258b057769680fc6601b30260801c5b6020821615615458576ff402d288133a85a17784a411f7aba0820260801c5b6040821615615477576fe895615b5beb6386553757b0352bda900260801c5b6080821615615496576fd34f17a00ffa00a8309940a15930391a0260801c5b6101008216156154b6576fae6b7961714e20548d88ea5123f9a0ff0260801c5b6102008216156154d6576f76d6461f27082d74e0feed3b388c0ca10260801c5b6104008216156154f6576f372a3bfe0745d8b6b19d985d9a8b85bb0260801c5b610800821615615516576f0be32cbee48979763cf7247dd7bb539d0260801c5b611000821615615535576e8d4f70c9ff4924dac37612d1e2921e0260801c5b612000821615615553576d4e009ae5519380809a02ca7aec770260801c5b61400082161561556f576b17c45e641b6e95dee056ff100260801c5b5f9150600160ff1b8416615591575f190463ffffffff81161561559157600191505b60201c0192915050565b5f6001600160a01b038316158015906130475750826001600160a01b0316846001600160a01b031614806155d457506155d48484612647565b806130475750826001600160a01b03166155ed836135df565b6001600160a01b031614949350505050565b6001600160e01b031981168114613743575f80fd5b5f60208284031215615624575f80fd5b8135611fde816155ff565b6001600160a01b0381168114613743575f80fd5b5f805f8060808587031215615656575f80fd5b84359350602085013592506040850135915060608501356156768161562f565b939692955090935050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611fde6020830184615681565b5f80604083850312156156d2575f80fd5b82358060010b81146156e2575f80fd5b946020939093013593505050565b5f60208284031215615700575f80fd5b5035919050565b5f8060408385031215615718575f80fd5b82356156e28161562f565b5f805f60608486031215615735575f80fd5b83356157408161562f565b925060208401356157508161562f565b929592945050506040919091013590565b5f8060408385031215615772575f80fd5b8235915060208301356157848161562f565b809150509250929050565b5f6020828403121561579f575f80fd5b8135611fde8161562f565b5f80604083850312156157bb575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b6040516101e0810167ffffffffffffffff81118282101715615802576158026157ca565b60405290565b5f8067ffffffffffffffff841115615822576158226157ca565b50604051601f19601f85018116603f0116810181811067ffffffffffffffff82111715615851576158516157ca565b604052838152905080828401851015615868575f80fd5b838360208301375f60208583010152509392505050565b5f82601f83011261588e575f80fd5b611fde83833560208501615808565b5f805f805f60a086880312156158b1575f80fd5b85356158bc8161562f565b9450602086013567ffffffffffffffff8111156158d7575f80fd5b6158e38882890161587f565b945050604086013567ffffffffffffffff8111156158ff575f80fd5b61590b8882890161587f565b935050606086013561591c8161562f565b9150608086013561592c8161562f565b809150509295509295909350565b5f6020828403121561594a575f80fd5b8135805f0b8114611fde575f80fd5b8015158114613743575f80fd5b5f8060408385031215615977575f80fd5b82356159828161562f565b9150602083013561578481615959565b5f80604083850312156159a3575f80fd5b823561598281615959565b5f805f80608085870312156159c1575f80fd5b84356159cc8161562f565b935060208501356159dc8161562f565b925060408501359150606085013567ffffffffffffffff8111156159fe575f80fd5b8501601f81018713615a0e575f80fd5b615a1d87823560208401615808565b91505092959194509250565b5f8060408385031215615a3a575f80fd5b8235615a458161562f565b915060208301356157848161562f565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201615a7d57615a7d615a55565b505f0390565b5f60208284031215615a93575f80fd5b8151611fde81615959565b5f60208284031215615aae575f80fd5b5051919050565b8082028115828204841417610a7457610a74615a55565b8181035f83128015838313168383128216171561386a5761386a615a55565b80820180821115610a7457610a74615a55565b8082018281125f831280158216821582161715614a1157614a11615a55565b81810381811115610a7457610a74615a55565b600181811c90821680615b4457607f821691505b602082108103615b6257634e487b7160e01b5f52602260045260245ffd5b50919050565b5f805f60608486031215615b7a575f80fd5b5050815160208301516040909301519094929350919050565b634e487b7160e01b5f52601260045260245ffd5b5f82615bb557615bb5615b93565b500490565b5f60208284031215615bca575f80fd5b6040516020810167ffffffffffffffff81118282101715615bed57615bed6157ca565b6040529151825250919050565b80516001600160801b0381168114612d44575f80fd5b805164ffffffffff81168114612d44575f80fd5b805161ffff81168114612d44575f80fd5b8051612d448161562f565b5f6101e0828403128015615c52575f80fd5b50615c5b6157de565b615c658484615bba565b8152615c7360208401615bfa565b6020820152615c8460408401615bfa565b6040820152615c9560608401615bfa565b6060820152615ca660808401615bfa565b6080820152615cb760a08401615bfa565b60a0820152615cc860c08401615c10565b60c0820152615cd960e08401615c24565b60e0820152615ceb6101008401615c35565b610100820152615cfe6101208401615c35565b610120820152615d116101408401615c35565b610140820152615d246101608401615c35565b610160820152615d376101808401615bfa565b610180820152615d4a6101a08401615bfa565b6101a0820152615d5d6101c08401615bfa565b6101c08201529392505050565b5f6001600160801b03831680615d8257615d82615b93565b806001600160801b0384160491505092915050565b5f81518060208401855e5f93019283525090919050565b5f613047615dbc8386615d97565b84615d97565b600182810b9082900b03617fff198112617fff82131715610a7457610a74615a55565b5f81615df357615df3615a55565b505f190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061333290830184615681565b5f60208284031215615e3c575f80fd5b8151611fde816155ff565b634e487b7160e01b5f52602160045260245ffd5b601f8211156118f157805f5260205f20601f840160051c81016020851015615e805750805b601f840160051c820191505b8181101561302f575f8155600101615e8c565b815167ffffffffffffffff811115615eb957615eb96157ca565b615ecd81615ec78454615b30565b84615e5b565b6020601f821160018114615eff575f8315615ee85750848201515b5f19600385901b1c1916600184901b17845561302f565b5f84815260208120601f198516915b82811015615f2e5787850151825560209485019460019092019101615f0e565b5084821015615f4b57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60ff8181168382160190811115610a7457610a74615a5556fe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a26469706673582212200af2d1d5782a6a39f024ac3379155cdca521c75e49c4c986046c7d401d45f0cf64736f6c634300081a0033000000000000000000000000250893ca4ba5d05626c785e8da758026928fcd2400000000000000000000000087870bca3f3fd6335c3f4ce8392d69350b4fa4e2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48