2 txs
105.3k calls
constructor
constructor(address vaultExtension, address authorizer, address protocolFeeController)
functions
getPoolTokenCountAndIndexOfToken
viewfunction getPoolTokenCountAndIndexOfToken(address pool, address token) view returns (uint256, uint256)
getVaultExtension
viewfunction getVaultExtension() view returns (address)
reentrancyGuardEntered
viewfunction reentrancyGuardEntered() view returns (bool)
addLiquidity
nonpayablefunction addLiquidity(tuple params) returns (uint256[] amountsIn, uint256 bptAmountOut, bytes returnData)
erc4626BufferWrapOrUnwrap
nonpayablefunction erc4626BufferWrapOrUnwrap(tuple params) returns (uint256 amountCalculatedRaw, uint256 amountInRaw, uint256 amountOutRaw)
removeLiquidity
nonpayablefunction removeLiquidity(tuple params) returns (uint256 bptAmountIn, uint256[] amountsOut, bytes returnData)
sendTo
nonpayablefunction sendTo(address token, address to, uint256 amount)
settle
nonpayablefunction settle(address token, uint256 amountHint) returns (uint256 credit)
swap
nonpayablefunction swap(tuple vaultSwapParams) returns (uint256 amountCalculated, uint256 amountIn, uint256 amountOut)
transfer
nonpayablefunction transfer(address owner, address to, uint256 amount) returns (bool)
transferFrom
nonpayablefunction transferFrom(address spender, address from, address to, uint256 amount) returns (bool)
unlock
nonpayablefunction unlock(bytes data) returns (bytes result)
events
AggregateSwapFeePercentageChanged
event AggregateSwapFeePercentageChanged(address indexed pool, uint256 aggregateSwapFeePercentage)
AggregateYieldFeePercentageChanged
event AggregateYieldFeePercentageChanged(address indexed pool, uint256 aggregateYieldFeePercentage)
Approval
event Approval(address indexed pool, address indexed owner, address indexed spender, uint256 value)
AuthorizerChanged
event AuthorizerChanged(address indexed newAuthorizer)
BufferSharesBurned
event BufferSharesBurned(address indexed wrappedToken, address indexed from, uint256 burnedShares)
BufferSharesMinted
event BufferSharesMinted(address indexed wrappedToken, address indexed to, uint256 issuedShares)
LiquidityAdded
event LiquidityAdded(address indexed pool, address indexed liquidityProvider, uint8 indexed kind, uint256 totalSupply, uint256[] amountsAddedRaw, uint256[] swapFeeAmountsRaw)
LiquidityAddedToBuffer
event LiquidityAddedToBuffer(address indexed wrappedToken, uint256 amountUnderlying, uint256 amountWrapped, bytes32 bufferBalances)
LiquidityRemoved
event LiquidityRemoved(address indexed pool, address indexed liquidityProvider, uint8 indexed kind, uint256 totalSupply, uint256[] amountsRemovedRaw, uint256[] swapFeeAmountsRaw)
LiquidityRemovedFromBuffer
event LiquidityRemovedFromBuffer(address indexed wrappedToken, uint256 amountUnderlying, uint256 amountWrapped, bytes32 bufferBalances)
PoolInitialized
event PoolInitialized(address indexed pool)
PoolPausedStateChanged
event PoolPausedStateChanged(address indexed pool, bool paused)
PoolRecoveryModeStateChanged
event PoolRecoveryModeStateChanged(address indexed pool, bool recoveryMode)
PoolRegistered
event PoolRegistered(address indexed pool, address indexed factory, (address token, uint8 tokenType, address rateProvider, bool paysYieldFees)[] tokenConfig, uint256 swapFeePercentage, uint32 pauseWindowEndTime, (address pauseManager, address swapFeeManager, address poolCreator) roleAccounts, (bool enableHookAdjustedAmounts, bool shouldCallBeforeInitialize, bool shouldCallAfterInitialize, bool shouldCallComputeDynamicSwapFee, bool shouldCallBeforeSwap, bool shouldCallAfterSwap, bool shouldCallBeforeAddLiquidity, bool shouldCallAfterAddLiquidity, bool shouldCallBeforeRemoveLiquidity, bool shouldCallAfterRemoveLiquidity, address hooksContract) hooksConfig, (bool disableUnbalancedLiquidity, bool enableAddLiquidityCustom, bool enableRemoveLiquidityCustom, bool enableDonation) liquidityManagement)
ProtocolFeeControllerChanged
event ProtocolFeeControllerChanged(address indexed newProtocolFeeController)
Swap
event Swap(address indexed pool, address indexed tokenIn, address indexed tokenOut, uint256 amountIn, uint256 amountOut, uint256 swapFeePercentage, uint256 swapFeeAmount)
SwapFeePercentageChanged
event SwapFeePercentageChanged(address indexed pool, uint256 swapFeePercentage)
Transfer
event Transfer(address indexed pool, address indexed from, address indexed to, uint256 value)
Unwrap
event Unwrap(address indexed wrappedToken, uint256 burnedShares, uint256 withdrawnUnderlying, bytes32 bufferBalances)
VaultAuxiliary
event VaultAuxiliary(address indexed pool, bytes32 indexed eventKey, bytes eventData)
VaultBuffersPausedStateChanged
event VaultBuffersPausedStateChanged(bool paused)
VaultPausedStateChanged
event VaultPausedStateChanged(bool paused)
VaultQueriesDisabled
event VaultQueriesDisabled()
VaultQueriesEnabled
event VaultQueriesEnabled()
Wrap
event Wrap(address indexed wrappedToken, uint256 depositedUnderlying, uint256 mintedShares, bytes32 bufferBalances)
errors
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
AfterAddLiquidityHookFailed
error AfterAddLiquidityHookFailed()
AfterInitializeHookFailed
error AfterInitializeHookFailed()
AfterRemoveLiquidityHookFailed
error AfterRemoveLiquidityHookFailed()
AfterSwapHookFailed
error AfterSwapHookFailed()
AllZeroInputs
error AllZeroInputs()
AmountGivenZero
error AmountGivenZero()
AmountInAboveMax
error AmountInAboveMax(address tokenIn, uint256 amountIn, uint256 maxAmountIn)
AmountOutBelowMin
error AmountOutBelowMin(address tokenOut, uint256 amountOut, uint256 minAmountOut)
BalanceNotSettled
error BalanceNotSettled()
BalanceOverflow
error BalanceOverflow()
BeforeAddLiquidityHookFailed
error BeforeAddLiquidityHookFailed()
BeforeInitializeHookFailed
error BeforeInitializeHookFailed()
BeforeRemoveLiquidityHookFailed
error BeforeRemoveLiquidityHookFailed()
BeforeSwapHookFailed
error BeforeSwapHookFailed()
BptAmountInAboveMax
error BptAmountInAboveMax(uint256 amountIn, uint256 maxAmountIn)
BptAmountOutBelowMin
error BptAmountOutBelowMin(uint256 amountOut, uint256 minAmountOut)
BufferAlreadyInitialized
error BufferAlreadyInitialized(address wrappedToken)
BufferNotInitialized
error BufferNotInitialized(address wrappedToken)
BufferSharesInvalidOwner
error BufferSharesInvalidOwner()
BufferSharesInvalidReceiver
error BufferSharesInvalidReceiver()
BufferTotalSupplyTooLow
error BufferTotalSupplyTooLow(uint256 totalSupply)
CannotReceiveEth
error CannotReceiveEth()
CannotSwapSameToken
error CannotSwapSameToken()
DoesNotSupportAddLiquidityCustom
error DoesNotSupportAddLiquidityCustom()
DoesNotSupportDonation
error DoesNotSupportDonation()
DoesNotSupportRemoveLiquidityCustom
error DoesNotSupportRemoveLiquidityCustom()
DoesNotSupportUnbalancedLiquidity
error DoesNotSupportUnbalancedLiquidity()
DynamicSwapFeeHookFailed
error DynamicSwapFeeHookFailed()
ERC20InsufficientAllowance
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)
ERC20InsufficientBalance
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)
ERC20InvalidApprover
error ERC20InvalidApprover(address approver)
ERC20InvalidReceiver
error ERC20InvalidReceiver(address receiver)
ERC20InvalidSender
error ERC20InvalidSender(address sender)
ERC20InvalidSpender
error ERC20InvalidSpender(address spender)
FailedInnerCall
error FailedInnerCall()
FeePrecisionTooHigh
error FeePrecisionTooHigh()
HookAdjustedAmountInAboveMax
error HookAdjustedAmountInAboveMax(address tokenIn, uint256 amountIn, uint256 maxAmountIn)
HookAdjustedAmountOutBelowMin
error HookAdjustedAmountOutBelowMin(address tokenOut, uint256 amountOut, uint256 minAmountOut)
HookAdjustedSwapLimit
error HookAdjustedSwapLimit(uint256 amount, uint256 limit)
HookRegistrationFailed
error HookRegistrationFailed(address poolHooksContract, address pool, address poolFactory)
InputLengthMismatch
error InputLengthMismatch()
InvalidAddLiquidityKind
error InvalidAddLiquidityKind()
InvalidRemoveLiquidityKind
error InvalidRemoveLiquidityKind()
InvalidToken
error InvalidToken()
InvalidTokenConfiguration
error InvalidTokenConfiguration()
InvalidTokenDecimals
error InvalidTokenDecimals()
InvalidTokenType
error InvalidTokenType()
InvalidUnderlyingToken
error InvalidUnderlyingToken(address wrappedToken)
InvariantRatioAboveMax
error InvariantRatioAboveMax(uint256 invariantRatio, uint256 maxInvariantRatio)
InvariantRatioBelowMin
error InvariantRatioBelowMin(uint256 invariantRatio, uint256 minInvariantRatio)
IssuedSharesBelowMin
error IssuedSharesBelowMin(uint256 issuedShares, uint256 minIssuedShares)
MaxTokens
error MaxTokens()
MinTokens
error MinTokens()
MultipleNonZeroInputs
error MultipleNonZeroInputs()
NotEnoughBufferShares
error NotEnoughBufferShares()
NotEnoughUnderlying
error NotEnoughUnderlying(address wrappedToken, uint256 expectedUnderlyingAmount, uint256 actualUnderlyingAmount)
NotEnoughWrapped
error NotEnoughWrapped(address wrappedToken, uint256 expectedWrappedAmount, uint256 actualWrappedAmount)
NotStaticCall
error NotStaticCall()
NotVaultDelegateCall
error NotVaultDelegateCall()
PauseBufferPeriodDurationTooLarge
error PauseBufferPeriodDurationTooLarge()
PercentageAboveMax
error PercentageAboveMax()
PoolAlreadyInitialized
error PoolAlreadyInitialized(address pool)
PoolAlreadyRegistered
error PoolAlreadyRegistered(address pool)
PoolInRecoveryMode
error PoolInRecoveryMode(address pool)
PoolNotInitialized
error PoolNotInitialized(address pool)
PoolNotInRecoveryMode
error PoolNotInRecoveryMode(address pool)
PoolNotPaused
error PoolNotPaused(address pool)
PoolNotRegistered
error PoolNotRegistered(address pool)
PoolPaused
error PoolPaused(address pool)
PoolPauseWindowExpired
error PoolPauseWindowExpired(address pool)
PoolTotalSupplyTooLow
error PoolTotalSupplyTooLow(uint256 totalSupply)
ProtocolFeesExceedTotalCollected
error ProtocolFeesExceedTotalCollected()
QueriesDisabled
error QueriesDisabled()
QueriesDisabledPermanently
error QueriesDisabledPermanently()
QuoteResultSpoofed
error QuoteResultSpoofed()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
RouterNotTrusted
error RouterNotTrusted()
SafeCastOverflowedIntToUint
error SafeCastOverflowedIntToUint(int256 value)
SafeCastOverflowedUintToInt
error SafeCastOverflowedUintToInt(uint256 value)
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
SenderIsNotVault
error SenderIsNotVault(address sender)
SwapFeePercentageTooHigh
error SwapFeePercentageTooHigh()
SwapFeePercentageTooLow
error SwapFeePercentageTooLow()
SwapLimit
error SwapLimit(uint256 amount, uint256 limit)
TokenAlreadyRegistered
error TokenAlreadyRegistered(address token)
TokenNotRegistered
error TokenNotRegistered(address token)
TokensMismatch
error TokensMismatch(address pool, address expectedToken, address actualToken)
TradeAmountTooSmall
error TradeAmountTooSmall()
VaultBuffersArePaused
error VaultBuffersArePaused()
VaultIsNotUnlocked
error VaultIsNotUnlocked()
VaultNotPaused
error VaultNotPaused()
VaultPaused
error VaultPaused()
VaultPauseWindowDurationTooLarge
error VaultPauseWindowDurationTooLarge()
VaultPauseWindowExpired
error VaultPauseWindowExpired()
WrapAmountTooSmall
error WrapAmountTooSmall(address wrappedToken)
WrongProtocolFeeControllerDeployment
error WrongProtocolFeeControllerDeployment()
WrongUnderlyingToken
error WrongUnderlyingToken(address wrappedToken, address underlyingToken)
WrongVaultAdminDeployment
error WrongVaultAdminDeployment()
WrongVaultExtensionDeployment
error WrongVaultExtensionDeployment()
ZeroDivision
error ZeroDivision()
creation bytecode
0x6101e06040908082523461036b576060816165dd803803809161002282856104d1565b83398101031261036b5780516001600160a01b0380821680830361036b5760208085015194838616860361036b5786015183811680910361036b57610086875161006b816104a2565b600a8152691a5cd55b9b1bd8dad95960b21b8482015261052f565b60c0526100b98751610097816104a2565b60118152701b9bdb96995c9bd1195b1d1850dbdd5b9d607a1b8482015261052f565b60e0526100e687516100ca816104a2565b600b81526a746f6b656e44656c74617360a81b8482015261052f565b9661010097885261011e81516100fb816104a2565b6012815271185919131a5c5d5a591a5d1e50d85b1b195960721b8582015261052f565b9661012097885261014d8251610133816104a2565b60098152681cd95cdcda5bdb925960ba1b8682015261052f565b9261014093845282519663fbfa77cf60e01b9081895260049887818b818c5afa9081156103af575f91610485575b50813091160361047757845191825286828a81865afa9182156103e8575f92610448575b503091160361043a576101c0978852600a80546001600160a01b0319169190911790558151634546891d60e11b81529380858881895afa948515610430575f95610411575b506101609485528251631060fdbd60e11b815296818882818a5afa978815610376575f986103f2575b506101a0978852835163cd51c12f60e01b81529682888381845afa9788156103e8575f986103b9575b506101809788528451630716585d60e51b815283818481855afa9081156103af57908492915f91610380575b5060805285516329cab55160e11b815292839182905afa918215610376575f92610344575b505060a05260098054610100600160a81b03191660089290921b610100600160a81b031691909117905551615fda97909690886106038939608051886152c0015260a051886135f8015260c0518881816111d401526114dd015260e051888181611215015281816146a601526146e8015251876146640152518681816112e60152612389015251858181611241015281816112b2015261235501525184505051836118730152518261190901525181818161096f01526114470152f35b90809250813d831161036f575b61035b81836104d1565b8101031261036b57515f80610287565b5f80fd5b503d610351565b84513d5f823e3d90fd5b83819492503d83116103a8575b61039781836104d1565b8101031261036b578391515f610262565b503d61038d565b86513d5f823e3d90fd5b6103da919850833d85116103e1575b6103d281836104d1565b810190610513565b965f610236565b503d6103c8565b85513d5f823e3d90fd5b61040a919850823d84116103e1576103d281836104d1565b965f61020d565b816104299296503d87116103e1576103d281836104d1565b935f6101e4565b83513d5f823e3d90fd5b86631bbe95c760e01b5f525ffd5b610469919250873d8911610470575b61046181836104d1565b8101906104f4565b905f61019f565b503d610457565b886301ab9d9d60e41b5f525ffd5b61049c9150883d8a116104705761046181836104d1565b5f61017b565b604081019081106001600160401b038211176104bd57604052565b634e487b7160e01b5f52604160045260245ffd5b601f909101601f19168101906001600160401b038211908210176104bd57604052565b9081602091031261036b57516001600160a01b038116810361036b5790565b9081602091031261036b575163ffffffff8116810361036b5790565b6040519061053c826104a2565b600c82526105bd603a602084016b5661756c7453746f7261676560a01b81526020604051948592828401977f62616c616e6365722d6c6162732e76332e73746f726167652e000000000000008952518091603986015e830190601760f91b60398301528051928391018583015e015f8382015203601a8101845201826104d1565b5190205f1981019081116105ee576040519060208201908152602082526105e3826104a2565b9051902060ff191690565b634e487b7160e01b5f52601160045260245ffdfe60806040526004361015610018575b3661143057611421565b5f3560e01c806315afd409146100d757806315dacbea146100d257806321457897146100cd5780632bfb780c146100c857806343583be5146100c357806348c89491146100be5780634af29ec4146100b9578063ae639329146100b4578063b9a8effa146100af578063beabacc8146100aa578063c9c1661b146100a55763d2c725e00361000e57610aae565b6109c9565b610993565b610950565b610866565b610796565b6106fd565b610671565b610599565b6104b4565b61020f565b6100fe565b6001600160a01b038116036100ed57565b5f80fd5b35906100fc826100dc565b565b346100ed5760403660031901126100ed5760043561011b816100dc565b60243561012661147a565b61012e6114db565b6001600160a01b0382165f818152600860209081526040918290205491516370a0823160e01b8152306004820152919492829060249082905afa93841561020a576101cd946101a1925f916101db575b508061019b856001600160a01b03165f52600860205260405f2090565b55610b28565b918083116101d1575b50816101b591611513565b6101bd6114b6565b6040519081529081906020820190565b0390f35b91506101b56101aa565b6101fd915060203d602011610203575b6101f581836102cd565b810190610aec565b5f61017e565b503d6101eb565b610afb565b346100ed5760803660031901126100ed5761025d60043561022f816100dc565b60243561023b816100dc565b60443590610248826100dc565b61025760643580948333611535565b336116b5565b602060405160018152f35b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff811161029057604052565b610268565b60e0810190811067ffffffffffffffff82111761029057604052565b6060810190811067ffffffffffffffff82111761029057604052565b90601f8019910116810190811067ffffffffffffffff82111761029057604052565b6040519060c0820182811067ffffffffffffffff82111761029057604052565b604051906100fc82610295565b60405190610180820182811067ffffffffffffffff82111761029057604052565b67ffffffffffffffff81116102905760051b60200190565b9080601f830112156100ed57602090823561036f8161033d565b9361037d60405195866102cd565b81855260208086019260051b8201019283116100ed57602001905b8282106103a6575050505090565b81358152908301908301610398565b359060048210156100ed57565b67ffffffffffffffff811161029057601f01601f191660200190565b9291926103ea826103c2565b916103f860405193846102cd565b8294818452818301116100ed578281602093845f960137010152565b9080601f830112156100ed5781602061042f933591016103de565b90565b9081518082526020808093019301915f5b828110610451575050505090565b835185529381019392810192600101610443565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b916104a69061042f94928452606060208501526060840190610432565b916040818403910152610465565b346100ed576003196020368201126100ed5760043567ffffffffffffffff918282116100ed5760c09082360301126100ed576104ee6102ef565b6104fa826004016100f1565b8152610508602483016100f1565b60208201526044820135604082015260648201358381116100ed576105339060043691850101610355565b6060820152610544608483016103b5565b608082015260a48201359283116100ed5761056b6105759260046101cd9536920101610414565b60a0820152610b35565b60409391935193849384610489565b600211156100ed57565b35906100fc82610584565b346100ed576003196020368201126100ed5760043567ffffffffffffffff918282116100ed5760e09082360301126100ed576105d361030f565b6105df8260040161058e565b81526105ed602483016100f1565b60208201526105fe604483016100f1565b604082015261060f606483016100f1565b60608201526084820135608082015260a482013560a082015260c48201359283116100ed5761064a6106549260046101cd9536920101610414565b60c0820152610cbf565b604080519384526020840192909252908201529081906060820190565b346100ed5760a03660031901126100ed5760405160a0810181811067ffffffffffffffff821117610290576101cd91610654916040526004356106b381610584565b81526024356106c181610584565b60208201526044356106d2816100dc565b604082015260643560608201526084356080820152610f03565b90602061042f928181520190610465565b346100ed5760203660031901126100ed5767ffffffffffffffff6004358181116100ed57366023820112156100ed5780600401359182116100ed5736602483830101116100ed576101cd91602461075492016111c9565b604051918291826106ec565b359060058210156100ed57565b61078361042f9492606083526060830190610432565b9260208201526040818403910152610465565b346100ed576003196020368201126100ed5760043567ffffffffffffffff918282116100ed5760c09082360301126100ed576107d06102ef565b6107dc826004016100f1565b81526107ea602483016100f1565b602082015260448201358381116100ed5761080b9060043691850101610355565b60408201526064820135606082015261082660848301610760565b608082015260a48201359283116100ed5761084d6108579260046101cd9536920101610414565b60a082015261127d565b6040939193519384938461076d565b346100ed5760603660031901126100ed57600435610883816100dc565b60243590610890826100dc565b6044359061089c61147a565b6108a46114db565b6108b66108b083614618565b82614654565b6001600160a01b0381165f52600860205260405f208054938385039485116109415793905560405163a9059cbb60e01b60208201526001600160a01b03909316602484015260448084019290925290825261091c91906109176064836102cd565b615b9b565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d005b610b06565b5f9103126100ed57565b346100ed575f3660031901126100ed5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100ed5760603660031901126100ed5761025d6004356109b3816100dc565b6024356109bf816100dc565b60443591336116b5565b346100ed5760403660031901126100ed576004356109e6816100dc565b602435906109f3826100dc565b6001600160a01b0380911691825f525f602052600192600160405f20541615610a9c575f93929352600360205260405f20926040519283602086549182815201955f5260205f20925f905b828210610a6f5786610a5c87610a56838c03846102cd565b826145cb565b9051604080519182526020820192909252f35b90919280610a9086998483985416906001600160a01b036020921681520190565b98019493920190610a3e565b6327946f5760e21b5f5260045260245ffd5b346100ed575f3660031901126100ed5760207f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c6040519015158152f35b908160209103126100ed575190565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b5f1981019190821161094157565b9190820391821161094157565b90610b3e6114db565b610b516001600160a01b03835116611837565b610b6a610b6583516001600160a01b031690565b61186b565b610b83610b7e83516001600160a01b031690565b611961565b90610bd7602083015151610b9e606086019182515190611e0c565b805160c0850190610bb882519160a0880192835191611e7c565b92610bc8875160019060101c1690565b610c50575b50505084846122bc565b9490919586610beb835160019060111c1690565b610bf9575b50505050929190565b84975093610c4694610c3c610c2f610c1885516001600160a01b031690565b6001600160a01b03165f52600260205260405f2090565b546001600160a01b031690565b94845133906129c4565b925f808080610bf0565b610c78610cb794888a610c70610c2f610c1883516001600160a01b031690565b923390611f8b565b610cac610ca6610c8f8a516001600160a01b031690565b6001600160a01b03165f52600560205260405f2090565b88612043565b519151905191611e7c565b5f8080610bcd565b90610cc86114db565b60208201906001600160a01b03610ce181845116611837565b610cf5610b6584516001600160a01b031690565b608084015115610ed15760408401516001600160a01b031690610d31610d2560608701516001600160a01b031690565b6001600160a01b031690565b911614610ec257610d4c610b7e83516001600160a01b031690565b92610d578482612b33565b90610d63858383612bca565b8551600c1c600116610e47575b8551610d8a9190600b1c600116610e06575b868484612f05565b9791979490978397610da18451600190600d1c1690565b610dd1575b505050505051610db581610ef4565b610dbe81610ef4565b610dc9575081929190565b918093509190565b85985090610df0610c2f610c18610dfb9894516001600160a01b031690565b94845191339261338a565b925f80808080610da6565b85516001600160a01b0316610e4060608601918251610e39610c2f836001600160a01b03165f52600260205260405f2090565b9185612e43565b9052610d82565b610e8090610e5c86516001600160a01b031690565b610e7a610c2f826001600160a01b03165f52600260205260405f2090565b91612d01565b610e9d610e97610c8f86516001600160a01b031690565b86612043565b610ea8828683612d88565b6040830152610d8a610ebb868484612bca565b9050610d70565b63a54b181d60e01b5f5260045ffd5b6357a456b760e01b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b60021115610efe57565b610ee0565b610f0b6114db565b600160075460021c166111a55760408101916001600160a01b03928381511693845f52600e6020528060405f205416156111925760049450610f4b61147a565b6020610f61610d2584516001600160a01b031690565b6040516338d52e0f60e01b815296879182905afa801561020a576080955f91611163575b5016610fa181610f9c84516001600160a01b031690565b6135b8565b81516001600160a01b031690610fbd60608601928351906135f5565b60016020860151610fcd81610ef4565b610fd681610ef4565b036110f857610ffe91855191610feb83610ef4565b84516001600160a01b0316915192613a34565b7feeb740c90bf2b18c9532eb7d473137767036d893dff3e009f32718f821b2a4c0829692979397968861105c61103e610d2589516001600160a01b031690565b94604051938493846040919493926060820195825260208201520152565b0390a25b805161106b81610ef4565b61107481610ef4565b6110c75701518084106110ad57506110a061109b91849283915b516001600160a01b031690565b6135f5565b6110a86114b6565b929190565b63e2ea151b60e01b5f52600484905260245260445ffd5b5ffd5b01518085116110e157506110a061109b918592839161108e565b63e2ea151b60e01b5f52600485905260245260445ffd5b61111b9185519161110883610ef4565b84516001600160a01b031691519261366e565b7f3771d13c67011e31e12031c54bb59b0bf544a80b81d280a3711e172aa8b7f47b829692979397968861115b61103e610d2589516001600160a01b031690565b0390a2611060565b611185915060203d60201161118b575b61117d81836102cd565b8101906111b4565b5f610f85565b503d611173565b846385f4129960e01b5f5260045260245ffd5b630f27df0960e01b5f5260045ffd5b908160209103126100ed575161042f816100dc565b91909161120b6112057f000000000000000000000000000000000000000000000000000000000000000092835c159586611274575b36916103de565b336156cc565b926112135750565b7f00000000000000000000000000000000000000000000000000000000000000005c611265575f905d6100fc7f0000000000000000000000000000000000000000000000000000000000000000613d31565b6320f1d86d60e01b5f5260045ffd5b6001855d6111fe565b906112866114db565b6112996001600160a01b03835116611837565b6112ad610b6583516001600160a01b031690565b61130a7f00000000000000000000000000000000000000000000000000000000000000005c6112e384516001600160a01b031690565b907f0000000000000000000000000000000000000000000000000000000000000000613d42565b61132361131e83516001600160a01b031690565b611bf0565b9061137760208301515161133e604086019182515190611e0c565b805160c085019061135882519160a0880192835191613d5b565b926113688751600190600e1c1690565b6113ca575b5050508484613f6a565b949095868461138b8451600190600f1c1690565b61139a575b5050505050929190565b6113c095506113b6610c2f610c1885516001600160a01b031690565b948451339061445b565b5f80808681611390565b6113f161141994888a6113ea610c2f610c1883516001600160a01b031690565b9233613e39565b61140e611408610c8f8a516001600160a01b031690565b886120a7565b519151905191613d5b565b5f808061136d565b637911c44b60e11b5f5260045ffd5b3461142157365f80375f8036816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af43d5f803e15611476573d5ff35b3d5ffd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805c6114a7576001905d565b633ee5aeb560e01b5f5260045ffd5b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d565b7f00000000000000000000000000000000000000000000000000000000000000005c1561150457565b63604dd39b60e11b5f5260045ffd5b9061151d90614618565b90600160ff1b8214610941576100fc915f0390614654565b92919091611544828486614715565b60018101611554575b5050505050565b8082116116935703906001600160a01b03928381169384156116775780831695861561165b57846115b48561159e8661159e866001600160a01b03165f52601060205260405f2090565b906001600160a01b03165f5260205260405f2090565b551692833b156100ed57604051630ad0fe5760e31b81526001600160a01b039283166004820152919092166024820152604481018290527fa0175360a15bca328baf7ea85c7b784d58b222a50d0ce760b10dba336d226a6191611635915f8180606481015b038183895af1611642575b506040519081529081906020820190565b0390a45f8080808061154d565b8061164f6116559261027c565b80610946565b5f611624565b634a1406b160e11b5f526001600160a01b03841660045260245ffd5b63e602df0560e01b5f526001600160a01b03821660045260245ffd5b6001600160a01b0383637dc7a0d960e11b5f521660045260245260445260645ffd5b929091926001600160a01b039081841691821561181b578086169182156117ff576116f58661159e836001600160a01b03165f52600f60205260405f2090565b548086116117db5785900361171f8761159e846001600160a01b03165f52600f60205260405f2090565b5561173f8761159e836001600160a01b03165f52600f60205260405f2090565b8581540190551691827fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f6040518061177c88829190602083019252565b0390a4803b156100ed576040516323de665160e01b81526001600160a01b03938416600482015293909216602484015260448301525f908290818381606481015b03925af1801561020a576117ce5750565b8061164f6100fc9261027c565b63391434e360e21b5f526001600160a01b038716600452602452604485905260645ffd5b63ec442f0560e01b5f526001600160a01b03871660045260245ffd5b634b637e8f60e11b5f526001600160a01b03851660045260245ffd5b6001600160a01b0316805f525f602052600160405f2054811c16156118595750565b634bdace1360e01b5f5260045260245ffd5b63ffffffff807f00000000000000000000000000000000000000000000000000000000000000001642111580611953575b611944576001600160a01b0382165f525f60205260405f20549060018260021c16906118c6605a90565b906028820180921161094157826118fe575b505090506118e35750565b63d971f59760e01b5f526001600160a01b031660045260245ffd5b6119309250611939937f0000000000000000000000000000000000000000000000000000000000000000921c16615f8c565b63ffffffff1690565b421115805f806118d8565b6336a7e2cd60e21b5f5260045ffd5b506001600754811c1661189c565b60409081519161197083610295565b5f8352826020810191606080845281830190808252808401908082526080936080860182815260a0870183815260c088019384526119ac61147a565b6001600160a01b038a165f526005602052825f20935f602052835f20549260046020526119e8855f20946003602052865f209081549c52614761565b8b526119f38a6147b8565b88526119fe8a611e22565b8752611a098a611e22565b9052611a16898d51615bf2565b9052611a2188611e22565b81528a5191600199600184811c169384611bdc575b5083611bca575b5f5b8d8b8210611a9d575050505050505050505050505080611a8e611a76611a95936001600160a01b03165f52600560205260405f2090565b916001600160a01b03165f52600660205260405f2090565b9083614846565b61042f6114b6565b908a8d92828c8c8c611aff84611aeb81611add611ad88f8f61108e85611ac39251611e54565b6001600160a01b03165f5260205260405f2090565b614807565b94905f5260205260405f2090565b54945183611af98383611e54565b52611e54565b50611b09816149a1565b611b14858d51611e54565b52611b296001600160801b0384168587614a40565b878d8d15611bbd5782015115159182611b9f575b5050611b50575b50505050505b01611a3f565b82611b7392611b6a82611b638851615c4e565b9451611e54565b51961c85615c71565b9283611b83575b8e93508c611b44565b611b9693611b9091610b28565b91614a40565b5f8f8282611b7a565b90915051611bac81610ef4565b611bb581610ef4565b14875f611b3d565b5050505050505050611b4a565b8c5190935060031c6001161592611a3d565b611be7919450615c4e565b1515925f611a36565b604090815191611bff83610295565b5f8352826020810191606080845281830190808252808401908082526080936080860182815260a0870183815260c08801938452611c3b61147a565b6001600160a01b038a165f526005602052825f20935f602052835f2054926004602052611c77855f20946003602052865f209081549c52614761565b8b52611c828a6147b8565b8852611c8d8a611e22565b8752611c988a611e22565b9052611ca5898d51615bf2565b9052611cb088611e22565b81528a5191600199600184811c169384611df8575b5083611de6575b5f5b8d8b8210611d05575050505050505050505050505080611a8e611a76611a95936001600160a01b03165f52600560205260405f2090565b908a8d92828c8c8c611d2b84611aeb81611add611ad88f8f61108e85611ac39251611e54565b50611d35816149a1565b611d40858d51611e54565b52611d556001600160801b0384168587614a8d565b878d8d15611dd95782015115159182611dbb575b5050611d7c575b50505050505b01611cce565b82611d8f92611b6a82611b638851615c4e565b9283611d9f575b8e93508c611d70565b611db293611dac91610b28565b91614a8d565b5f8f8282611d96565b90915051611dc881610ef4565b611dd181610ef4565b14875f611d69565b5050505050505050611d76565b8c5190935060031c6001161592611ccc565b611e03919450615c4e565b1515925f611cc5565b03611e1357565b63aaad13f760e01b5f5260045ffd5b90611e2c8261033d565b611e3960405191826102cd565b8281528092611e4a601f199161033d565b0190602036910137565b8051821015611e685760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b9190825191611e8f825182519085614952565b611e9883611e22565b935f5b848110611eaa57505050505090565b80611edf611eba60019385611e54565b51611eda611ec88489611e54565b51611ed38589611e54565b519261498e565b614f33565b611ee98289611e54565b5201611e9b565b60041115610efe57565b519081151582036100ed57565b908160209103126100ed5761042f90611efa565b906004821015610efe5752565b959293611f59611f7d9561042f999793611f6f956001600160a01b038092168b521660208a01526040890190611f1b565b606087015260e0608087015260e0860190610432565b9084820360a0860152610432565b9160c0818403910152610465565b5f6001600160a01b036020959693611fea611fad87516001600160a01b031690565b94608088015197611fbd89611ef0565b60a0608060408301519c0151910151916040519b8c9a8b998a976302e97e7d60e61b895260048901611f28565b0393165af190811561020a575f91612014575b501561200557565b631557c43360e11b5f5260045ffd5b612036915060203d60201161203c575b61202e81836102cd565b810190611f07565b5f611ffd565b503d612024565b60208082015151925f5b84811061205b575050505050565b6001906120a16001600160801b03604061208161207b85838b0151611e54565b516149a1565b61208f8560a08b0151611e54565b52835f528587525f2054168287614a40565b0161204d565b60208082015151925f5b8481106120bf575050505050565b6001906120ff6001600160801b0360406120df61207b85838b0151611e54565b6120ed8560a08b0151611e54565b52835f528587525f2054168287614a8d565b016120b1565b60405190612112826102b1565b5f6040838281528260208201520152565b9080601f830112156100ed5781519060209161213e8161033d565b9361214c60405195866102cd565b81855260208086019260051b8201019283116100ed57602001905b828210612175575050505090565b81518152908301908301612167565b81601f820112156100ed5780519061219b826103c2565b926121a960405194856102cd565b828452602083830101116100ed57815f9260208093018386015e8301015290565b6080818303126100ed5780519260208201519167ffffffffffffffff928381116100ed57846121fa918301612123565b9360408201518481116100ed5781612213918401612123565b9360608301519081116100ed5761042f9201612184565b939061042f9593612268936001600160a01b0361225a93168752602087015260a0604087015260a0860190610432565b908482036060860152610432565b916080818403910152610465565b906001820180921161094157565b9190820180921161094157565b916122ae9061042f94928452606060208501526060840190610432565b916040818403910152610432565b926122c561147a565b6060916122d0612105565b9260208601906122e4825151808752611e22565b90608084019687516122f581611ef0565b6122fe81611ef0565b61270157506040840151906123138751611e22565b9561234f8360808c01516123496123318a516001600160a01b031690565b6001600160a01b03165f52601160205260405f205490565b90614ee2565b926123c07f00000000000000000000000000000000000000000000000000000000000000005c61238689516001600160a01b031690565b907f0000000000000000000000000000000000000000000000000000000000000000905f5260205260405f20905f5260205260405f205c90565b612684575b604087015180821161266c57506123de819a999a614f55565b60208a01985f5b8b51811015612527578c6123f98288611e54565b5161240381614f55565b61240d838a611e54565b5161251557816124338460a061242a8260c061243a980151611e54565b51930151611e54565b5191614f66565b80612445838a611e54565b525b61245561108e838b51611e54565b60608b01612464848251611e54565b5183106124e257508e83611b908f8f8f966124d6916124be866124b6818b60019e9d612493886124dc9f611513565b6124af6124a08489611e54565b5191516001600160a01b031690565b908d614f95565b875292611e54565b526124cd856060880151611e54565b51925190612284565b90610b28565b016123e5565b916124f1846110c49451611e54565b516317bc2f2360e11b5f526001600160a01b03909216600452602452604452606490565b50506125218188611e54565b51612447565b5093995095945095929861254d91975061254885516001600160a01b031690565b615097565b7ffbe5b0d79fb94f1e81c0a92bf86ae9d3a19e9d1bf6202c0d3e75120f65d5d8a561257f84516001600160a01b031690565b926125a186602087019561259a87516001600160a01b031690565b3391611535565b6125a96150fa565b612641575b6125d4866125c387516001600160a01b031690565b86516001600160a01b031690615161565b6126086123316125fc6125ee88516001600160a01b031690565b96516001600160a01b031690565b94519661108e88611ef0565b926126306001600160a01b039261261e88611ef0565b8c846040519586951698169684612291565b0390a461263b6114b6565b93929190565b6126678661265687516001600160a01b031690565b86516001600160a01b03169061510f565b6125ae565b6331d38e0b60e01b5f5260049190915260245260445ffd5b9894916126978b97949995929b51614b64565b9a5f5b86518110156126f157808b6126ea8f936126e46126d38f83906126c96001996126c3848a611e54565b51614f33565b611af98383611e54565b516126de8386611e54565b51610b28565b92611e54565b520161269a565b5091949893969a509194986123c5565b94906001885161271081611ef0565b61271981611ef0565b0361279d576127288951614aec565b60408501519186928a61279761278d8b8a60406127486060830151614b07565b92019482865286608082015193612787610d2561277961277261233188516001600160a01b031690565b9551614b64565b95516001600160a01b031690565b94614de5565b909251909a611e54565b526123c5565b600288969296516127ad81611ef0565b6127b681611ef0565b03612849576127c58951614aec565b6128428260608701906127e96127db8351614b07565b60408c019381855251611e54565b516127f5835188611e54565b528b612808608082015193518093611e54565b516128276128206123318c516001600160a01b031690565b9251614b64565b9261283c610d258c516001600160a01b031690565b94614bbb565b96906123c5565b50936003875161285881611ef0565b61286181611ef0565b03612909576128708851614ad0565b5f612888610d25610d2587516001600160a01b031690565b60408681015160808c015160a08901519251632ada38a360e21b8152998a94938593879385936128bd9392336004870161222a565b03925af194851561020a575f915f965f925f916128de575b509196926123c5565b92505095506128ff91503d805f833e6128f781836102cd565b8101906121ca565b919690915f6128d5565b63137a9a3960e01b5f5260045ffd5b9190916040818403126100ed5761292e81611efa565b92602082015167ffffffffffffffff81116100ed5761042f9201612123565b96939461042f9896926129b6966129876129a89661299a95610100948d6001600160a01b0380931690521660208d015260408c0190611f1b565b60608a01528060808a0152880190610432565b9086820360a0880152610432565b9084820360c0860152610432565b9160e0818403910152610465565b9493959296919084516129dd906001600160a01b031690565b906080860151926129ed84611ef0565b60808601518a60a0890151926040519b8c978897632754888d60e01b89526004890197612a199861294d565b03916001600160a01b031691815a5f948591f193841561020a575f905f95612b0c575b50158015612b00575b612af1576001809360091c1615612a635792935090915f835b612a6a575b5050505090565b8451811015612aec57612a7d8186611e54565b516060840190612a8e838351611e54565b5111612a9d5750830183612a5e565b612ac882612ac081612aba61108e8b9760206110c49a0151611e54565b95611e54565b519251611e54565b51633ef629c960e21b5f526001600160a01b03909216600452602452604452606490565b612a63565b6303a6723b60e31b5f5260045ffd5b50835185511415612a45565b9050612b2b9194503d805f833e612b2381836102cd565b810190612918565b93905f612a3c565b6040519291608084019067ffffffffffffffff82118583101761029057612bba916040525f855260208501945f8652612bb260408201915f83528360608201965f88528299612bab60208401805190612b9b6001600160a01b039283604088015116906145cb565b87525190606085015116906145cb565b9052612d88565b905251614b64565b9052565b612bc782610ef4565b52565b919091606060c0604051612bdd81610295565b5f81525f60208201528260408201525f838201525f60808201525f60a08201520152805192612c0b84610ef4565b6080604082015193015160c06020835193015193015193612c34612c2d61030f565b9687612bbe565b60208601526040850152606084015260808301523360a083015260c082015290565b90612bc782610ef4565b919060e08101908351612c7281610ef4565b8152602080850151602083015260408501519260e060408401528351809152602061010084019401915f5b828110612ced575050505060c084606061042f95960151606084015260808101516080840152612cdd60a082015160a08501906001600160a01b03169052565b01519060c0818403910152610465565b835186529481019492810192600101612c9d565b60209192612d385f6001600160a01b03809460405197889687958693635211fa7760e01b8552604060048601526044850190612c60565b911660248301520393165af190811561020a575f91612d69575b5015612d5a57565b63e91e17e760e01b5f5260045ffd5b612d82915060203d60201161203c5761202e81836102cd565b5f612d52565b9190918051612d9681610ef4565b612d9f81610ef4565b612de45790612ddb670de0b6b3a764000093611ed36080612de09501519360a0612dcf60c0850151835190611e54565b51930151905190611e54565b61498e565b0490565b61042f92612e20612e1a6080611eda9401519460a0612e0e602060c0870151930192835190611e54565b51940151905190611e54565b5161529a565b9261498e565b91908260409103126100ed576020612e3d83611efa565b92015190565b6040805163283a3d6b60e21b8152606060048201529490938593919284926001600160a01b039284928490612e7c906064860190612c60565b9216602484015260448301520392165afa90811561020a575f905f92612ed3575b5015612ec457670de0b5cad2bef0008111612eb55790565b6301d1b96560e61b5f5260045ffd5b6314fe5db560e21b5f5260045ffd5b9050612ef7915060403d604011612efe575b612eef81836102cd565b810190612e26565b905f612e9d565b503d612ee5565b5f9491939293612f1361147a565b612f1b612105565b918051612f2781610ef4565b612f3081610ef4565b1561328a575b602091828601612f4681516152be565b83612f8281850198612f65610d25610d258c516001600160a01b031690565b906040519c8d80948193633964c0c360e11b8352600483016132b2565b03925af198891561020a575f9961326b575b5088612f9f816152be565b8351612faa81610ef4565b612fb381610ef4565b6131f3575060408201519052612ff260c0880151612feb612e1a612fdc87860193845190611e54565b519260a08c0151905190611e54565b908a614f66565b9360808301519685979860a08501518088106131dc57505b60408501948a8651613022906001600160a01b031690565b9061302c916145b9565b60600195898751613043906001600160a01b031690565b9061304d91611513565b835183516001600160a01b031687516001600160a01b03168751916130729386614f95565b9190818601956040019283528552855160608401928d8285519061309591611e54565b51906130a091612284565b90516130ab91610b28565b6130b59185614a40565b85019182518b818451906130c891611e54565b51906130d391610b28565b6130dd9183614a40565b83516001600160a01b03165f908152600560205260409020918051875161310391611e54565b5191608001918251885161311691611e54565b5161312091615369565b87516131349085905f5260205260405f2090565b5551835161314191611e54565b519051835161314f91611e54565b5161315991615369565b915161316c91905f5260205260405f2090565b5551925193516060928301519151604080518b8152602081018b905290810193909352928201929092526001600160a01b039182169382169291909116907f0874b2d545cb271cdbda4e093020c452328b24af12382ed62c4d00f5c26709db90608090a4939291906100fc6114b6565b63e2ea151b60e01b5f52600488905260245260445ffd5b905081985061321a6060613223930151670de0b6b3a7640000818103908210029083615335565b90818652612284565b9661325061323760c0890151835190611e54565b5161324860a08a0151845190611e54565b51908a615355565b93608083015196859860a08501518088116131dc575061300a565b613283919950843d8611610203576101f581836102cd565b975f612f94565b602085016132ab6132a18251606086015190614f33565b8086528251610b28565b9052612f36565b90602061042f928181520190612c60565b6101a061042f92602083526132dc602084018251612c56565b60208101516001600160a01b0316604084015260408101516001600160a01b0316606084015260608101516080840152608081015160a084015260a081015160c084015260c081015160e084015260e08101516101009081850152810151610120908185015281015161335d61014091828601906001600160a01b03169052565b8101519061337961016092838601906001600160a01b03169052565b015191610180808201520190610465565b939590919492865161339b81610ef4565b6133a481610ef4565b6135a95786604085015191845b8251946133bd86610ef4565b6040978897888601516133d6906001600160a01b031690565b9660608701516133ec906001600160a01b031690565b9360800192835181516133fe91611e54565b519351906020015161340f91611e54565b51936020880151613426906001600160a01b031690565b9760c001519861343461031c565b9a61343f908c612bbe565b6001600160a01b031660208b01526001600160a01b0316898b01526060890152608088015260a087015260c086015260e085015261010084018890526001600160a01b03166101208401526001600160a01b031661014083015261016082015281516318b6eb5560e01b8152968791829081906134bf90600483016132c3565b03916001600160a01b03165a905f91f194851561020a575f915f96613585575b5050156135765760091c60011615613570575080516134fd81610ef4565b61350681610ef4565b1580613563575b8015613538575b61351c575090565b60a0015163cc0e4a9960e01b5f5260049190915260245260445ffd5b506001815161354681610ef4565b61354f81610ef4565b148015613514575060a08101518211613514565b5060a0810151821061350d565b91505090565b630568a77b60e21b5f5260045ffd5b6135a093965080919250903d10612efe57612eef81836102cd565b93905f806134df565b866040850151918492946133b1565b6001600160a01b0380911690815f52600e6020528060405f20541692168092036135e0575050565b6336b18d0960e01b5f5260045260245260445ffd5b907f00000000000000000000000000000000000000000000000000000000000000001161361f5750565b6001600160a01b03906318fe738560e01b5f521660045260245ffd5b81810392915f13801582851316918412161761094157565b9190915f838201938412911290801582169115161761094157565b93909161367a85610ef4565b841580156139bd576136af602061369087610b1a565b6040518093819263ef8b30f760e01b8352600483019190602083019252565b03816001600160a01b0387165afa801561020a576136d4915f9161399e575b50610b1a565b94955b6136f2836001600160a01b03165f52600b60205260405f2090565b54916136fc6150fa565b61399657869288929091608083901c91858310613771575050509261376b82613748866137436001600160a01b03966001600160801b03896100fc9b60801c039316612284565b615369565b9788613765856001600160a01b03165f52600b60205260405f2090565b556145b9565b16611513565b90929350613780919450610ef4565b15613879576137a86137a361379585846155a0565b61379e8a614618565b613653565b61544c565b926001600160a01b038116936137bf81868961556a565b604051636e553f6560e01b81526004810182905230602482015294602090869060449082905f905af1801561020a576137488995613854876138496001600160a01b038f96888f896100fc9f859e6138438f61376b9f6138499661384e996001600160801b03965f9161385a575b509a8b935b169061383e8282615468565b615613565b16612284565b610b28565b94612284565b90615369565b613873915060203d602011610203576101f581836102cd565b5f61382d565b90916138996137a361388b83856153ab565b61389489614618565b61363b565b60405163b3d7f6b960e01b8152600481018290526001600160a01b038316936020939290918481602481895afa801561020a576138df915f91613979575b50868a61556a565b6040516394bf804d60e01b815260048101829052306024820152948490869060449082905f905af191821561020a576100fc966138548b613849858f966001600160a01b038f896001600160801b03879f9a849f8f9661376b9f97613849966137489f9961384e9a613843955f9261395c575b5050988992613832565b6139729250803d10610203576101f581836102cd565b5f80613952565b6139909150863d8811610203576101f581836102cd565b5f6138d7565b509093505050565b6139b7915060203d602011610203576101f581836102cd565b5f6136ce565b6139ea60206139cb87612276565b6040518093819263b3d7f6b960e01b8352600483019190602083019252565b03816001600160a01b0387165afa801561020a57613a0f915f91613a15575b50612276565b956136d7565b613a2e915060203d602011610203576101f581836102cd565b5f613a09565b9390613a3f85610ef4565b8415948515613cda57613a756020613a5687610b1a565b6040518093819263266d6a8360e11b8352600483019190602083019252565b03816001600160a01b0389165afa801561020a57613a99915f9161399e5750610b1a565b94955b613ab7856001600160a01b03165f52600b60205260405f2090565b5491613ac16150fa565b6139965787938793909290916001600160801b039182841691868310613b3857505050936001600160a01b03613b0e83866100fc98613b0686613b339860801c612284565b921603615369565b9788613b2b826001600160a01b03165f52600b60205260405f2090565b555b166145b9565b611513565b919650929450613b489150610ef4565b15613c2d57613b5d6137a361379587856153ab565b604051635d043b2960e11b8152600481018290523060248201819052604482015293906020856064815f6001600160a01b038c165af1801561020a57613beb8995613854846138498e613be28b8f6001600160a01b036100fc9f9c613bdd8f9d613b339f94889f859f613849975f91613c0e575b509586925b1690615658565b612284565b9460801c612284565b9788613c08826001600160a01b03165f52600b60205260405f2090565b55613b2d565b613c27915060203d602011610203576101f581836102cd565b5f613bd1565b613c3d6137a361388b87856155a0565b604051632d182be560e21b81526004810182905230602482018190526044820152906020826064815f6001600160a01b038c165af191821561020a57613beb89956138546001600160a01b036138498e613be28b8f8a6100fc9f613bdd8f93613b339f9e889f958b9f96613849975f91613cbb575b509b8c93613bd6565b613cd4915060203d602011610203576101f581836102cd565b5f613cb2565b613d076020613ce887612276565b60405180938192630a28a47760e01b8352600483019190602083019252565b03816001600160a01b0389165afa801561020a57613d2b915f91613a155750612276565b95613a9c565b805c9060018201809211610941575d565b905f5260205260405f20905f52602052600160405f205d565b9190825191613d6e825182519085614952565b613d7783611e22565b935f5b848110613d8957505050505090565b80670de0b6b3a7640000613dbb613da260019486611e54565b51612ddb613db0858a611e54565b51611ed3868a611e54565b04613dc68289611e54565b5201613d7a565b60051115610efe57565b906005821015610efe5752565b959193613e1561042f989694613e2693611f7d976001600160a01b038092168b521660208a01526040890190613dd7565b60e0606088015260e0870190610432565b91608086015284820360a0860152610432565b925f6001600160a01b03602095969396613e9a613e5d87516001600160a01b031690565b94608088015197613e6d89613dcd565b60a060806060830151930151910151916040519b8c9a8b998a976345421ec760e01b895260048901613de4565b0393165af190811561020a575f91613ec4575b5015613eb557565b6305975b2960e11b5f5260045ffd5b613edd915060203d60201161203c5761202e81836102cd565b5f613ead565b916080838303126100ed5782519067ffffffffffffffff918281116100ed5783613f0e918601612123565b9360208101519360408201518481116100ed5781612213918401612123565b93613f57612268936001600160a01b0361042f98969416875260a0602088015260a0870190610432565b9160408601528482036060860152610432565b9190613f7461147a565b6060613f7e612105565b9160208501613f91815151808652611e22565b60808301958651613fa181613dcd565b613faa81613dcd565b6141e957506060830151613fbe8651611e22565b94613fe28260808b0151613fdc61233189516001600160a01b031690565b90615a38565b995b60608601518084106141d25750613ffd83999899614f55565b60208901975f5b8c8b51821015614111578161401891611e54565b5161402281614f55565b61402c8288611e54565b5161410057614051908d61404a8460a061242a8260c0860151611e54565b5191615355565b8061405c8389611e54565b525b61406c61108e838a51611e54565b60408a0161407b848251611e54565b5183116140cd57508d83611b908e6140bf8f968f976140aa866124b6818b60019e9d612493886140c79f6145b9565b526140b9856060880151611e54565b51612284565b905190610b28565b01614004565b916140dc846110c49451611e54565b516323b6a17960e21b5f526001600160a01b03909216600452602452604452606490565b5061410b8187611e54565b5161405e565b50509396945096509650966141319061254885516001600160a01b031690565b7fa26a52d8d53702bba7f137907b8e1f99ff87f6d450144270ca25e72481cca87161416384516001600160a01b031690565b9261418489602087019561417e87516001600160a01b031690565b90615a7f565b6141aa61233161419e6125ee88516001600160a01b031690565b94519661108e88613dcd565b926126306001600160a01b03926141c088613dcd565b88846040519586951698169684612291565b638d261d5d60e01b5f52600484905260245260445ffd5b600387516141f681613dcd565b6141ff81613dcd565b036142215761420e8851615a1c565b6142188151611e22565b945f9199613fe4565b976001875161422f81613dcd565b61423881613dcd565b036142a0576142478851614aec565b614298896142598460408801516157d1565b60808a01519061427361233188516001600160a01b031690565b61427d8c51614b64565b91614292610d258a516001600160a01b031690565b936157ec565b959091613fe4565b9793600287516142af81613dcd565b6142b881613dcd565b03614324579787986142ca8951614aec565b6060850151916142d987614b07565b61431e61431460408b0192808452898b9f8860808201519361430e610d2561277961277261233188516001600160a01b031690565b94615706565b9092519099611e54565b52613fe4565b506004865161433281613dcd565b61433b81613dcd565b036143e35761434a87516156ea565b5f614362610d25610d2586516001600160a01b031690565b60608501519060808a0151918360a0880151986143966040519a8b968795869463e4c4366360e01b86523360048701613f2d565b03925af193841561020a575f905f955f915f916143b8575b5090959199613fe4565b925050506143d99194503d805f833e6143d181836102cd565b810190613ee3565b919592915f6143ae565b636c02b39560e01b5f5260045ffd5b969261042f9896946144489361442c61443a936129b69995610100938d6001600160a01b0380931690521660208d015260408c0190613dd7565b8060608b0152890190610432565b908782036080890152610432565b9160a086015284820360c0860152610432565b949391959296908451614474906001600160a01b031690565b60808601519161448383613dcd565b608086015160a0880151906040968c6040519c8d9788976325da41f360e21b895260048901976144b2986143f2565b03916001600160a01b031691815a5f948591f194851561020a575f905f9661459a575b5015801561458e575b61457f576001809460091c16156144fe57909192809495505f905b614506575b505050505090565b855181101561457a576145198187611e54565b5182850190614529838351611e54565b511061453857508401846144f9565b869061455683612ac081612aba61108e6110c49860208c0151611e54565b5163677d1d7d60e11b5f526001600160a01b03909216600452602452604452606490565b6144fe565b63e124916560e01b5f5260045ffd5b508451865114156144de565b90506145b19195503d805f833e612b2381836102cd565b94905f6144d5565b6145c56100fc92614618565b90614654565b905f5b82518110156145fc576001600160a01b03806145ea8386611e54565b511690831614613570576001016145ce565b6001600160a01b038263ddef98d760e01b5f521660045260245ffd5b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81116146425790565b63123baf0360e11b5f5260045260245ffd5b8115614711576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000009116805f528160205261469b60405f205c9384613653565b92836146df57505f197f0000000000000000000000000000000000000000000000000000000000000000805c918201918211610941575d5b5f5260205260405f205d565b6146d35761470c7f0000000000000000000000000000000000000000000000000000000000000000613d31565b6146d3565b5050565b6001600160a01b0392918381168484160361473357505050505f1990565b61475d9361159e92165f52601060205260405f20906001600160a01b03165f5260205260405f2090565b5490565b90604051918281549182825260209260208301915f5260205f20935f905b828210614795575050506100fc925003836102cd565b85546001600160a01b03168452600195860195889550938101939091019061477f565b906147c28261033d565b6147cf60405191826102cd565b82815280926147e0601f199161033d565b01905f5b8281106147f057505050565b6020906147fb612105565b828285010152016147e4565b90604051614814816102b1565b604060ff82945481811661482781610ef4565b84526001600160a01b038160081c16602085015260a81c161515910152565b60608101805151935f5b85811061485f57505050505050565b8061487361108e6001936020880151611e54565b6148956148888389905f5260205260405f2090565b546001600160801b031690565b6148a0838751611e54565b5181116148e7575b50506148ce6148b8828651611e54565b516148c7836080890151611e54565b5190615369565b6148e08288905f5260205260405f2090565b5501614850565b61493261494a9161492c61492361490f868a906001600160a01b03165f5260205260405f2090565b549261491c888c51611e54565b5190610b28565b8260801c612284565b90615cc4565b9185906001600160a01b03165f5260205260405f2090565b555f806148a8565b81148015929190614966575b5050611e1357565b141590505f8061495e565b90670de0b6b3a76400009182810292818404149015171561094157565b8181029291811591840414171561094157565b80516149ac81610ef4565b6149b581610ef4565b806149c8575050670de0b6b3a764000090565b806149d4600192610ef4565b03614a315760206149f3610d258260049401516001600160a01b031690565b6040516333cd77e760e11b815292839182905afa90811561020a575f91614a18575090565b61042f915060203d602011610203576101f581836102cd565b636fa2831960e11b5f5260045ffd5b91906080670de0b6b3a7640000614a84612bc79480614a638660608a0151611e54565b52612ddb614a758660c08a0151611e54565b51611ed38760a08b0151611e54565b04930151611e54565b91906080614ac8612bc79380614aa7856060890151611e54565b52611eda614ab98560c0890151611e54565b51611ed38660a08a0151611e54565b930151611e54565b60061c60011615614add57565b63033c2a5760e61b5f5260045ffd5b60041c600116614af857565b63353d5de760e21b5f5260045ffd5b80519081905f5b828110614b30575050811015614b215790565b631f91af7760e21b5f5260045ffd5b614b3a8183611e54565b51614b48575b600101614b0e565b928203614b555782614b40565b636b8c3be560e01b5f5260045ffd5b62ffffff9060121c1664174876e800908181029181830414901517156109415790565b91906020614b9e5f92604086526040860190610432565b930152565b91906020614b9e600192604086526040860190610432565b9094929192815194614bcc86611e22565b945f5b878110614d9c5750614be5906126de8988611e54565b614bef8887611e54565b5260405194631309bd3d60e31b9283875260208780614c118860048301614b87565b03816001600160a01b0385165afa96871561020a575f97614d7b575b506040519484865260208680614c468660048301614b87565b03816001600160a01b0386165afa93841561020a57613849614ca88c61491c614ca1614cbe96614c9a8f614c8a614cf49f9160209e88935f91614d5c575b506152f5565b92614c95848d615cd7565b611e54565b5190614f33565b9188611e54565b91670de0b6b3a7640000818103911002826152f5565b93614ccd856126de8c86611e54565b614cd78b85611e54565b526001600160a01b03604051809781958294835260048301614ba3565b0392165afa90811561020a57614d3095614d2a935f93614d33575b50614d1c614d2391611e22565b9788611e54565b5283610b28565b90615335565b91565b614d23919350614d54614d1c9160203d602011610203576101f581836102cd565b939150614d0f565b6020614d7592503d602011610203576101f581836102cd565b5f614c84565b614d9591975060203d602011610203576101f581836102cd565b955f614c2d565b80614db2614dac60019388611e54565b51610b1a565b614dbc828a611e54565b5201614bcf565b614ddb60409295949395606083526060830190610432565b9460208201520152565b909491830391838311610941576020614e316001600160a01b0392614e0a87876152f5565b614e148183615cd7565b60405194858094819362b5059f60e51b83528d8a60048501614dc3565b0392165afa801561020a57614d3095611eda88614e7c93614e8598614e8c965f92614e92575b50614e6a826126de61384994958b611e54565b98614e758d8a611e54565b5190615335565b93849251611e22565b9586611e54565b52610b28565b61384992506126de93614eb6614e6a9260203d602011610203576101f581836102cd565b93509350614e57565b634e487b7160e01b5f52601260045260245ffd5b8115614edd570490565b614ebf565b909291614eef8251611e22565b915f5b8151811015614f2c57614f0f83614f098385611e54565b5161498e565b908615614edd578660019204614f258287611e54565b5201614ef2565b5050509150565b90614f3d9161498e565b6001670de0b6b3a76400005f19830104019015150290565b80614f5d5750565b6100fc906152be565b91614f709161498e565b90670de0b6b3a764000090818102918183041490151715610941578115614edd570490565b91949290945f955f9581614faa575050505050565b849750612433614fc38260c0614fcf9697980151611e54565b519160a08a0151611e54565b945160018160031c1615614fe5575b808061154d565b62ffffff91929450602a1c1664174876e800908181029181830414901517156109415761501b670de0b6b3a7640000918661498e565b0492848411615088578061159e61506761504d61507f9461159e876001600160a01b03165f52600660205260405f2090565b54615061886001600160801b038316612284565b90615d5c565b936001600160a01b03165f52600660205260405f2090565b555f8080614fde565b634c69ac5d60e01b5f5260045ffd5b6001600160a01b0390929192165f52602060056020526040805f205f5b606086015180518210156150f157906150e16150d282600194611e54565b516148c78360808b0151611e54565b815f52838652845f2055016150b4565b50505050509050565b3215806151045790565b506001600754161590565b9032615152576001600160a01b0361514392165f52600f60205260405f20906001600160a01b03165f5260205260405f2090565b80549182018092116109415755565b6333fc255960e11b5f5260045ffd5b90916001600160a01b0380841692831561181b576151948561159e836001600160a01b03165f52600f60205260405f2090565b54808411615276578390036151be8661159e846001600160a01b03165f52600f60205260405f2090565b556151e4836151de836001600160a01b03165f52601160205260405f2090565b54610b28565b6151ed81615d6a565b615208826001600160a01b03165f52601160205260405f2090565b551690813b156100ed576040516323de665160e01b81526001600160a01b0390941660048501525f6024850181905260448501829052937fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f916152719186818060648101611619565b0390a4565b63391434e360e21b5f526001600160a01b038616600452602452604483905260645ffd5b670de0b6b3a76400008082040281036152b05790565b600181018091116109415790565b7f0000000000000000000000000000000000000000000000000000000000000000116152e657565b6303da9a2360e31b5f5260045ffd5b90801561532657670de0b6b3a764000091828102928184041490151715610941576001905f19830104019015150290565b630a0c22c760e01b5f5260045ffd5b8215615326576001916153479161498e565b915f19830104019015150290565b9061042f926153639161498e565b906152f5565b906001600160801b038083119081156153a1575b506153925760801b9081018091116109415790565b6389560ca160e01b5f5260045ffd5b905081115f61537d565b906153b88260801c614618565b906001600160801b035f9316806153dc575b50506002916153d89161363b565b0590565b6001600160a01b0393509060246020926040519586938492630a28a47760e01b84526004840152165afa90811561020a576154246153d8926002945f9161542d575b50614618565b928192506153ca565b615446915060203d602011610203576101f581836102cd565b5f61541e565b5f81126154565790565b635467221960e11b5f5260045260245ffd5b60405163095ea7b360e01b602082018181526001600160a01b03851660248401525f6044840152909391929183606481015b03916154ae601f19938481018752866102cd565b5f806001600160a01b0386169287519082855af1906154cb61569d565b82615538575b508161552d575b50156154e5575050505050565b60405160208101959095526001600160a01b031660248501525f604485015260649081018452615523936109179161551d90826102cd565b82615b9b565b5f8080808061154d565b90503b15155f6154d8565b80519192508115918215615550575b5050905f6154d1565b6155639250602080918301019101611f07565b5f80615547565b60405163095ea7b360e01b602082018181526001600160a01b03851660248401526044830195909552939092836064810161549a565b906155b36001600160801b038316614618565b905f9260801c806155cc5750506002916153d89161363b565b6001600160a01b039350906024602092604051958693849263b3d7f6b960e01b84526004840152165afa90811561020a576154246153d8926002945f9161542d5750614618565b9291906001600160a01b038085165f52600860205260405f20549283039283116109415781165f52600860205260405f2054928301809311610941576100fc93615d89565b9291906001600160a01b038085165f52600860205260405f20549283018093116109415781165f52600860205260405f2054928303928311610941576100fc93615d89565b3d156156c7573d906156ae826103c2565b916156bc60405193846102cd565b82523d5f602084013e565b606090565b5f8061042f9360208151910182855af16156e461569d565b91615ec0565b60051c600116156156f757565b63121db02f60e21b5f5260045ffd5b9094916020615735615720866001600160a01b0394612284565b9461572b87876152f5565b614e148183615f1a565b0392165afa801561020a57614d3095613849614ca885614e7c94614e85998c998a615794995f9461579a575b509061578861578161577a61578f946124d69798611e54565b5187610b28565b9c8c611e54565b519061498e565b614ed3565b52612284565b6124d6945061578161577a61578f94936157c56157889460203d602011610203576101f581836102cd565b97509394505050615761565b9060208083516157e2845182611e0c565b60051b930191015e565b9291909383516157fb81611e22565b9161580582611e22565b965f5b8381106159e15750506001600160a01b0381169160405195631309bd3d60e31b9283885260209889898061583f8460048301614b87565b0381895afa98891561020a575f996159c2575b506040518581528a81806158698b60048301614ba3565b03818a5afa90811561020a578a61578f6158a49361589d938f5f926159a5575b9b999d9c9a98979695949392919050614971565b8093615f1a565b5f5b89811061591357505050506158ca9550604051809681948293835260048301614ba3565b03915afa91821561020a578361578f936158f092614d30975f926158f6575b5050610b28565b9061498e565b61590c9250803d10610203576101f581836102cd565b5f806158e9565b869899959750838d83949596988361593761593082600198611e54565b5189615d49565b806159428385611e54565b511161595e575b505050505001908a96949897959392916158a6565b818361597f61599097615989946159788561491c99611e54565b5103614f33565b611af98388611e54565b5192611e54565b61599a828b611e54565b52848d8a835f615949565b6159bb9250803d10610203576101f581836102cd565b5f8f615889565b6159da9199508a3d8c11610203576101f581836102cd565b975f615852565b80615a0b615a066159f46001948c611e54565b516159ff8487611e54565b5190612284565b610b1a565b615a158288611e54565b5201615808565b60071c60011615615a2957565b63efe0265d60e01b5f5260045ffd5b9291615a448451611e22565b935f5b8151811015615a795780615a688585615a6260019587611e54565b51615335565b615a728289611e54565b5201615a47565b50505050565b916001600160a01b03808316938415615b7f57615ab783615ab1836001600160a01b03165f52601160205260405f2090565b54612284565b615ad68561159e846001600160a01b03165f52600f60205260405f2090565b848154019055615ae581615d6a565b615b00826001600160a01b03165f52601160205260405f2090565b5516925f847fd1398bee19313d6bf672ccb116e51f4a1a947e91c757907f51fbb5b5e56c698f60405180615b3987829190602083019252565b0390a4823b156100ed576040516323de665160e01b81525f600482018190526001600160a01b0390931660248201526044810191909152918290818381606481016117bd565b63ec442f0560e01b5f526001600160a01b03841660045260245ffd5b6001600160a01b03615baf911691826156cc565b8051908115159182615bd7575b5050615bc55750565b635274afe760e01b5f5260045260245ffd5b615bea9250602080918301019101611f07565b155f80615bbc565b9064ffffffffff615c0282611e22565b92605a1c165f5b828110615c165750505090565b60058082029082820414821517156109415782601f911c1690604d821161094157600191600a0a615c478287611e54565b5201615c09565b62ffffff9060421c1664174876e800908181029181830414901517156109415790565b9093925f94615c84846080850151611e54565b51818111615c93575050505050565b615cb995965091615ca8916124339303614f33565b9260a061242a8260c0860151611e54565b905f8080808061154d565b906001600160801b0361042f9216615369565b9060206001600160a01b0392600460405180958193635b3bfd2b60e11b8352165afa91821561020a575f92615d28575b50818110615d13575050565b63718e4adf60e11b5f5260045260245260445ffd5b615d4291925060203d602011610203576101f581836102cd565b905f615d07565b670de0b6b3a764000091612de09161498e565b9061042f9160801c90615369565b620f42408110615d775750565b6334e3483f60e21b5f5260045260245ffd5b6040516370a0823160e01b808252306004830152602095939490926001600160a01b03929187836024818786165afa92831561020a575f93615ea1575b50808310615e7a5750615dea906001600160a01b03165f52600860205260405f2090565b556040519182523060048301528316908481602481855afa94851561020a575f95615e5b575b5050818410615e39575050615e36906001600160a01b03165f52600860205260405f2090565b55565b631149424d60e01b5f526001600160a01b03166004526024525060445260645ffd5b615e72929550803d10610203576101f581836102cd565b925f80615e10565b631c6a537560e01b5f9081529387166001600160a01b031660045260245250604452606490fd5b615eb9919350883d8a11610203576101f581836102cd565b915f615dc6565b90615ee45750805115615ed557805190602001fd5b630a12f52160e11b5f5260045ffd5b81511580615f11575b615ef5575090565b6001600160a01b0390639996b31560e01b5f521660045260245ffd5b50803b15615eed565b9060206001600160a01b039260046040518095819363273c1adf60e01b8352165afa91821561020a575f92615f6b575b50818111615f56575050565b630fa2583760e21b5f5260045260245260445ffd5b615f8591925060203d602011610203576101f581836102cd565b905f615f4a565b91909163ffffffff808094169116019182116109415756fea26469706673582212206683429dd8621233bf9dfafe00f40360d4204093d879bd8a2517bc175dc511eb64736f6c634300081a00330000000000000000000000000e8b07657d719b86e06bf0806d6729e3d528c9a9000000000000000000000000a331d84ec860bf466b4cdccfb4ac09a1b43f3ae6000000000000000000000000a731c23d7c95436baaae9d52782f966e1ed07cc8