0 txs
1 call
constructor
constructor()
functions
balances
viewfunction balances(bytes32 _asset, bytes32 _user) view returns (uint256 _amount)
BATCH_FILL_INTENT_TYPEHASH
viewfunction BATCH_FILL_INTENT_TYPEHASH() view returns (bytes32)
callExecutor
viewfunction callExecutor() view returns (address)
deprecated_fillQueue
viewfunction deprecated_fillQueue() view returns (uint256 first, uint256 last)
deprecated_intentQueue
viewfunction deprecated_intentQueue() view returns (uint256 first, uint256 last)
DOMAIN
viewfunction DOMAIN() view returns (uint32)
EVERCLEAR
viewfunction EVERCLEAR() view returns (uint32)
feeAdapter
viewfunction feeAdapter() view returns (address)
FILL_INTENT_FOR_SOLVER_TYPEHASH
viewfunction FILL_INTENT_FOR_SOLVER_TYPEHASH() view returns (bytes32)
FILL_INTENT_TYPEHASH
viewfunction FILL_INTENT_TYPEHASH() view returns (bytes32)
fillQueue
viewfunction fillQueue() view returns (uint256 first, uint256 last)
fillSigner
viewfunction fillSigner() view returns (address)
gateway
viewfunction gateway() view returns (address)
intentQueue
viewfunction intentQueue() view returns (uint256 first, uint256 last)
lighthouse
viewfunction lighthouse() view returns (address)
messageGasLimit
viewfunction messageGasLimit() view returns (uint256)
messageReceiver
viewfunction messageReceiver() view returns (address)
modules
viewfunction modules(uint8 _strategy) view returns (address _module)
nonce
viewfunction nonce() view returns (uint64)
nonces
viewfunction nonces(address owner) view returns (uint256)
owner
viewfunction owner() view returns (address)
paused
viewfunction paused() view returns (bool)
PERMIT2
viewfunction PERMIT2() view returns (address)
PROCESS_FILL_QUEUE_VIA_RELAYER_TYPEHASH
viewfunction PROCESS_FILL_QUEUE_VIA_RELAYER_TYPEHASH() view returns (bytes32)
PROCESS_INTENT_QUEUE_VIA_RELAYER_TYPEHASH
viewfunction PROCESS_INTENT_QUEUE_VIA_RELAYER_TYPEHASH() view returns (bytes32)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
status
viewfunction status(bytes32 _intentId) view returns (uint8 status)
strategies
viewfunction strategies(address _asset) view returns (uint8 _strategy)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
watchtower
viewfunction watchtower() view returns (address)
batchFillIntent
nonpayablefunction batchFillIntent(tuple[] _intents, uint256[] _amountOut, bytes32[] _receivers, uint32[][] _destinations, bytes _signature, bool _pullFunds) returns (tuple[] _fillMessages)
deposit
nonpayablefunction deposit(address _asset, uint256 _amount)
executeIntentCalldata
nonpayablefunction executeIntentCalldata(tuple _intent)
fillIntent
nonpayablefunction fillIntent(tuple _intent, uint256 _amountOut, bytes32 _receiver, uint32[] _destinations, bytes _signature, bool _pullFunds) returns (tuple _fillMessage)
initialize
nonpayablefunction initialize(address _feeAdapter, address _messageReceiver, address _fillSigner)
newIntent
nonpayablefunction newIntent(uint32[] _destinations, address _receiver, address _inputAsset, address _outputAsset, uint256 _amount, uint256 _amountOutMin, uint48 _ttl, bytes _data) returns (bytes32 _intentId, tuple _intent)
newIntent
nonpayablefunction newIntent(uint32[] _destinations, bytes32 _receiver, address _inputAsset, bytes32 _outputAsset, uint256 _amount, uint256 _amountOutMin, uint48 _ttl, bytes _data) returns (bytes32 _intentId, tuple _intent)
pause
nonpayablefunction pause()
processFillQueue
payablefunction processFillQueue(uint32 _amount, uint256 _dynamicGasLimit) payable
processFillQueueViaRelayer
nonpayablefunction processFillQueueViaRelayer(uint32 _domain, uint32 _amount, address _relayer, uint256 _ttl, uint256 _nonce, uint256 _dynamicGasLimit, bytes _signature)
processIntentQueue
payablefunction processIntentQueue(tuple[] _intents, uint256 _dynamicGasLimit) payable
processIntentQueueViaRelayer
nonpayablefunction processIntentQueueViaRelayer(uint32 _domain, tuple[] _intents, address _relayer, uint256 _ttl, uint256 _nonce, uint256 _dynamicGasLimit, bytes _signature)
receiveMessage
nonpayablefunction receiveMessage(bytes)
renounceOwnership
nonpayablefunction renounceOwnership()
setModuleForStrategy
nonpayablefunction setModuleForStrategy(uint8 _strategy, address _module)
setStrategyForAsset
nonpayablefunction setStrategyForAsset(address _asset, uint8 _strategy)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unpause
nonpayablefunction unpause()
updateFeeAdapter
nonpayablefunction updateFeeAdapter(address _feeAdapter)
updateFillSigner
nonpayablefunction updateFillSigner(address _feeSigner)
updateGateway
nonpayablefunction updateGateway(address _newGateway)
updateMessageGasLimit
nonpayablefunction updateMessageGasLimit(uint256 _newGasLimit)
updateMessageReceiver
nonpayablefunction updateMessageReceiver(address _newMessageReceiver)
updateSecurityModule
nonpayablefunction updateSecurityModule(address _newSecurityModule)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
withdraw
nonpayablefunction withdraw(address _asset, uint256 _amount)
events
AssetMintFailed
event AssetMintFailed(address indexed _asset, address indexed _recipient, uint256 _amount, uint8 _strategy)
AssetTransferFailed
event AssetTransferFailed(address indexed _asset, address indexed _recipient, uint256 _amount)
Deposited
event Deposited(address indexed _depositant, address indexed _asset, uint256 _amount)
ExternalCalldataExecuted
event ExternalCalldataExecuted(bytes32 indexed _intentId, bytes _returnData)
FeeAdapterUpdated
event FeeAdapterUpdated(address _newFeeAdapter)
FillQueueProcessed
event FillQueueProcessed(bytes32 indexed _messageId, uint256 _firstIdx, uint256 _lastIdx, uint256 _quote)
FillSignerUpdated
event FillSignerUpdated(address _oldFillSigner, address _newFillSigner)
GatewayUpdated
event GatewayUpdated(address _oldGateway, address _newGateway)
Initialized
event Initialized(uint64 version)
IntentAdded
event IntentAdded(bytes32 indexed _intentId, uint256 _queueIdx, (bytes32 initiator, bytes32 receiver, bytes32 inputAsset, bytes32 outputAsset, uint32 origin, uint64 nonce, uint48 timestamp, uint48 ttl, uint256 amount, uint256 amountOutMin, uint32[] destinations, bytes data) _intent)
IntentFilled
event IntentFilled(bytes32 indexed _intentId, address indexed _solver, bytes32 indexed _receiver, uint256 _amountOut, uint256 _queueIdx, (bytes32 initiator, bytes32 receiver, bytes32 inputAsset, bytes32 outputAsset, uint32 origin, uint64 nonce, uint48 timestamp, uint48 ttl, uint256 amount, uint256 amountOutMin, uint32[] destinations, bytes data) _intent)
IntentQueueProcessed
event IntentQueueProcessed(bytes32 indexed _messageId, uint256 _firstIdx, uint256 _lastIdx, uint256 _quote)
LighthouseUpdated
event LighthouseUpdated(address _oldLightHouse, address _newLightHouse)
MessageGasLimitUpdated
event MessageGasLimitUpdated(uint256 _oldGasLimit, uint256 _newGasLimit)
MessageReceiverUpdated
event MessageReceiverUpdated(address _oldMessageReceiver, address _newMessageReceiver)
ModuleSetForStrategy
event ModuleSetForStrategy(uint8 _strategy, address _module)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
Paused
event Paused()
Settled
event Settled(bytes32 indexed _intentId, address _account, address _asset, uint256 _amount)
StrategySetForAsset
event StrategySetForAsset(address _asset, uint8 _strategy)
Unpaused
event Unpaused()
Upgraded
event Upgraded(address indexed implementation)
WatchtowerUpdated
event WatchtowerUpdated(address _oldWatchtower, address _newWatchtower)
Withdrawn
event Withdrawn(address indexed _withdrawer, address indexed _asset, uint256 _amount)
errors
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
ECDSAInvalidSignature
error ECDSAInvalidSignature()
ECDSAInvalidSignatureLength
error ECDSAInvalidSignatureLength(uint256 length)
ECDSAInvalidSignatureS
error ECDSAInvalidSignatureS(bytes32 s)
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
EverclearSpoke_ExecuteIntentCalldata_ExternalCallFailed
error EverclearSpoke_ExecuteIntentCalldata_ExternalCallFailed()
EverclearSpoke_ExecuteIntentCalldata_InvalidStatus
error EverclearSpoke_ExecuteIntentCalldata_InvalidStatus(bytes32 _intentId)
EverclearSpoke_FeeAdapter_NotAuthorized
error EverclearSpoke_FeeAdapter_NotAuthorized()
EverclearSpoke_FillIntent_AmountOutInvalid
error EverclearSpoke_FillIntent_AmountOutInvalid(uint256 _amountOut, uint256 _amountOutMin)
EverclearSpoke_FillIntent_InsufficientFunds
error EverclearSpoke_FillIntent_InsufficientFunds(uint256 _requested, uint256 _available)
EverclearSpoke_FillIntent_IntentExpired
error EverclearSpoke_FillIntent_IntentExpired(bytes32 _intentId)
EverclearSpoke_FillIntent_InvalidArrayLengths
error EverclearSpoke_FillIntent_InvalidArrayLengths()
EverclearSpoke_FillIntent_InvalidDestinationArray
error EverclearSpoke_FillIntent_InvalidDestinationArray()
EverclearSpoke_FillIntent_InvalidStatus
error EverclearSpoke_FillIntent_InvalidStatus(bytes32 _intentId)
EverclearSpoke_Initialize_FillQueueNotEmpty
error EverclearSpoke_Initialize_FillQueueNotEmpty()
EverclearSpoke_Initialize_IntentQueueNotEmpty
error EverclearSpoke_Initialize_IntentQueueNotEmpty()
EverclearSpoke_InvalidFillSignature
error EverclearSpoke_InvalidFillSignature()
EverclearSpoke_InvalidMessageType
error EverclearSpoke_InvalidMessageType()
EverclearSpoke_InvalidSignature
error EverclearSpoke_InvalidSignature()
EverclearSpoke_InvalidVarUpdate
error EverclearSpoke_InvalidVarUpdate()
EverclearSpoke_NewIntent_CalldataExceedsLimit
error EverclearSpoke_NewIntent_CalldataExceedsLimit()
EverclearSpoke_NewIntent_InvalidIntent
error EverclearSpoke_NewIntent_InvalidIntent()
EverclearSpoke_NewIntent_OutputAssetNotNull
error EverclearSpoke_NewIntent_OutputAssetNotNull()
EverclearSpoke_NewIntent_OutputAssetNull
error EverclearSpoke_NewIntent_OutputAssetNull()
EverclearSpoke_NewIntent_ZeroAmount
error EverclearSpoke_NewIntent_ZeroAmount()
EverclearSpoke_Pause_NotAuthorized
error EverclearSpoke_Pause_NotAuthorized()
EverclearSpoke_Paused
error EverclearSpoke_Paused()
EverclearSpoke_ProcessFillViaRelayer_NotRelayer
error EverclearSpoke_ProcessFillViaRelayer_NotRelayer()
EverclearSpoke_ProcessFillViaRelayer_TTLExpired
error EverclearSpoke_ProcessFillViaRelayer_TTLExpired()
EverclearSpoke_ProcessFillViaRelayer_WrongDomain
error EverclearSpoke_ProcessFillViaRelayer_WrongDomain()
EverclearSpoke_ProcessIntentQueue_NotFound
error EverclearSpoke_ProcessIntentQueue_NotFound(bytes32 _intentId, uint256 _position)
EverclearSpoke_ProcessQueue_ExceedsGasLimit
error EverclearSpoke_ProcessQueue_ExceedsGasLimit(uint256 _dynamicGasLimit)
EverclearSpoke_ProcessQueue_InvalidAmount
error EverclearSpoke_ProcessQueue_InvalidAmount(uint256 _first, uint256 _last, uint256 _amount)
EverclearSpoke_ProcessQueue_ZeroAmount
error EverclearSpoke_ProcessQueue_ZeroAmount()
EverclearSpoke_Unauthorized
error EverclearSpoke_Unauthorized()
EverclearSpoke_WrongDestination
error EverclearSpoke_WrongDestination()
EverclearSpoke_ZeroAddress
error EverclearSpoke_ZeroAddress()
FailedInnerCall
error FailedInnerCall()
InvalidAccountNonce
error InvalidAccountNonce(address account, uint256 currentNonce)
InvalidInitialization
error InvalidInitialization()
NotInitializing
error NotInitializing()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
Queue_EmptyQueue
error Queue_EmptyQueue()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
creation bytecode
0x60a060405230608052348015610013575f80fd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051615fc36100f95f395f81816133030152818161332c01526134dc0152615fc35ff3fe60806040526004361061035a575f3560e01c80637f7673f9116101bd578063c0c53b8b116100f2578063e2cae9f511610092578063f37c0a2e1161006d578063f37c0a2e14610b75578063f3fef3a314610b90578063f745f51214610baf578063f953cec714610bce575f80fd5b8063e2cae9f514610b1d578063f09e822a14610b3c578063f2fde38b14610b56575f80fd5b8063c9bd6a97116100cd578063c9bd6a9714610a8f578063cab0071e14610abb578063d6979ef614610ad0578063df7a760114610aea575f80fd5b8063c0c53b8b14610a1d578063c13eedbe14610a3c578063c2aeb7bd14610a5b575f80fd5b806392b4a6be1161015d578063afa6fbd511610138578063afa6fbd51461097a578063affed0e01461098d578063beff4ce2146109df578063c0346b20146109fe575f80fd5b806392b4a6be146108e7578063990969f614610906578063ad3cb1cc14610925575f80fd5b80638467b5b5116101985780638467b5b5146108535780638da5cb5b146108725780638fd68940146108ae57806391a3ef8e146108c8575f80fd5b80637f7673f9146108015780638249eb15146108205780638456cb591461083f575f80fd5b8063522dbaa51161029357806361b03cb7116102335780636afdd8501161020e5780636afdd85014610745578063715018a61461076757806373e554f61461077b5780637ecebe00146107ae575f80fd5b806361b03cb7146106d95780636301fd63146106ec57806367e71ef414610716575f80fd5b806352d1902d1161026e57806352d1902d146106465780635c8ff7611461065a5780635c975abb146106795780635d394d3b146106ba575f80fd5b8063522dbaa5146105a057806352a9674b146105d357806352ad0d5e1461060b575f80fd5b80632485ee18116102fe5780633f4ba83a116102d95780633f4ba83a1461053b578063407e20e41461054f57806347e7ef241461056e5780634f1ef2861461058d575f80fd5b80632485ee18146104ae57806339ebf823146104e15780633c4bc6b11461051c575f80fd5b80630ed6c47d116103395780630ed6c47d146103f95780631007287f14610425578063116191b61461045857806317a297df1461048f575f80fd5b8062c58a2c1461035e5780630144a66114610394578063043dca04146103b5575b5f80fd5b348015610369575f80fd5b5061037d610378366004614912565b610bed565b60405161038b929190614b0b565b60405180910390f35b34801561039f575f80fd5b506103b36103ae366004614b23565b610d44565b005b3480156103c0575f80fd5b506103eb6103cf366004614b3e565b600660209081525f928352604080842090915290825290205481565b60405190815260200161038b565b348015610404575f80fd5b50610418610413366004614b8d565b610db8565b60405161038b9190614ca3565b348015610430575f80fd5b506103eb7f47fa6a5d212053b505e8157c5819225af8dc549dc5796a65c2bf35c33519e57e81565b348015610463575f80fd5b50600354610477906001600160a01b031681565b6040516001600160a01b03909116815260200161038b565b34801561049a575f80fd5b506103b36104a9366004614cb5565b610ef8565b3480156104b9575f80fd5b506103eb7f75108041a6a81a2f98b1dd7b5c7952bfe7620180ebd2f4676b628c82da4cec0781565b3480156104ec575f80fd5b5061050f6104fb366004614b23565b60086020525f908152604090205460ff1681565b60405161038b9190614d30565b348015610527575f80fd5b50601054610477906001600160a01b031681565b348015610546575f80fd5b506103b36110e6565b34801561055a575f80fd5b50601754610477906001600160a01b031681565b348015610579575f80fd5b506103b3610588366004614d3e565b6111a0565b6103b361059b366004614ddc565b61127c565b3480156105ab575f80fd5b506103eb7fce1faaeef1bc26cbe90f4e1a23cfed5940bbac04f28982812ae07a8d0ad23c3981565b3480156105de575f80fd5b505f546105f690640100000000900463ffffffff1681565b60405163ffffffff909116815260200161038b565b348015610616575f80fd5b50610639610625366004614e29565b60076020525f908152604090205460ff1681565b60405161038b9190614e40565b348015610651575f80fd5b506103eb61129b565b348015610665575f80fd5b506103b3610674366004614b23565b6112c9565b348015610684575f80fd5b506004546106aa9074010000000000000000000000000000000000000000900460ff1681565b604051901515815260200161038b565b3480156106c5575f80fd5b506103b36106d4366004614e29565b61134b565b6103b36106e7366004614e5a565b611391565b3480156106f7575f80fd5b505f54610477906801000000000000000090046001600160a01b031681565b348015610721575f80fd5b50600a54600b54610730919082565b6040805192835260208301919091520161038b565b348015610750575f80fd5b506104776e22d473030f116ddee9f6b43ac78ba381565b348015610772575f80fd5b506103b36114fb565b348015610786575f80fd5b506103eb7ff3f51acca0066ef7defe3ea640de2b9e07d96fade5fb959604a014440ab3d7cc81565b3480156107b9575f80fd5b506103eb6107c8366004614b23565b6001600160a01b03165f9081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00602052604090205490565b34801561080c575f80fd5b50600154610477906001600160a01b031681565b34801561082b575f80fd5b5061037d61083a366004614e74565b61150e565b34801561084a575f80fd5b506103b3611665565b34801561085e575f80fd5b506103b361086d366004614f03565b611736565b34801561087d575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610477565b3480156108b9575f80fd5b50601154601254610730919082565b3480156108d3575f80fd5b506103b36108e2366004614b23565b6119dc565b3480156108f2575f80fd5b506103b3610901366004614b23565b611a5a565b348015610911575f80fd5b50600454610477906001600160a01b031681565b348015610930575f80fd5b5061096d6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161038b9190614f91565b6103b3610988366004614fe4565b611ad4565b348015610998575f80fd5b506004546109c6907501000000000000000000000000000000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161038b565b3480156109ea575f80fd5b506103b36109f936600461503a565b611c3a565b348015610a09575f80fd5b506103b3610a18366004614b23565b611cca565b348015610a28575f80fd5b506103b3610a3736600461506f565b611d44565b348015610a47575f80fd5b506103b3610a563660046150b7565b611f5c565b348015610a66575f80fd5b50610477610a753660046150ea565b60096020525f90815260409020546001600160a01b031681565b348015610a9a575f80fd5b50610aae610aa9366004615103565b611feb565b60405161038b91906151f8565b348015610ac6575f80fd5b506103eb60055481565b348015610adb575f80fd5b50601454601554610730919082565b348015610af5575f80fd5b506103eb7f266096008cc1d427b37083c1e59371cf0173761773f5ee24fee15db496609bed81565b348015610b28575f80fd5b50600254610477906001600160a01b031681565b348015610b47575f80fd5b50600d54600e54610730919082565b348015610b61575f80fd5b506103b3610b70366004614b23565b6122c6565b348015610b80575f80fd5b505f546105f69063ffffffff1681565b348015610b9b575f80fd5b506103b3610baa366004614d3e565b61231c565b348015610bba575f80fd5b506103b3610bc9366004615278565b6123f1565b348015610bd9575f80fd5b506103b3610be8366004615300565b612696565b60408051610180810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820183905261010082018390526101208201839052610140820181905261016082015260045474010000000000000000000000000000000000000000900460ff1615610ca0576040517f02bb18c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546001600160a01b03163314610ce4576040517f29d983fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a8b511115610d20576040517f1b51089c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d328b8b8b8b8b8b8b8b8b5f6126ab565b909c909b509950505050505050505050565b610d4c612b83565b601080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527fc1f1475cd1d27fd368e9f8f208d68469a20695129a6bb78e7d1a0f970f6026959060200160405180910390a150565b6040805160e0810182525f8082526020820181905291810182905260608082018390526080820183905260a082015260c081019190915260045474010000000000000000000000000000000000000000900460ff1615610e44576040517f02bb18c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805146602082015230918101919091525f906060016040516020818303038152906040528051906020012090505f7f75108041a6a81a2f98b1dd7b5c7952bfe7620180ebd2f4676b628c82da4cec0782338c8c8c8c604051602001610eb1979695949392919061556b565b60408051601f19818403018152919052601754909150610edc906001600160a01b0316828888612bf7565b610eea8a338a8c8b89612cc1565b9a9950505050505050505050565b60045474010000000000000000000000000000000000000000900460ff1615610f4d576040517f02bb18c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f548190640100000000900463ffffffff16610f6d6101408301836155f3565b5f818110610f7d57610f7d615657565b9050602002016020810190610f929190615684565b63ffffffff1614610fcf576040517f43d7dc7b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82604051602001610fe1919061569d565b60408051601f198184030181529190528051602090910120905060065f8281526007602052604090205460ff16600981111561101f5761101f614cef565b1461105e576040517f4bfd0ae5000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b6110a9816110706101608601866156af565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506131bf92505050565b5f90815260076020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790555050565b5f546801000000000000000090046001600160a01b0316331480159061111757506001546001600160a01b03163314155b1561114e576040517f9e54918800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933905f90a1565b60045474010000000000000000000000000000000000000000900460ff16156111f5576040517f02bb18c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112003383836132de565b6001600160a01b0382165f9081526006602090815260408083203384529091528120805483929061123290849061573d565b90915550506040518181526001600160a01b0383169033907f8752a472e571a816aea92eec8dae9baf628e840f4929fbcc2d155e6233ff68a7906020015b60405180910390a35050565b6112846132f8565b61128d826133c8565b61129782826133d0565b5050565b5f6112a46134d1565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b6112d1612b83565b600280546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f7a193273ad96e9aef3cc696a63e316b572c173af157d568ea56dcbc6425a7e7891015b60405180910390a15050565b611353612b83565b600580549082905560408051828152602081018490527f93e4453d7ab6f59ea20f42db2f427c07a21a4447b279a2dc2ce878997b5a4880910161133f565b60045474010000000000000000000000000000000000000000900460ff16156113e6576040517f02bb18c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113ef81613533565b5f806113fa84613572565b6003545f80546040517f3e8c42940000000000000000000000000000000000000000000000000000000081529496509294509283926001600160a01b0390921691633e8c429491349161145c9163ffffffff9091169089908b90600401615750565b604080518083038185885af1158015611477573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061149c919061577e565b9092509050817f5e3a5b80dcf8e0fb984fe128ed0db507a86cc0674c4f5980f83b129b2cfdc69e846114d463ffffffff8a168261573d565b604080519283526020830191909152810184905260600160405180910390a2505050505050565b611503612b83565b61150c5f613728565b565b60408051610180810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820183905261010082018390526101208201839052610140820181905261016082015260045474010000000000000000000000000000000000000000900460ff16156115c1576040517f02bb18c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546001600160a01b03163314611605576040517f29d983fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a8b511115611641576040517f1b51089c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d328b6001600160a01b038c168b6001600160a01b038c168b8b8b8b8b5f6126ab565b5f546801000000000000000090046001600160a01b0316331480159061169657506001546001600160a01b03163314155b156116cd576040517f9e54918800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752905f90a1565b60045474010000000000000000000000000000000000000000900460ff161561178b576040517f02bb18c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61179483613533565b604080517fce1faaeef1bc26cbe90f4e1a23cfed5940bbac04f28982812ae07a8d0ad23c39602082015263ffffffff8a811682840152891660608201526001600160a01b03888116608083015260a0820188905260c0820187905260e0808301879052835180840390910181526101009092019092525f5490916118289168010000000000000000900416828786866137b0565b61183389888861384e565b5f8061183e8a613572565b6003545f80546040517f0278681b000000000000000000000000000000000000000000000000000000008152949650929450926001600160a01b0390911691630278681b9161189a9163ffffffff169087908c90600401615750565b602060405180830381865afa1580156118b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118d991906157a0565b6003545f80546040517f04e77a66000000000000000000000000000000000000000000000000000000008152939450909283926001600160a01b0316916304e77a66916119359163ffffffff1690899088908f906004016157b7565b60408051808303815f875af1158015611950573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611974919061577e565b91509150817f5e3a5b80dcf8e0fb984fe128ed0db507a86cc0674c4f5980f83b129b2cfdc69e858f63ffffffff16876119ad919061573d565b604080519283526020830191909152810184905260600160405180910390a25050505050505050505050505050565b6119e4612b83565b6003546040517f91a3ef8e0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152909116906391a3ef8e906024015f604051808303815f87803b158015611a41575f80fd5b505af1158015611a53573d5f803e3d5ffd5b5050505050565b611a62612b83565b601780546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f34f45330d12e136e35710c0b12bb3d009fb59bf6042d4d9fa611cb7ee4e74ead910161133f565b60045474010000000000000000000000000000000000000000900460ff1615611b29576040517f02bb18c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b3281613533565b5f80611b3e8585613915565b6003545f80546040517f3e8c42940000000000000000000000000000000000000000000000000000000081529496509294509283926001600160a01b0390921691633e8c4294913491611ba09163ffffffff9091169089908b90600401615750565b604080518083038185885af1158015611bbb573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611be0919061577e565b9092509050817f43a52e9a77f317a192970b363b14ece56df243fe0dd94f459f63029d657efec384611c12898261573d565b604080519283526020830191909152810184905260600160405180910390a250505050505050565b611c42612b83565b8060095f846001811115611c5857611c58614cef565b6001811115611c6957611c69614cef565b81526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f37c2b523addce9bbdac7ccde6d3a471e90d82c1b538b6779ce00beb4b7ae1edb828260405161133f9291906157e8565b611cd2612b83565b600380546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f68e84423772dadc3e4047f8b5bd221ddb02dc67796e7852533fd976947d86c51910161133f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080546004919068010000000000000000900460ff1680611d935750805467ffffffffffffffff808416911610155b15611dca576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001667ffffffffffffffff83161768010000000000000000178155600a54600b54611e179190613aab565b611e4d576040517fea364abd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d54600e54611e5d9190613aab565b611e93576040517fce9c362500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016011819055601455601080546001600160a01b038781167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560028054878416908316179055601780549286169290911691909117905580547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16815560405167ffffffffffffffff831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050565b611f64612b83565b6001600160a01b0382165f90815260086020526040902080548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660018381811115611fb557611fb5614cef565b02179055507f01373f2d31dc702eb723a3420b82d31bde7c67ce32b2711eae415fd6137810c9828260405161133f92919061580c565b60045460609074010000000000000000000000000000000000000000900460ff1615612043576040517f02bb18c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8914158061205257508a8714155b8061205d57508a8514155b15612094576040517fb01f79a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805146602082015230918101919091525f907f47fa6a5d212053b505e8157c5819225af8dc549dc5796a65c2bf35c33519e57e9060600160405160208183030381529060405280519060200120338f8f8f8f8f8f8f8f6040516020016121069b9a999897969594939291906158d1565b60408051601f19818403018152919052601754909150612131906001600160a01b0316828787612bf7565b8b67ffffffffffffffff81111561214a5761214a61476e565b6040519080825280602002602001820160405280156121cd57816020015b6040805160e0810182525f808252602080830182905292820181905260608083018290526080830182905260a083015260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816121685790505b5091505f5b8c8110156122b5576122908e8e838181106121ef576121ef615657565b905060200281019061220191906159e2565b338c8c8581811061221457612214615657565b905060200201358f8f8681811061222d5761222d615657565b905060200201358c8c8781811061224657612246615657565b905060200281019061225891906155f3565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508c9250612cc1915050565b8382815181106122a2576122a2615657565b60209081029190910101526001016121d2565b50509b9a5050505050505050505050565b6122ce612b83565b6001600160a01b038116612310576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401611055565b61231981613728565b50565b60045474010000000000000000000000000000000000000000900460ff1615612371576040517f02bb18c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382165f908152600660209081526040808320338452909152812080548392906123a3908490615a1e565b909155506123b49050338383613aca565b6040518181526001600160a01b0383169033907fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb90602001611270565b60045474010000000000000000000000000000000000000000900460ff1615612446576040517f02bb18c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61244f83613533565b604080517ff3f51acca0066ef7defe3ea640de2b9e07d96fade5fb959604a014440ab3d7cc602082015263ffffffff8b811682840152891660608201526001600160a01b03888116608083015260a0820188905260c0820187905260e0808301879052835180840390910181526101009092019092525f5489926124e39168010000000000000000900416828887876137b0565b6124ee8b898961384e565b5f806124fa8c8c613915565b6003545f80546040517f0278681b000000000000000000000000000000000000000000000000000000008152949650929450926001600160a01b0390911691630278681b916125569163ffffffff169087908d90600401615750565b602060405180830381865afa158015612571573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061259591906157a0565b90505f8060035f9054906101000a90046001600160a01b03166001600160a01b03166304e77a665f8054906101000a900463ffffffff1687868e6040518563ffffffff1660e01b81526004016125ee94939291906157b7565b60408051808303815f875af1158015612609573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262d919061577e565b9092509050817f43a52e9a77f317a192970b363b14ece56df243fe0dd94f459f63029d657efec38561266563ffffffff8b168261573d565b604080519283526020830191909152810184905260600160405180910390a250505050505050505050505050505050565b600254611297906001600160a01b0316613ade565b60408051610180810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e082018390526101008201839052610120820183905261014082018190526101608201528b516001036127635765ffffffffffff861615801590612727575088155b1561275e576040517f1e3429c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127af565b65ffffffffffff861615158061277857508815155b156127af576040517f69a9b62f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61c3508411156127eb576040517f6415b96a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6128578b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561282b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061284f9190615a31565b60128b613afc565b9050805f03612892576040517fee6def7500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836129b1576001600160a01b038b165f9081526008602052604081205460ff16908160018111156128c5576128c5614cef565b036128da576128d5338d8c6132de565b6129af565b5f60095f8360018111156128f0576128f0614cef565b600181111561290157612901614cef565b81526020019081526020015f205f9054906101000a90046001600160a01b03169050806001600160a01b031663f3a9a59e8e338e6040518463ffffffff1660e01b8152600401612980939291906001600160a01b03938416815291909216602082015260408101919091526080606082018190525f9082015260a00190565b5f604051808303815f87803b158015612997575f80fd5b505af11580156129a9573d5f803e3d5ffd5b50505050505b505b60408051610180810190915280338152602081018e90526040016001600160a01b038d168152602081018c90525f54640100000000900463ffffffff16604082015260048054606090920191601590612a2c907501000000000000000000000000000000000000000000900467ffffffffffffffff16615a51565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff1681526020014265ffffffffffff1681526020018865ffffffffffff1681526020018281526020018981526020018e815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250604051909250612ad9908390602001615a77565b60408051601f1981840301815291905280516020909101209250612afe601184613b6e565b5f838152600760205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055601254905184917f80eb6c87e9da127233fe2ecab8adf29403109adc6bec90147df35eeee074599191612b6b91908690614b0b565b60405180910390a2509a509a98505050505050505050565b33612bb57f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461150c576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401611055565b825160208401207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c8120612c6c905b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250613ba092505050565b9050856001600160a01b0316816001600160a01b031614612cb9576040517f2f427d7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6040805160e0810182525f8082526020820181905291810182905260608082018390526080820183905260a082015260c08101919091525f548790640100000000900463ffffffff16612d186101408301836155f3565b5f818110612d2857612d28615657565b9050602002016020810190612d3d9190615684565b63ffffffff1614612d7a576040517f43d7dc7b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f88604051602001612d8c919061569d565b60408051601f1981840301815291905280516020909101209050612db76101008a0160e08b01615a89565b612dc760e08b0160c08c01615a89565b612dd19190615aa2565b65ffffffffffff164210612e14576040517fc55b0e4800000000000000000000000000000000000000000000000000000000815260048101829052602401611055565b886101200135861015612e61576040517f166ba7e3000000000000000000000000000000000000000000000000000000008152600481018790526101208a01356024820152604401611055565b84511580612e705750600a8551115b15612ea7576040517f5454c37400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8181526007602052604081205460ff166009811115612ec957612ec9614cef565b14158015612ef9575060015f8281526007602052604090205460ff166009811115612ef657612ef6614cef565b14155b15612f33576040517f9cc863db00000000000000000000000000000000000000000000000000000000815260048101829052602401611055565b836130075760608901355f9081526006602090815260408083206001600160a01b038c168452909152902054861115612fcb5760608901355f9081526006602090815260408083206001600160a01b038c168452909152908190205490517ff0cb85ec000000000000000000000000000000000000000000000000000000008152600481018890526024810191909152604401611055565b60608901355f9081526006602090815260408083206001600160a01b038c16845290915281208054889290613001908490615a1e565b90915550505b5f81815260076020908152604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166003179055890135158015906130545750606089013515155b801561305f57508515155b1561309e57836130815761307c60208a013560608b013588613aca565b61309e565b61309e6001600160a01b0360608b0135168960208c013589613bc8565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706130cd6101608b018b6156af565b6040516130db929190615ac8565b6040518091039020146130fa576130fa816110706101608c018c6156af565b6040518060e001604052808281526020018881526020018a6040013581526020018a608001602081019061312e9190615684565b63ffffffff1681526020018781526020018681526020014265ffffffffffff168152509250613167836014613c4a90919063ffffffff16565b86886001600160a01b0316827fe3bc4b05ac625e8c55084d86f8bb9a4c1ff02777dccc7ec0f3b3b7e7468cf383896014600101548e6040516131ab93929190615ad7565b60405180910390a450509695505050505050565b5f80828060200190518101906131d59190615b42565b60045491935091505f9081906001600160a01b0316636dc63837856127105a6131fe9190615a1e565b5f610100886040518663ffffffff1660e01b8152600401613223959493929190615b86565b5f604051808303815f875af115801561323e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526132659190810190615bbd565b9150915081156132ac57857f72c7d97e6fac52d20092b101af2183fd0bd04b357a936e82537e8974ea2c0eb78260405161329f9190614f91565b60405180910390a2612cb9565b6040517f2f5746e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132f36001600160a01b038316843084613bc8565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061339157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166133857f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b1561150c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612319612b83565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561342a575060408051601f3d908101601f19168201909252613427918101906157a0565b60015b61346b576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401611055565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146134c7576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401611055565b6132f38383613d39565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461150c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554811115612319576040517f7e97a2a100000000000000000000000000000000000000000000000000000000815260048101829052602401611055565b6014546015546060915f9163ffffffff85168084036135bd576040517f7c0ffbda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160016135ca838661573d565b6135d49190615a1e565b111561361d576040517fa617ee68000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260448101829052606401611055565b60145493505f63ffffffff871667ffffffffffffffff8111156136425761364261476e565b6040519080825280602002602001820160405280156136c557816020015b6040805160e0810182525f808252602080830182905292820181905260608083018290526080830182905260a083015260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816136605790505b5090505f5b8763ffffffff168163ffffffff161015613713576136e86014613d8e565b828263ffffffff168151811061370057613700615657565b60209081029190910101526001016136ca565b5061371d81613f91565b955050505050915091565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b835160208501207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c81206137ee90612c31565b9050866001600160a01b0316816001600160a01b03161461383b576040517f24c55ca400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138458186613fbd565b50505050505050565b5f5463ffffffff8481166401000000009092041614613899576040517f66b0477d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03821633146138db576040517f4744936400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b804211156132f3576040517f26f774b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011546012546060915f918480840361395a576040517f7c0ffbda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001613967838661573d565b6139719190615a1e565b11156139ba576040517fa617ee68000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260448101829052606401611055565b60115493505f5b63ffffffff8116871115613a8c575f6139da6011614047565b90505f89898463ffffffff168181106139f5576139f5615657565b9050602002810190613a0791906159e2565b604051602001613a17919061569d565b604051602081830303815290604052805190602001209050808214613a77576040517f908c3ec70000000000000000000000000000000000000000000000000000000081526004810182905263ffffffff84166024820152604401611055565b50508080613a8490615bd9565b9150506139c1565b50613a9f613a9a8789615bf1565b6140b6565b94505050509250929050565b5f82821080613ac1575082158015613ac1575081155b90505b92915050565b6132f36001600160a01b03831684836140cd565b365f80375f80365f845af43d5f803e808015613af8573d5ff35b3d5ffd5b5f8260ff168460ff1603613b11575080613b67565b8260ff168460ff161015613b4557613b298484615d3a565b613b3490600a615e71565b613b3e9083615e7f565b9050613b67565b613b4f8385615d3a565b613b5a90600a615e71565b613b649083615e96565b90505b9392505050565b6001826001015f828254613b82919061573d565b909155505060018201545f9081526002909201602052604090912055565b5f805f80613bae86866140fe565b925092509250613bbe8282614147565b5090949350505050565b6040516001600160a01b038481166024830152838116604483015260648201839052613c449186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061424a565b50505050565b6001826001015f828254613c5e919061573d565b90915550506001828101545f90815260028085016020908152604092839020855181558582015194810194909455918401519083015560608301516003830180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9092169190911790556080830151600483015560a08301518051849392613cf4926005850192910190614690565b5060c09190910151600690910180547fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001665ffffffffffff9092169190911790555050565b613d42826142c4565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115613d86576132f3828261436b565b6112976143dd565b6040805160e0810182525f8082526020820181905291810182905260608082018390526080820183905260a082015260c0810191909152815460018301541015613e04576040517f950f1c1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81545f90815260028084016020908152604092839020835160e081018552815481526001820154818401529281015483850152600381015463ffffffff166060840152600481015460808401526005810180548551818502810185019096528086529394919360a0860193830182828015613ec757602002820191905f5260205f20905f905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411613e8a5790505b50505091835250506006919091015465ffffffffffff1660209182015283545f908152600280860190925260408120818155600181018290559182018190556003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001690556004820181905591925090613f48600583018261473c565b5060060180547fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000169055815460019083905f90613f8690849061573d565b909155509092915050565b6060613ac4600183604051602001613fa991906151f8565b604051602081830303815290604052614415565b6001600160a01b0382165f9081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00602052604090208054600181019091558181146132f3576040517f752d88c00000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101829052604401611055565b5f815f015482600101541015614089576040517f950f1c1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5080545f908152600282016020526040812080549082905582549091600191849190613f8690849061573d565b6060613ac45f83604051602001613fa99190615ece565b6040516001600160a01b038381166024830152604482018390526132f391859182169063a9059cbb90606401613bfd565b5f805f8351604103614135576020840151604085015160608601515f1a61412788828585614452565b955095509550505050614140565b505081515f91506002905b9250925092565b5f82600381111561415a5761415a614cef565b03614163575050565b600182600381111561417757614177614cef565b036141ae576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028260038111156141c2576141c2614cef565b036141fc576040517ffce698f700000000000000000000000000000000000000000000000000000000815260048101829052602401611055565b600382600381111561421057614210614cef565b03611297576040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260048101829052602401611055565b5f61425e6001600160a01b0384168361451a565b905080515f141580156142825750808060200190518101906142809190615f41565b155b156132f3576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401611055565b806001600160a01b03163b5f03614312576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401611055565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516143879190615f5c565b5f60405180830381855af49150503d805f81146143bf576040519150601f19603f3d011682016040523d82523d5f602084013e6143c4565b606091505b50915091506143d4858383614527565b95945050505050565b341561150c576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606082600381111561442957614429614cef565b8260405160200161443b929190615f72565b604051602081830303815290604052905092915050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561448b57505f91506003905082614510565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156144dc573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661450757505f925060019150829050614510565b92505f91508190505b9450945094915050565b6060613ac183835f61459c565b60608261453c576145378261464e565b613b67565b815115801561455357506001600160a01b0384163b155b15614595576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401611055565b5080613b67565b6060814710156145da576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401611055565b5f80856001600160a01b031684866040516145f59190615f5c565b5f6040518083038185875af1925050503d805f811461462f576040519150601f19603f3d011682016040523d82523d5f602084013e614634565b606091505b5091509150614644868383614527565b9695505050505050565b80511561465e5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828054828255905f5260205f209060070160089004810192821561472c579160200282015f5b838211156146fa57835183826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026146b6565b801561472a5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026146fa565b505b5061473892915061475a565b5090565b5080545f825560070160089004905f5260205f209081019061231991905b5b80821115614738575f815560010161475b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051610180810167ffffffffffffffff811182821017156147bf576147bf61476e565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156147ee576147ee61476e565b604052919050565b5f67ffffffffffffffff82111561480f5761480f61476e565b5060051b60200190565b803563ffffffff8116811461482c575f80fd5b919050565b5f82601f830112614840575f80fd5b81356020614855614850836147f6565b6147c5565b8083825260208201915060208460051b870101935086841115614876575f80fd5b602086015b848110156148995761488c81614819565b835291830191830161487b565b509695505050505050565b6001600160a01b0381168114612319575f80fd5b803565ffffffffffff8116811461482c575f80fd5b5f8083601f8401126148dd575f80fd5b50813567ffffffffffffffff8111156148f4575f80fd5b60208301915083602082850101111561490b575f80fd5b9250929050565b5f805f805f805f805f6101008a8c03121561492b575f80fd5b893567ffffffffffffffff80821115614942575f80fd5b61494e8d838e01614831565b9a5060208c0135995060408c01359150614967826148a4565b81985060608c0135975060808c0135965060a08c0135955061498b60c08d016148b8565b945060e08c01359150808211156149a0575f80fd5b506149ad8c828d016148cd565b915080935050809150509295985092959850929598565b5f815180845260208085019450602084015f5b838110156149f957815163ffffffff16875295820195908201906001016149d7565b509495945050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f610180825184526020830151602085015260408301516040850152606083015160608501526080830151614a6f608086018263ffffffff169052565b5060a0830151614a8b60a086018267ffffffffffffffff169052565b5060c0830151614aa560c086018265ffffffffffff169052565b5060e0830151614abf60e086018265ffffffffffff169052565b506101008381015190850152610120808401519085015261014080840151818601839052614aef838701826149c4565b9250505061016080840151858303828701526146448382614a04565b828152604060208201525f613b646040830184614a32565b5f60208284031215614b33575f80fd5b8135613b67816148a4565b5f8060408385031215614b4f575f80fd5b50508035926020909101359150565b5f6101808284031215614b6f575f80fd5b50919050565b8015158114612319575f80fd5b803561482c81614b75565b5f805f805f805f60c0888a031215614ba3575f80fd5b873567ffffffffffffffff80821115614bba575f80fd5b614bc68b838c01614b5e565b985060208a0135975060408a0135965060608a0135915080821115614be9575f80fd5b614bf58b838c01614831565b955060808a0135915080821115614c0a575f80fd5b50614c178a828b016148cd565b90945092505060a0880135614c2b81614b75565b8091505092959891949750929550565b80518252602081015160208301526040810151604083015263ffffffff6060820151166060830152608081015160808301525f60a082015160e060a0850152614c8760e08501826149c4565b60c09384015165ffffffffffff16949093019390935250919050565b602081525f613ac16020830184614c3b565b5f60208284031215614cc5575f80fd5b813567ffffffffffffffff811115614cdb575f80fd5b614ce784828501614b5e565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110614d2c57614d2c614cef565b9052565b60208101613ac48284614d1c565b5f8060408385031215614d4f575f80fd5b8235614d5a816148a4565b946020939093013593505050565b5f67ffffffffffffffff821115614d8157614d8161476e565b50601f01601f191660200190565b5f82601f830112614d9e575f80fd5b8135614dac61485082614d68565b818152846020838601011115614dc0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215614ded575f80fd5b8235614df8816148a4565b9150602083013567ffffffffffffffff811115614e13575f80fd5b614e1f85828601614d8f565b9150509250929050565b5f60208284031215614e39575f80fd5b5035919050565b60208101600a8310614e5457614e54614cef565b91905290565b5f8060408385031215614e6b575f80fd5b614d5a83614819565b5f805f805f805f805f6101008a8c031215614e8d575f80fd5b893567ffffffffffffffff80821115614ea4575f80fd5b614eb08d838e01614831565b9a5060208c01359150614ec2826148a4565b90985060408b013590614ed4826148a4565b90975060608b013590614ee6826148a4565b81975060808c0135965060a08c0135955061498b60c08d016148b8565b5f805f805f805f8060e0898b031215614f1a575f80fd5b614f2389614819565b9750614f3160208a01614819565b96506040890135614f41816148a4565b9550606089013594506080890135935060a0890135925060c089013567ffffffffffffffff811115614f71575f80fd5b614f7d8b828c016148cd565b999c989b5096995094979396929594505050565b602081525f613ac16020830184614a04565b5f8083601f840112614fb3575f80fd5b50813567ffffffffffffffff811115614fca575f80fd5b6020830191508360208260051b850101111561490b575f80fd5b5f805f60408486031215614ff6575f80fd5b833567ffffffffffffffff81111561500c575f80fd5b61501886828701614fa3565b909790965060209590950135949350505050565b80356002811061482c575f80fd5b5f806040838503121561504b575f80fd5b6150548361502c565b91506020830135615064816148a4565b809150509250929050565b5f805f60608486031215615081575f80fd5b833561508c816148a4565b9250602084013561509c816148a4565b915060408401356150ac816148a4565b809150509250925092565b5f80604083850312156150c8575f80fd5b82356150d3816148a4565b91506150e16020840161502c565b90509250929050565b5f602082840312156150fa575f80fd5b613ac18261502c565b5f805f805f805f805f805f60c08c8e03121561511d575f80fd5b67ffffffffffffffff808d351115615133575f80fd5b6151408e8e358f01614fa3565b909c509a5060208d0135811015615155575f80fd5b6151658e60208f01358f01614fa3565b909a50985060408d013581101561517a575f80fd5b61518a8e60408f01358f01614fa3565b909850965060608d013581101561519f575f80fd5b6151af8e60608f01358f01614fa3565b909650945060808d01358110156151c4575f80fd5b506151d58d60808e01358e016148cd565b90935091506151e660a08d01614b82565b90509295989b509295989b9093969950565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561526b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452615259858351614c3b565b9450928501929085019060010161521f565b5092979650505050505050565b5f805f805f805f805f60e08a8c031215615290575f80fd5b6152998a614819565b985060208a013567ffffffffffffffff808211156152b5575f80fd5b6152c18d838e01614fa3565b909a50985060408c013591506152d6826148a4565b90965060608b0135955060808b0135945060a08b0135935060c08b013590808211156149a0575f80fd5b5f8060208385031215615311575f80fd5b823567ffffffffffffffff811115615327575f80fd5b615333858286016148cd565b90969095509350505050565b803567ffffffffffffffff8116811461482c575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615389575f80fd5b830160208101925035905067ffffffffffffffff8111156153a8575f80fd5b8060051b360382131561490b575f80fd5b8183525f60208085019450825f5b858110156149f95763ffffffff6153dd83614819565b16875295820195908201906001016153c7565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615423575f80fd5b830160208101925035905067ffffffffffffffff811115615442575f80fd5b80360382131561490b575f80fd5b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b5f610180823584526020830135602085015260408301356040850152606083013560608501526154ab60808401614819565b63ffffffff1660808501526154c260a0840161533f565b67ffffffffffffffff1660a08501526154dd60c084016148b8565b65ffffffffffff1660c08501526154f660e084016148b8565b65ffffffffffff1660e08501526101008381013590850152610120808401359085015261014061552881850185615356565b838388015261553a84880182846153b9565b935050505061016061554e818501856153f0565b86840383880152615560848284615450565b979650505050505050565b8781525f60208860208401526001600160a01b038816604084015260e0606084015261559a60e0840188615479565b6080840187905260a0840186905283810360c0850152845180825260208087019201905f5b818110156155e157835163ffffffff16835292840192918401916001016155bf565b50909c9b505050505050505050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615626575f80fd5b83018035915067ffffffffffffffff821115615640575f80fd5b6020019150600581901b360382131561490b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215615694575f80fd5b613ac182614819565b602081525f613ac16020830184615479565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126156e2575f80fd5b83018035915067ffffffffffffffff8211156156fc575f80fd5b60200191503681900382131561490b575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115613ac457613ac4615710565b63ffffffff84168152606060208201525f61576e6060830185614a04565b9050826040830152949350505050565b5f806040838503121561578f575f80fd5b505080516020909101519092909150565b5f602082840312156157b0575f80fd5b5051919050565b63ffffffff85168152608060208201525f6157d56080830186614a04565b6040830194909452506060015292915050565b604081016157f68285614d1c565b6001600160a01b03831660208301529392505050565b6001600160a01b038316815260408101613b676020830184614d1c565b8183525f7f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115615859575f80fd5b8260051b80836020870137939093016020019392505050565b5f838385526020808601955060208560051b830101845f5b878110156158c457601f198584030189526158a58288615356565b6158b08582846153b9565b9a86019a945050509083019060010161588a565b5090979650505050505050565b5f60e082018d83528c60208401526001600160a01b038c16604084015260e06060840152808a8252610100840190506101008b60051b85010191508b5f5b8c811015615990577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008685030183527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe818e36030182351261596e575f80fd5b61597b848f843501615479565b9350602092830192919091019060010161590f565b50505082810360808401526159a681898b615829565b905082810360a08401526159bb818789615829565b905082810360c08401526159d0818587615872565b9e9d5050505050505050505050505050565b5f82357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81833603018112615a14575f80fd5b9190910192915050565b81810381811115613ac457613ac4615710565b5f60208284031215615a41575f80fd5b815160ff81168114613b67575f80fd5b5f67ffffffffffffffff808316818103615a6d57615a6d615710565b6001019392505050565b602081525f613ac16020830184614a32565b5f60208284031215615a99575f80fd5b613ac1826148b8565b65ffffffffffff818116838216019080821115615ac157615ac1615710565b5092915050565b818382375f9101908152919050565b838152826020820152606060408201525f6143d46060830184615479565b5f82601f830112615b04575f80fd5b8151615b1261485082614d68565b818152846020838601011115615b26575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f8060408385031215615b53575f80fd5b8251615b5e816148a4565b602084015190925067ffffffffffffffff811115615b7a575f80fd5b614e1f85828601615af5565b6001600160a01b038616815284602082015283604082015261ffff8316606082015260a060808201525f61556060a0830184614a04565b5f8060408385031215615bce575f80fd5b8251615b5e81614b75565b5f63ffffffff808316818103615a6d57615a6d615710565b5f615bfe614850846147f6565b80848252602080830192508560051b850136811115615c1b575f80fd5b855b81811015615d2e57803567ffffffffffffffff80821115615c3c575f80fd5b81890191506101808236031215615c51575f80fd5b615c5961479b565b82358152858301358682015260408084013590820152606080840135908201526080615c86818501614819565b9082015260a0615c9784820161533f565b9082015260c0615ca88482016148b8565b9082015260e0615cb98482016148b8565b90820152610100838101359082015261012080840135908201526101408084013583811115615ce6575f80fd5b615cf236828701614831565b8284015250506101608084013583811115615d0b575f80fd5b615d1736828701614d8f565b918301919091525087525050938201938201615c1d565b50919695505050505050565b60ff8281168282160390811115613ac457613ac4615710565b600181815b80851115615dac57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615d9257615d92615710565b80851615615d9f57918102915b93841c9390800290615d58565b509250929050565b5f82615dc257506001613ac4565b81615dce57505f613ac4565b8160018114615de45760028114615dee57615e0a565b6001915050613ac4565b60ff841115615dff57615dff615710565b50506001821b613ac4565b5060208310610133831016604e8410600b8410161715615e2d575081810a613ac4565b615e378383615d53565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615e6957615e69615710565b029392505050565b5f613ac160ff841683615db4565b8082028115828204841417613ac457613ac4615710565b5f82615ec9577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561526b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452615f2f858351614a32565b94509285019290850190600101615ef5565b5f60208284031215615f51575f80fd5b8151613b6781614b75565b5f82518060208501845e5f920191825250919050565b60ff83168152604060208201525f613b646040830184614a0456fea2646970667358221220e48d2d50c43a63e881dc45ff011bf2a4bec7bb428201464b57b392460fbe3da564736f6c63430008190033