0 txs
0 calls
constructor
constructor(address _token, uint8 _mode, uint16 _chainId, uint64 _rateLimitDuration, bool _skipRateLimiting)
functions
chainId
viewfunction chainId() view returns (uint16)
getCurrentInboundCapacity
viewfunction getCurrentInboundCapacity(uint16 chainId_) view returns (uint256)
getCurrentOutboundCapacity
viewfunction getCurrentOutboundCapacity() view returns (uint256)
getInboundLimitParams
viewfunction getInboundLimitParams(uint16 chainId_) view returns (tuple)
getInboundQueuedTransfer
viewfunction getInboundQueuedTransfer(bytes32 digest) view returns (tuple)
getMigratesImmutables
viewfunction getMigratesImmutables() view returns (bool)
getMode
viewfunction getMode() view returns (uint8)
getOutboundLimitParams
purefunction getOutboundLimitParams() pure returns (tuple)
getOutboundQueuedTransfer
viewfunction getOutboundQueuedTransfer(uint64 queueSequence) view returns (tuple)
getPeer
viewfunction getPeer(uint16 chainId_) view returns (tuple)
getThreshold
viewfunction getThreshold() view returns (uint8)
getTransceiverInfo
viewfunction getTransceiverInfo() view returns (tuple[])
getTransceivers
purefunction getTransceivers() pure returns (address[] result)
isMessageApproved
viewfunction isMessageApproved(bytes32 digest) view returns (bool)
isMessageExecuted
viewfunction isMessageExecuted(bytes32 digest) view returns (bool)
isPaused
viewfunction isPaused() view returns (bool)
messageAttestations
viewfunction messageAttestations(bytes32 digest) view returns (uint8 count)
mode
viewfunction mode() view returns (uint8)
nextMessageSequence
viewfunction nextMessageSequence() view returns (uint64)
NTT_MANAGER_VERSION
viewfunction NTT_MANAGER_VERSION() view returns (string)
owner
viewfunction owner() view returns (address)
pauser
viewfunction pauser() view returns (address)
quoteDeliveryPrice
viewfunction quoteDeliveryPrice(uint16 recipientChain, bytes transceiverInstructions) view returns (uint256[], uint256)
rateLimitDuration
viewfunction rateLimitDuration() view returns (uint64)
token
viewfunction token() view returns (address)
tokenDecimals
viewfunction tokenDecimals() view returns (uint8)
transceiverAttestedToMessage
viewfunction transceiverAttestedToMessage(bytes32 digest, uint8 index) view returns (bool)
attestationReceived
nonpayablefunction attestationReceived(uint16 sourceChainId, bytes32 sourceNttManagerAddress, tuple payload)
cancelOutboundQueuedTransfer
nonpayablefunction cancelOutboundQueuedTransfer(uint64 messageSequence)
completeInboundQueuedTransfer
nonpayablefunction completeInboundQueuedTransfer(bytes32 digest)
completeOutboundQueuedTransfer
payablefunction completeOutboundQueuedTransfer(uint64 messageSequence) payable returns (uint64)
executeMsg
nonpayablefunction executeMsg(uint16 sourceChainId, bytes32 sourceNttManagerAddress, tuple message)
initialize
payablefunction initialize() payable
migrate
nonpayablefunction migrate()
pause
nonpayablefunction pause()
removeTransceiver
nonpayablefunction removeTransceiver(address transceiver)
setInboundLimit
nonpayablefunction setInboundLimit(uint256 limit, uint16 chainId_)
setOutboundLimit
nonpayablefunction setOutboundLimit(uint256 limit)
setPeer
nonpayablefunction setPeer(uint16 peerChainId, bytes32 peerContract, uint8 decimals, uint256 inboundLimit)
setThreshold
nonpayablefunction setThreshold(uint8 threshold)
setTransceiver
nonpayablefunction setTransceiver(address transceiver)
transfer
payablefunction transfer(uint256 amount, uint16 recipientChain, bytes32 recipient, bytes32 refundAddress, bool shouldQueue, bytes transceiverInstructions) payable returns (uint64)
transfer
payablefunction transfer(uint256 amount, uint16 recipientChain, bytes32 recipient) payable returns (uint64)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
transferPauserCapability
nonpayablefunction transferPauserCapability(address newPauser)
unpause
nonpayablefunction unpause()
upgrade
nonpayablefunction upgrade(address newImplementation)
events
AdminChanged
event AdminChanged(address previousAdmin, address newAdmin)
BeaconUpgraded
event BeaconUpgraded(address indexed beacon)
InboundTransferLimitUpdated
event InboundTransferLimitUpdated(uint16 indexed chainId, uint256 oldLimit, uint256 newLimit)
InboundTransferQueued
event InboundTransferQueued(bytes32 digest)
Initialized
event Initialized(uint64 version)
MessageAlreadyExecuted
event MessageAlreadyExecuted(bytes32 indexed sourceNttManager, bytes32 indexed msgHash)
MessageAttestedTo
event MessageAttestedTo(bytes32 digest, address transceiver, uint8 index)
NotPaused
event NotPaused(bool notPaused)
OutboundTransferCancelled
event OutboundTransferCancelled(uint256 sequence, address recipient, uint256 amount)
OutboundTransferLimitUpdated
event OutboundTransferLimitUpdated(uint256 oldLimit, uint256 newLimit)
OutboundTransferQueued
event OutboundTransferQueued(uint64 queueSequence)
OutboundTransferRateLimited
event OutboundTransferRateLimited(address indexed sender, uint64 sequence, uint256 amount, uint256 currentCapacity)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
Paused
event Paused(bool paused)
PauserTransferred
event PauserTransferred(address indexed oldPauser, address indexed newPauser)
PeerUpdated
event PeerUpdated(uint16 indexed chainId_, bytes32 oldPeerContract, uint8 oldPeerDecimals, bytes32 peerContract, uint8 peerDecimals)
ThresholdChanged
event ThresholdChanged(uint8 oldThreshold, uint8 threshold)
TransceiverAdded
event TransceiverAdded(address transceiver, uint256 transceiversNum, uint8 threshold)
TransceiverRemoved
event TransceiverRemoved(address transceiver, uint8 threshold)
TransferRedeemed
event TransferRedeemed(bytes32 indexed digest)
TransferSent
event TransferSent(bytes32 indexed digest)
TransferSent
event TransferSent(bytes32 indexed recipient, bytes32 indexed refundAddress, uint256 amount, uint256 fee, uint16 recipientChain, uint64 msgSequence)
Upgraded
event Upgraded(address indexed implementation)
errors
BurnAmountDifferentThanBalanceDiff
error BurnAmountDifferentThanBalanceDiff(uint256 burnAmount, uint256 balanceDiff)
CallerNotTransceiver
error CallerNotTransceiver(address caller)
CancellerNotSender
error CancellerNotSender(address canceller, address sender)
CapacityCannotExceedLimit
error CapacityCannotExceedLimit(uint72 newCurrentCapacity, uint72 newLimit)
DeliveryPaymentTooLow
error DeliveryPaymentTooLow(uint256 requiredPayment, uint256 providedPayment)
DisabledTransceiver
error DisabledTransceiver(address transceiver)
InboundQueuedTransferNotFound
error InboundQueuedTransferNotFound(bytes32 digest)
InboundQueuedTransferStillQueued
error InboundQueuedTransferStillQueued(bytes32 digest, uint256 transferTimestamp)
InvalidFork
error InvalidFork(uint256 evmChainId, uint256 blockChainId)
InvalidInitialization
error InvalidInitialization()
InvalidMode
error InvalidMode(uint8 mode)
InvalidPauser
error InvalidPauser(address account)
InvalidPeer
error InvalidPeer(uint16 chainId, bytes32 peerAddress)
InvalidPeerChainIdZero
error InvalidPeerChainIdZero()
InvalidPeerDecimals
error InvalidPeerDecimals()
InvalidPeerSameChainId
error InvalidPeerSameChainId()
InvalidPeerZeroAddress
error InvalidPeerZeroAddress()
InvalidRecipient
error InvalidRecipient()
InvalidRefundAddress
error InvalidRefundAddress()
InvalidTargetChain
error InvalidTargetChain(uint16 targetChain, uint16 thisChain)
InvalidTransceiverZeroAddress
error InvalidTransceiverZeroAddress()
MessageNotApproved
error MessageNotApproved(bytes32 msgHash)
NoEnabledTransceivers
error NoEnabledTransceivers()
NonRegisteredTransceiver
error NonRegisteredTransceiver(address transceiver)
NotAnEvmAddress
error NotAnEvmAddress(bytes32)
NotEnoughCapacity
error NotEnoughCapacity(uint256 currentCapacity, uint256 amount)
NotImplemented
error NotImplemented()
NotInitializing
error NotInitializing()
NotMigrating
error NotMigrating()
NumberOfDecimalsNotEqual
error NumberOfDecimalsNotEqual(uint8 decimals, uint8 decimalsOther)
OnlyDelegateCall
error OnlyDelegateCall()
OutboundQueuedTransferNotFound
error OutboundQueuedTransferNotFound(uint64 queueSequence)
OutboundQueuedTransferStillQueued
error OutboundQueuedTransferStillQueued(uint64 queueSequence, uint256 transferTimestamp)
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
PeerNotRegistered
error PeerNotRegistered(uint16 chainId)
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
RefundFailed
error RefundFailed(uint256 refundAmount)
RequireContractIsNotPaused
error RequireContractIsNotPaused()
RequireContractIsPaused
error RequireContractIsPaused()
RetrievedIncorrectRegisteredTransceivers
error RetrievedIncorrectRegisteredTransceivers(uint256 retrieved, uint256 registered)
StaticcallFailed
error StaticcallFailed()
ThresholdTooHigh
error ThresholdTooHigh(uint256 threshold, uint256 transceivers)
TooManyTransceivers
error TooManyTransceivers()
TransceiverAlreadyAttestedToMessage
error TransceiverAlreadyAttestedToMessage(bytes32 nttManagerMessageHash)
TransceiverAlreadyEnabled
error TransceiverAlreadyEnabled(address transceiver)
TransferAmountHasDust
error TransferAmountHasDust(uint256 amount, uint256 dust)
UndefinedRateLimiting
error UndefinedRateLimiting()
UnexpectedDeployer
error UnexpectedDeployer(address expectedOwner, address owner)
UnexpectedMsgValue
error UnexpectedMsgValue()
ZeroAmount
error ZeroAmount()
ZeroThreshold
error ZeroThreshold()
creation bytecode
0x61016034620005a757601f6200629338819003918201601f19168301916001600160401b038311848410176200055c5780849260a094604052833981010312620005a7578051906001600160a01b0382168203620005a7576020810151916002831015620005a75760408201519161ffff83168303620005a7576060810151906001600160401b03821690818303620005a7576080015180159182158203620005a757158092816200059e575b50821562000582575b505062000570576080527f8561949d1c6242cee5c5a5aeb6b9c190ee611d7742fcec65d9e5b1341ea04d8954620001147e758a264b9bdbe3295fe36bd6ff7abaa122f48bf70e90af04a1b8a32d21e4e15460ff8360081c1614620005ab565b7ffd6568c039679b3b7cc93c26c41d9379b7b1bec1677120493b467688302cb11f545f5b60ff8360081c168110620003d95750505f5b60ff8260081c168110620003545750604060ff6200016b92161115620005ab565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c1662000342576002600160401b03196001600160401b03821601620002f6575b50503060a05260c0526101009182526101209081526101404681523360e05260405191615c81938462000612853960805184818161148101528181611ad801528181611f54015281816129580152818161330601528181614c320152818161543e015281816154fc01528181615623015281816157c7015261588c015260a051846139bf015260c05184818161028d0152818161050f0152818161055b0152818161284401528181612f0e01528181613af601528181613d3f01528181613ff501526143d2015260e05184611c1d0152518381816104a601528181611fcd015281816120f70152818161289201528181613a8401528181613dc4015261407601525182818161132601528181611e13015281816128fb015281816145dd015261518101525181818161044401528181613a390152818161427b0152614cc80152f35b6001600160401b0319166001600160401b039081179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80620001b4565b60405163f92ee8a960e01b8152600490fd5b6001808201808311620003c5575b60ff8460081c1681106200037b5750506001016200014a565b8190620003be6200038c85620005c7565b90546003906200039c85620005c7565b60018060a01b03915490841b1c169260018060a01b03921b1c161415620005ab565b0162000362565b634e487b7160e01b5f52601160045260245ffd5b620003e481620005c7565b9054600382901b81901c6001600160a01b03165f9081527f49bca747e973430e858f2f5de357b8dba36ea6d375b81bdb5d53dfaabf0b3a7f60205260409081902090519291906001600160401b0360608501908111908511176200055c5760608401604052546200048660ff821615801592838752602087019360ff808360081c1615928315875260101c16908160408a0152926200053f575b5050620005ab565b60018060401b03600160ff6040870151161b871616151590511515925f925f5b60ff8a60081c168110620004f5575b505050826001959492620004d3620004ee95620004dc9414620005ab565b151514620005ab565b60ff60408188169201511610620005ab565b0162000138565b6200050081620005c7565b9054600391821b1c6001600160a01b039081169185901b84901c16146200052a57600101620004a6565b5060019350849150829050620004d3620004b5565b9091508162000552575b505f806200047e565b9050155f62000549565b634e487b7160e01b5f52604160045260245ffd5b60405163e543ef0560e01b8152600490fd5b1591508162000595575b505f80620000b5565b90505f6200058c565b92505f620000ac565b5f80fd5b15620005b357565b634e487b7160e01b5f52600160045260245ffd5b7e758a264b9bdbe3295fe36bd6ff7abaa122f48bf70e90af04a1b8a32d21e4e18054821015620005fd575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffdfe60806040526004361015610011575f80fd5b5f803560e01c80630271725014612bd0578063036de8af14612b495780630677df5414612b2b5780630900f010146126c4578063186ce61214612694578063190171751461265e5780631f97c9a81461246f578063203e4a9b1461218157806323d75e311461213b578063295a5212146120e1578063396c16b7146120a65780633b97e8561461208b5780633f4ba83a146120185780634b4fd03b14611fba578063689f90c314611f7857806374aa7bfc14611f345780637c91863414611dc35780638129fc1c14611b915780638413bcba14611a765780638456cb59146119fb57806386e11ffa146119d657806389c619dd146119785780638da5cb5b146119435780638e3ba8c91461190c5780638fd3ab80146117cf5780639057412d14611654578063961b94d0146115f757806397c351461461134a5780639a8a05921461130b5780639d782454146110de5780639f86029c14610de15780639fd0506d14610dac578063b150fc5514610c09578063b187bd2614610bdc578063b293f97f14610b48578063b4d591bb14610a89578063c0b07bde14610a43578063c128d170146109ca578063d788c14714610942578063da4856a114610910578063e5a9860314610865578063e75235b814610838578063f2fde38b146106fb578063f5cfec18146106d8578063f7514fbc146102bc578063fc0c546a146102775763fd96063c1461021f575f80fd5b3461027457602036600319011261027457606061023d600435613268565b6040805182516001600160481b031681526020808401516001600160401b031690820152918101516001600160a01b031690820152f35b80fd5b50346102745780600319360112610274576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034610274576020366003190112610274576004356001600160401b03811681036106d4576102e9613a00565b60025f80516020615b0c83398151915254146106c2576001600160401b0381165f525f80516020615bcc83398151915260205260405f206040519061032d82612c9d565b8054825260046001916001810154602085015261ffff60028201546001600160481b03811660408701526001600160401b038160481c16606087015260881c16608085015260018060a01b0360038201541660a0850152016040518092869083549361039885612e74565b808552946001811690811561069e575060011461065f575b50506103be92500382612d09565b60c08201526001600160401b036060820151161561063e5760a08101516001600160a01b03163381036106115750606061048760407ff80e572ae1b63e2449629b6c7d783add85c36473926f216077f17ee002bcfd07936001600160401b0386165f525f80516020615bcc83398151915260205261043d825f2061318c565b01516104687f0000000000000000000000000000000000000000000000000000000000000000614b63565b610470612ee9565b906001600160401b0360ff82169160081c166149f7565b926001600160401b0360405191168152336020820152836040820152a17f000000000000000000000000000000000000000000000000000000000000000060028110156105fd5780610550575060405163a9059cbb60e01b6020820152336024820152604481019190915261053c9061050d81606481015b03601f198101835282612d09565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316615328565b60015f80516020615bec8339815191525580f35b600181036105e157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156105dd576040516340c10f1960e01b815233600482015260248101929092525f908290604490829084905af180156105d2576105c3575b5061053c565b6105cc90612c8a565b5f6105bd565b6040513d5f823e3d90fd5b5f80fd5b6040516366001a8960e01b815260ff9091166004820152602490fd5b634e487b7160e01b5f52602160045260245ffd5b60405163ceb40a8560e01b81523360048201526001600160a01b03919091166024820152604490fd5b0390fd5b604051635feafa3160e11b81526001600160401b0383166004820152602490fd5b8852602088208892505b84831061068357506103be93505081016020015f806103b0565b81935090816020925483858901015201910190918492610669565b915050602092506103be94915060ff191682840152151560051b8201015f806103b0565b6040516309e3d0f360e11b8152600490fd5b5080fd5b503461027457806003193601126102745760206106f3613251565b604051908152f35b5034610274576020366003190112610274576001600160a01b03600435818116908181036108035761073c9061072f6133f6565b6107376133f6565b6148f9565b7f3031d39df71efbb605646fc51d7571499445af538fa6dd17ce8c07e8118ed97891825460ff5f80516020615b6c833981519152541680820361081a575050908391825b845481101561081657845f5281817f357eda4c1707ce60b55a439f3dc12fcacea5ca0fd863e2fc179a916cf05fccd1015416803b1561081257848091602460405180948193632c7b84dd60e11b83528960048401525af19081156108075785916107ef575b5050600101610780565b6107f890612c8a565b61080357835f6107e5565b8380fd5b6040513d87823e3d90fd5b8480fd5b8380f35b604492506040519163d2a13a2960e01b835260048301526024820152fd5b5034610274578060031936011261027457602060ff5f80516020615a8c8339815191525416604051908152f35b50346102745760203660031901126102745760043560ff8116908181036105dd5761088e6133f6565b81156108fe577f2a855b929b9a53c6fb5b5ed248b27e502b709c088e036a5aa17620c8fc5085a9916108f860ff925f80516020615a8c833981519152805493851985161790556108dc613946565b6040805160ff9490951684168552921660208401528291820190565b0390a180f35b60405163831761d760e01b8152600490fd5b50346102745761091f36612d8b565b9060025f80516020615b0c83398151915254146106c25761093f92613202565b80f35b50346102745760203660031901126102745761ffff61095f612c22565b610967612f78565b50165f525f80516020615b8c8339815191526020526109c661098b60405f20612fdd565b6040519182918291909160406001600160401b038160608401956001600160481b038082511686526020820151166020860152015116910152565b0390f35b50346102745760203660031901126102745761ffff906109e8612c22565b9060206040516109f781612cd3565b8281520152165f525f80516020615a6c8339815191526020526040805f2060ff8251610a2281612cd3565b60208260018554958685520154169101908152835192835251166020820152f35b50346102745780600319360112610274576109c6604051610a6381612cd3565b60058152640312e312e360dc1b6020820152604051918291602083526020830190612c65565b503461027457806003193601126102745760405180915f80516020615b4c833981519152908154808452602080940190819383525f80516020615aac83398151915290835b818110610b2b5750505084610ae4910385612d09565b60405193838594850191818652518092526040850193925b828110610b0b57505050500390f35b83516001600160a01b031685528695509381019392810192600101610afc565b82546001600160a01b031684529286019260019283019201610ace565b5060c036600319011261027457610b5d612c33565b906084359182151583036106d45760a4356001600160401b03928382116102745750610b8d903690600401612d45565b610b95613a00565b60025f80516020615b0c83398151915254146106c257602093610bc2926064359060443590600435613fda565b60015f80516020615bec8339815191525560405191168152f35b5034610274578060031936011261027457602060025f80516020615b0c8339815191525414604051908152f35b5034610274578060031936011261027457604051805f80516020615b4c833981519152805480845260208094019185525f80516020615aac83398151915290855b818110610d8f5750505081610c60910382612d09565b8051610c6b8161304a565b91610c796040519384612d09565b818352610c858261304a565b601f1901855b818110610d73575050845b828110610cf7575050506040519180830190808452825180925280604085019301945b828110610cc65784840385f35b85518051151585528083015115158584015260409081015160ff169085015294810194606090930192600101610cb9565b9294926001906001600160a01b03610d0f82856131ee565b51165f525f80516020615bac833981519152865260405f2060405190610d3482612cb8565b5460ff9081811615158352818160081c1615158984015260101c166040820152610d5e82896131ee565b52610d6981886131ee565b5001949294610c96565b8590610d80979597612f78565b82828a01015201959395610c8b565b82546001600160a01b031684529285019260019283019201610c4a565b50346102745780600319360112610274575f80516020615c0c833981519152546040516001600160a01b039091168152602090f35b5034610274576020806003193601126106d4576004356001600160a01b03818116929183810361081257610e136133f6565b83156110cc57835f525f80516020615bac8339815191529081845260ff928360405f205416156110b357855f528285528360405f205460081c161561109a57855f5282855260405f209261ff0019938481541690555f80516020615b6c833981519152938454868160081c169182156110865761ff005f1980940160081b1691161785555f80516020615b2c8339815191528054926001600160401b03908a5f528952600193610ed88260018b60405f205460101c161b19831616928216831061342e565b6001600160401b03191617905588925f80516020615b4c8339815191528054928b5b848110610f8e575b5050505050509260409492610f4a8293610f3d7f697a3853515b88013ad432f29f53d406debc9509ed6d9313dcfe115250fcd18f999761342e565b610f45614a8a565b614fa0565b5460081c165f80516020615a8c8339815191529081548381168210610f80575b50505416908351928352820152a161093f613946565b60ff19161781555f80610f6a565b838c610f9983613224565b929054600393841b1c1614610fb057508501610efa565b9596509091938281019081116110725790610fde84610fd1610ffc94613224565b905490891b1c1691613224565b90919060018060a01b038084549260031b9316831b921b1916179055565b8254801561105e57946040999794610f4a948a9894610f3d947f697a3853515b88013ad432f29f53d406debc9509ed6d9313dcfe115250fcd18f9e9c99019261104484613224565b81939154921b1b1916905555949799849799839750610f02565b634e487b7160e01b8c52603160045260248cfd5b634e487b7160e01b8d52601160045260248dfd5b634e487b7160e01b8b52601160045260248bfd5b6040516307d86e9160e21b815260048101879052602490fd5b604051630d583f4760e41b815260048101879052602490fd5b604051632f44bd7760e01b8152600490fd5b5034610274576110ed36612d8b565b90335f525f80516020615bac83398151915260209080825260ff60405f205460081c16156112f3575f80516020615b0c8339815191529160028354146106c25761ffff8616805f525f80516020615a6c83398151915282528460405f2054036112d5575060405163b3f07bbd60e01b815291818380611170898b600484016147fa565b038173b55f857fc9a9757ffe70a3988f4a0b4f04f9d2a05af49283156112ca57889361129b575b50335f528082526111b260ff60405f205460101c1684613017565b61128257606061126193927f35a2101eaac94b493e0dfca061f9a7f087913fde8678e7cde0aca9897edba0e592335f528082528a6001600160401b03610100600160481b03604082600160ff835f205460101c161b16938981525f80516020615acc833981519152875220928354928360081c161760081b1690610100600160481b031916179055335f52815260ff60405f205460101c166040519185835233908301526040820152a1612e0c565b611269578480f35b546002146106c25761127a92613202565b5f8080808480f35b604051631089c4a160e11b815260048101849052602490fd5b9092508181813d83116112c3575b6112b38183612d09565b810103126105dd5751915f611197565b503d6112a9565b6040513d8a823e3d90fd5b6044908560405191635788c0fd60e11b835260048301526024820152fd5b60405163a0ae911d60e01b8152336004820152602490fd5b5034610274578060031936011261027457602060405161ffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b506020366003190112610274576001600160401b03600435166004350361027457611373613a00565b60025f80516020615b0c83398151915254146106c2576001600160401b03600435165f525f80516020615bcc83398151915260205260405f2090604051916113ba83612c9d565b805483526001810154602084015261ffff60028201546001600160481b03811660408601526001600160401b038160481c16606086015260881c16608084015260018060a01b0360038201541660a08401526040518281939060048401549361142285612e74565b80855294600181169081156115d3575060011461158e575b505061144892500382612d09565b60c08201526001600160401b036060820151161561156c576114776001600160401b0360608301511642612f6b565b6001600160401b037f00000000000000000000000000000000000000000000000000000000000000001611611536576115146020916001600160401b03600435165f525f80516020615bcc83398151915283526114d660405f2061318c565b6040810151608082015182518584015160a085015160c090950151946001600160a01b031693909261ffff16906001600160481b0316600435614273565b60015f80516020615bec833981519152556001600160401b0360405191168152f35b6001600160401b0360606044920151166040519063c06cf05f60e01b82526001600160401b036004351660048301526024820152fd5b6024604051635feafa3160e11b81526001600160401b03600435166004820152fd5b60049193949250018252602082205b8183106115b7575050906020611448928201015f8061143a565b602091935080600191548385880101520191019091839261159d565b9150506020925061144894915060ff191682840152151560051b8201015f8061143a565b5060603660031901126102745761160c612c33565b604435611617613a00565b60025f80516020615b0c83398151915254146106c25760209181611514926040519261164284612cd3565b60018452853681860137600435613d24565b50346102745760403660031901126102745761166e612c22565b6024356001600160401b0381116117cb5761168d903690600401612d45565b916040519182905f80516020615b4c8339815191528281549182875260208097019086525f80516020615aac83398151915292865b888282106117ac575050506116d992500383612d09565b826117038351966040519788928392635b10743960e11b8452604060048501526044840190612c65565b906024830152038173b55f857fc9a9757ffe70a3988f4a0b4f04f9d2a05af49081156117a15783949561173c949261177d575b50613bd6565b604051926040840160408552835180915285606086019401915b8181106117695750505082938301520390f35b825185529386019391860191600101611756565b61179a9192503d8087833e6117928183612d09565b8101906130a3565b905f611736565b6040513d85823e3d90fd5b85546001600160a01b03168452600195860195889550930192016116c2565b8280fd5b50346102745780600319360112610274576117e86139bc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080546001600160401b038082169060018201918183116118f85760ff8460401c169081156118eb575b506118d957600160401b911680926001600160481b03191617179081835560ff7f7487ca88d037ca20519908b1ee7556206bef53bce0226a348750cb9d4f688e4e5416156118c7577fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2926020926118a7613946565b6118af614a8a565b68ff000000000000000019169055604051908152a180f35b604051632866815360e11b8152600490fd5b60405163f92ee8a960e01b8152600490fd5b905081831611155f611832565b634e487b7160e01b5f52601160045260245ffd5b50346102745760403660031901126102745760243560ff811681036105dd57611939602091600435613017565b6040519015158152f35b50346102745780600319360112610274575f80516020615aec833981519152546040516001600160a01b039091168152602090f35b5034610274576020366003190112610274576119cb6001600160401b0360209260405f80516020615b2c833981519152549160043581525f80516020615acc8339815191528652205460081c1616613b86565b60ff60405191168152f35b50346102745780600319360112610274576119ef612f78565b506109c661098b612f96565b50346102745780600319360112610274575f80516020615aec83398151915254611a2d906001600160a01b03166133a4565b5f80516020615b0c83398151915260028154146106c257600290557f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd2602060405160018152a180f35b503461027457602036600319011261027457600435611a93613a00565b60025f80516020615b0c83398151915254146106c257611ab281613268565b602081016001600160401b03908181511615611b7857611ad58282511642612f6b565b827f00000000000000000000000000000000000000000000000000000000000000001611611b56578385527f4e8909a01183a67951f5a6147d6e76ed02ea890c72afea01a9edee91edc609b860205260408086208681556001018690558301518351869161053c916001600160481b0316906001600160a01b031687613a2f565b516040516301cb739d60e71b8152600481019490945216602483015250604490fd5b604051630301bcaf60e61b815260048101859052602490fd5b508060031936011261027457611ba56139bc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c1615906001600160401b03811680159081611dbb575b6001149081611db1575b159081611da8575b506118d95767ffffffffffffffff198116600117835581611d89575b50611c1b6152e7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381163303611d60575034611d4e57611c5a6152e7565b611c626152e7565b611c6a6152e7565b60015f80516020615b0c833981519152555f80516020615c0c83398151915280546001600160a01b03191633179055611ca16152e7565b611ca96152e7565b611cb2336148f9565b611cba6152e7565b611cc26152e7565b60015f80516020615bec83398151915255611cf8610100600160481b0360ff611cf1611cec612ee9565b614a52565b161761370e565b611d00613946565b611d08614a8a565b611d10575080f35b68ff00000000000000001981541690557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b60405163bd28e88960e01b8152600490fd5b604051636345072160e11b81526001600160a01b03919091166004820152336024820152604490fd5b68ffffffffffffffffff1916680100000000000000011782555f611c12565b9050155f611bf6565b303b159150611bee565b839150611be4565b503461027457608036600319011261027457611ddd612c22565b6024356044359060ff82168092036105dd57611df76133f6565b61ffff92838116938415611f22578215611f10578315611efe577f0000000000000000000000000000000000000000000000000000000000000000168414611eec577f1456404e7f41f35c3daac941bb50bad417a66275c3040061b4287d787719599d92608092855f5260ff5f80516020615a6c8339815191529384602052611ecf60405f209183600160405194611e8e86612cd3565b8054865201541696602084019788528a5f52602052600160405f2086815501868519825416179055611eca611ec1612ee9565b80606435613461565b6134ae565b51935116604051938452602084015260408301526060820152a280f35b60405163101b8f9560e11b8152600490fd5b60405163ade64f0b60e01b8152600490fd5b60405163f839a0cb60e01b8152600490fd5b60405163100b0f2760e11b8152600490fd5b503461027457806003193601126102745760206040516001600160401b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b5034610274578060031936011261027457602060ff7f5443fea4dc453d96b81ce55b62e11a4094cc4cbb8a360956a7253cfdb42506cb54166040519015158152f35b50346102745780600319360112610274577f00000000000000000000000000000000000000000000000000000000000000009060028210156120045760208260ff60405191168152f35b634e487b7160e01b81526021600452602490fd5b50346102745780600319360112610274576120316133f6565b5f80516020615b0c833981519152600281540361207957600190557fe11c2112add17fb763d3bd59f63b10429c3e11373da4fb8ef6725107a2fdc4b06020604051838152a180f35b604051637e38d1d360e11b8152600490fd5b503461027457806003193601126102745760206119cb612ee9565b50346102745760203660031901126102745760ff604060209260043581525f80516020615acc83398151915284522054166040519015158152f35b50346102745780600319360112610274576040517f0000000000000000000000000000000000000000000000000000000000000000600281101561212757602092508152f35b634e487b7160e01b83526021600452602483fd5b503461027457806003193601126102745760206001600160401b037fad78307a8b51804c575f26039dcb87c58925afb3b7c08732f3b21b942aed7a765416604051908152f35b5034610274576020806003193601126106d4576004356001600160a01b03811691828203610803576121b16133f6565b82156110cc57825f525f80516020615bac8339815191529182825260ff908160405f2054165f1461234b57845f5283835260405f2061010061ff00198254161790555b5f80516020615b4c83398151915290815491600160401b8310156123375782610fde91600161222595019055613224565b5f80516020615b6c83398151915292835461ff00612247848360081c16613935565b60081b169061ff001916178094555f80516020615b2c83398151915280546001600160401b039081811691885f5284875260018660405f205460101c161b16821791821461231e5767ffffffffffffffff19161790557ff05962b5774c658e85ed80c91a75af9d66d2af2253dda480f90bce78aff5eda5946060949093909290916122d0614a8a565b845f528252805f80516020615a8c83398151915280548281161561230f575b5054169260405194855260081c16908301526040820152a161093f613946565b60ff191660011781555f6122ef565b604051638d68f84d60e01b815260048101899052602490fd5b634e487b7160e01b5f52604160045260245ffd5b5f80516020615b6c83398151915282815416604081101561245d576040519061237382612cb8565b60018252858201906001825260408301908152885f5287875260405f2092511515918662ff000061ff0086549351151560081b16935160101b1693169062ffffff191617171790558054836123c9818316613935565b169060ff19161790557f3031d39df71efbb605646fc51d7571499445af538fa6dd17ce8c07e8118ed978805490600160401b8210156123375760018201808255821015612449575f527f357eda4c1707ce60b55a439f3dc12fcacea5ca0fd863e2fc179a916cf05fccd10180546001600160a01b031916861790556121f4565b634e487b7160e01b5f52603260045260245ffd5b60405163891684c360e01b8152600490fd5b5034610274576020366003190112610274576004356001600160401b0381168091036106d457606060c06040516124a581612c9d565b84815284602082015284604082015284838201528460808201528460a082015201525f525f80516020615bcc83398151915260205260405f20604051906124eb82612c9d565b805482526001810154602083015261ffff60028201546001600160481b03811660408501526001600160401b038160481c16606085015260881c16608083015260018060a01b0360038201541660a08301526040518381949060048401549361255385612e74565b808552946001811690811561263a57506001146125f5575b505061257992500383612d09565b60c081019182526109c66040519283926020845280516020850152602081015160408501526001600160481b0360408201511660608501526001600160401b03606082015116608085015261ffff60808201511660a085015260a0600180821b039101511660c08401525160e080840152610100830190612c65565b60049193949250018252602082205b81831061261e575050906020612579928201015f8061256b565b6020919350806001915483858901015201910190918492612604565b9150506020925061257994915060ff191682840152151560051b8201015f8061256b565b5034610274576020366003190112610274576126786133f6565b61093f61268f612686612ee9565b80600435613461565b61370e565b50346102745760403660031901126102745761093f6126b1612c33565b6126b96133f6565b611eca612686612ee9565b50346105dd576020806003193601126105dd576001600160a01b03600435818116908181036105dd576126f56133f6565b6126fd6139bc565b3b15612ad0577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a27f7487ca88d037ca20519908b1ee7556206bef53bce0226a348750cb9d4f688e4e9182549161278a60ff84161561342e565b60ff199283166001178455303b156105dd5760405163011fa75760e71b81525f8160048183305af180156105d257612abd575b5060405163689f90c360e01b81528281600481305afa908115612a85578691612a90575b5015612819575b50507f5443fea4dc453d96b81ce55b62e11a4094cc4cbb8a360956a7253cfdb42506cb818154169055815416905580f35b604051637e062a3560e11b81528281600481305afa908115612a85578691612a47575b508161286c927f00000000000000000000000000000000000000000000000000000000000000001691161461342e565b6040516314ad290960e11b81528181600481305afa908115610807578591612a11575b507f00000000000000000000000000000000000000000000000000000000000000009060028210156129fd5760028110156129fd576128ce911461342e565b604051634d4502c960e11b81528181600481305afa80156108075785906129c7575b612923915061ffff807f00000000000000000000000000000000000000000000000000000000000000001691161461342e565b604051631d2a9eff60e21b8152908082600481305afa908115610807578591612987575b5061298091506001600160401b03807f00000000000000000000000000000000000000000000000000000000000000001691161461342e565b5f806127e8565b905081813d83116129c0575b61299d8183612d09565b8101031261080357516001600160401b038116810361080357612980905f612947565b503d612993565b508181813d83116129f6575b6129dd8183612d09565b81010312610812576129f161292391615111565b6128f0565b503d6129d3565b634e487b7160e01b86526021600452602486fd5b90508181813d8311612a40575b612a288183612d09565b8101031261081257516002811015610812575f61288f565b503d612a1e565b90508281813d8311612a7e575b612a5e8183612d09565b81010312612a7a5751908082168203612a7a579061286c61283c565b8580fd5b503d612a54565b6040513d88823e3d90fd5b612ab09150833d8511612ab6575b612aa88183612d09565b810190613449565b5f6127e1565b503d612a9e565b612ac8919550612c8a565b5f935f6127bd565b60405162461bcd60e51b815260048101849052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b346105dd5760203660031901126105dd576020611939600435612e0c565b346105dd5760203660031901126105dd576004356001600160a01b03818116918290036105dd57612b89815f80516020615aec83398151915254166133a4565b5f80516020615c0c83398151915280546001600160a01b031981168417909155167f51c4874e0f23f262e04a38c51751336dde72126d67f53eb672aaff02996b3ef65f80a3005b346105dd5760203660031901126105dd5761ffff612bec612c22565b612bf4612f78565b50165f525f80516020615b8c83398151915260205260206106f3610468612c1d60405f20612fdd565b6132fa565b6004359061ffff821682036105dd57565b6024359061ffff821682036105dd57565b5f5b838110612c555750505f910152565b8181015183820152602001612c46565b90602091612c7e81518092818552858086019101612c44565b601f01601f1916010190565b6001600160401b03811161233757604052565b60e081019081106001600160401b0382111761233757604052565b606081019081106001600160401b0382111761233757604052565b604081019081106001600160401b0382111761233757604052565b60a081019081106001600160401b0382111761233757604052565b90601f801991011681019081106001600160401b0382111761233757604052565b6001600160401b03811161233757601f01601f191660200190565b81601f820112156105dd57803590612d5c82612d2a565b92612d6a6040519485612d09565b828452602083830101116105dd57815f926020809301838601378301015290565b90600319906060828401126105dd5760043561ffff811681036105dd579260243592604435916001600160401b03918284116105dd5760609084830301126105dd5760405192612dda84612cb8565b806004013584526024810135602085015260448101359283116105dd57612e049201600401612d45565b604082015290565b6001600160401b039060ff612e60815f80516020615a8c83398151915254169384935f80516020615b2c83398151915254905f525f80516020615acc83398151915260205260405f205460081c1616613b86565b1610159081612e6d575090565b9050151590565b90600182811c92168015612ea2575b6020831014612e8e57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691612e83565b3d15612ed6573d90612ebd82612d2a565b91612ecb6040519384612d09565b82523d5f602084013e565b606090565b519060ff821682036105dd57565b5f80604051602081019063313ce56760e01b825260048152612f0a81612cd3565b51907f00000000000000000000000000000000000000000000000000000000000000005afa612f37612eac565b9015612f59576020818051810103126105dd576020612f569101612edb565b90565b604051631222cd8360e01b8152600490fd5b919082039182116118f857565b60405190612f8582612cb8565b5f6040838281528260208201520152565b60405190612fa382612cb8565b8160406001600160401b035f80516020615c2c833981519152546001600160481b0380821685528160481c16602085015260901c16910152565b90604051612fea81612cb8565b60406001600160401b038294546001600160481b0380821685528160481c16602085015260901c16910152565b906001600160401b03915f525f80516020615acc833981519152602052600160ff60405f205460081c92161b1616151590565b6001600160401b0381116123375760051b60200190565b81601f820112156105dd57805161307781612d2a565b926130856040519485612d09565b818452602082840101116105dd57612f569160208085019101612c44565b9060209081838203126105dd5782516001600160401b03938482116105dd57019080601f830112156105dd5781516130da8161304a565b946040906130eb6040519788612d09565b828752858088019360051b860101948486116105dd57868101935b86851061311857505050505050505090565b84518381116105dd5782019084601f1983890301126105dd5784519061313d82612cd3565b6131488a8401612edb565b825285830151918583116105dd57613167898c80969581960101613061565b83820152815201940193613106565b818110613181575050565b5f8155600101613176565b6004905f81555f60018201555f60028201555f6003820155016131af8154612e74565b90816131b9575050565b81601f5f93116001146131cb5750555b565b9080839182526131ea601f60208420940160051c840160018501613176565b5555565b80518210156124495760209160051b010190565b91908161320f9184614815565b91909161321f576131c992615120565b505050565b5f80516020615b4c8339815191528054821015612449575f525f80516020615aac83398151915201905f90565b613259612f78565b50612f56610468612c1d612f96565b613270612f78565b505f527f4e8909a01183a67951f5a6147d6e76ed02ea890c72afea01a9edee91edc609b860205260405f20604051906132a882612cb8565b80546001600160481b038116835260481c6001600160401b03166020830152600101546001600160a01b0316604082015290565b81156132e6570490565b634e487b7160e01b5f52601260045260245ffd5b6001600160401b0390817f00000000000000000000000000000000000000000000000000000000000000001691821561338d5761337a828260ff936040610100600160481b039601511642038161335f602085019889519383875160081c16026132dc565b9160081c1601915160081c168082105f14613386575061496a565b9251169160081b161790565b905061496a565b506020015160ff16610100600160481b0317919050565b5f80516020615c0c83398151915254336001600160a01b0391821614159190826133e9575b50506133d157565b60405163e2a08e5d60e01b8152336004820152602490fd5b1633141590505f806133c9565b5f80516020615aec833981519152546001600160a01b0316330361341657565b60405163118cdaa760e01b8152336004820152602490fd5b1561343557565b634e487b7160e01b5f52600160045260245ffd5b908160209103126105dd575180151581036105dd5790565b61349961349460ff92610100600160481b03949561347e87614a52565b9085811686831610156134a457509586916149f7565b61496a565b92169160081b161790565b90509586916149f7565b9061ffff1690815f525f80516020615b8c83398151915260205260405f2080546134d6612ee9565b916008916001600160401b039181841c831691906001600160481b03828116841580613703575b156135b35750866040979460ff8a989561359286613599966135447f739ed886fd81a3ddc9f4b327ab69152e513cd45b26fda0c73660eaca8e1193019f6135a69d9a614a64565b815467ffffffffffffffff60901b19918e169190911679ffffffffffffffff000000000000000000ffffffffffffffffff199091161742891660901b67ffffffffffffffff60901b16179055565b16906149f7565b9460ff8116921c166149f7565b82519182526020820152a2565b6135bf612c1d84612fdd565b90896135cb818361579a565b156136b2576135d99161599d565b6135e7868a891c1686613b6d565b86610100600160481b03918260ff8816918b1b1617613606818561579a565b156136a75760ff918161361c613629938761599d565b8b1c1689858c1c16613b6d565b921691881b16175b61363b898261579a565b6136855796809460ff7f739ed886fd81a3ddc9f4b327ab69152e513cd45b26fda0c73660eaca8e1193019a9895613592866135999661368060409e6135a69d9a614a64565b613544565b604051631e74e8fb60e31b815290821660048201529088166024820152604490fd5b50505060ff16613631565b906136bc9161599d565b6136ca85878b8a1c16613b6d565b60ff8a1691878084610100600160481b0380958d1b16176136eb818561599d565b8b1c16918a1c16018781116118f857881b1617613631565b5060ff8416156134fd565b5f80516020615c2c8339815191528054613726612ee9565b916008916001600160401b039181841c831691906001600160481b0382811684158061392a575b156137f65750866040979460ff7f7e3b0fc388be9d36273f66210aed83be975df3a9adfffa4c734033f498f362cd9a989585613599956137e99a9754600160481b600160901b038d60481b1690600160481b600160901b0319161782555b815479ffffffffffffffff000000000000000000ffffffffffffffffff1916908c16174260901b67ffffffffffffffff60901b1617905516906149f7565b82519182526020820152a1565b613801612c1d612f96565b908961380d818361579a565b156138d95761381b9161599d565b613829868a891c1686613b6d565b86610100600160481b03918260ff8816918b1b1617613848818561579a565b156138ce5760ff918161361c61385e938761599d565b921691881b16175b613870898261579a565b6136855796809460ff7f7e3b0fc388be9d36273f66210aed83be975df3a9adfffa4c734033f498f362cd9a98956137e9989561359995600160481b600160901b0360409d60481b16600160481b600160901b031984161782556137ab565b50505060ff16613866565b906138e39161599d565b6138f185878b8a1c16613b6d565b60ff8a1691878084610100600160481b0380958d1b1617613912818561599d565b8b1c16918a1c16018781116118f857881b1617613866565b5060ff84161561374d565b60ff1660ff81146118f85760010190565b60ff5f80516020615a8c833981519152541660405161396481612cd3565b60ff5f80516020615b6c83398151915254818116835260081c1680602083015280831161399e57505160ff166139975750565b156108fe57565b82604491604051916313c3d1b160e01b835260048301526024820152fd5b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146139ee57565b604051633c64f99360e21b8152600490fd5b5f80516020615bec8339815191526002815414613a1d5760029055565b604051633ee5aeb560e01b8152600490fd5b91613a5d906104687f0000000000000000000000000000000000000000000000000000000000000000614b63565b917f504e6efe18ab9eed10dc6501a417f5b12a2f7f2b1593aed9b89f9bce3cf29a915f80a27f000000000000000000000000000000000000000000000000000000000000000060028110156105fd5780613aeb575060405163a9059cbb60e01b60208201526001600160a01b03909116602482015260448101919091526131c99061050d81606481016104ff565b600181036105e157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b156105dd576040516340c10f1960e01b81526001600160a01b039290921660048301526024820152905f908290604490829084905af180156105d257613b645750565b6131c990612c8a565b6001600160401b0391821690821603919082116118f857565b905f915b6001600160401b03808216801561321f575f19019081116118f857613bb0911692613935565b91613b8a565b9060406020612f569360ff81511684520151918160208201520190612c65565b909291805191613be58361304a565b92604091613bf66040519586612d09565b818552613c028261304a565b602090601f190136878301375f975f955b848710613c2557505050505050509190565b909192939495988685613c9b868d613c4460018060a01b0391886131ee565b5116805f525f80516020615bac8339815191528252613c6c60ff865f205460101c16896131ee565b51908551808095819463b5634c7360e01b835261ffff60049916898401526024998a8401526044830190613bb6565b03915afa908115613d1a578d905f92613ce8575b50613cbb82918d6131ee565b528301809311613cd75750506001909901959493929190613c13565b601190634e487b7160e01b5f52525ffd5b809250888092503d8311613d13575b613d018183612d09565b810103126105dd57518c613cbb613caf565b503d613cf7565b8a513d5f823e3d90fd5b91939290935f948315613fc8578115613fb6578215613fa4577f000000000000000000000000000000000000000000000000000000000000000095613d693088614b8b565b60018060a01b03881690604098613dae8a516323b872dd60e01b6020820152602499338b830152306044830152606482015260648152613da881612cee565b84615328565b613dc182613dbc3084614b8b565b612f6b565b927f00000000000000000000000000000000000000000000000000000000000000006002811015613f9157600114613f0f575b50505061ffff83165f525f80516020615a6c83398151915260205260ff6001895f200154168015613efe57613e32613e2a612ee9565b918284613461565b98613e4e6001600160401b039260ff8c16848d60081c166149f7565b808403613ed85750507fad78307a8b51804c575f26039dcb87c58925afb3b7c08732f3b21b942aed7a769081549080821698818a14613ec65750938787878b968e968e96613eae9a60018b0116906001600160401b031916179055614be7565b613ebd57612f56953394614273565b50505091505090565b634e487b7160e01b8652601160045285fd5b60449189613ee7869384612f6b565b9151926338f831a560e11b84526004840152820152fd5b885163ade64f0b60e01b8152600490fd5b803b156105dd575f80918a8d5180948193630852cd8d60e31b83528960048401525af18015613f8757613f72575b50613f49903090614b8b565b808203613f565780613df4565b60449250878a51926302156a8f60e01b84526004840152820152fd5b613f7d919450612c8a565b5f92613f49613f3d565b8b513d5f823e3d90fd5b89634e487b7160e01b5f5260216004525ffd5b60405163717f139360e11b8152600490fd5b604051634e46966960e11b8152600490fd5b604051631f2a200560e01b8152600490fd5b94939291905f938615613fc8578215613fb6578315613fa4577f00000000000000000000000000000000000000000000000000000000000000009661401f3089614b8b565b9060018060a01b038916916040996140658b516323b872dd60e01b6020820152602494338683015230604483015260648201526064815261405f81612cee565b85615328565b61407382613dbc3084614b8b565b937f0000000000000000000000000000000000000000000000000000000000000000600281101561421457600114614194575b50505061ffff84165f525f80516020615a6c83398151915260205260ff60018a5f20015416908115614183576140e56140dd612ee9565b928385613461565b996141026001600160401b03938c8560ff82169160081c166149f7565b8085036141745750507fad78307a8b51804c575f26039dcb87c58925afb3b7c08732f3b21b942aed7a769182549181831699828b14614163575050938787878b968e968e96613eae9a60018b0116906001600160401b031916179055614be7565b634e487b7160e01b81526011600452fd5b90604492613ee7869384612f6b565b895163ade64f0b60e01b8152600490fd5b803b156105dd575f8091858e5180948193630852cd8d60e31b83528a60048401525af1801561420a576141f5575b506141ce903090614b8b565b8082036141db57806140a6565b6044928b51926302156a8f60e01b84526004840152820152fd5b614200919950612c8a565b5f976141ce6141c2565b8c513d5f823e3d90fd5b84634e487b7160e01b5f5260216004525ffd5b906020828203126105dd5781516001600160401b0381116105dd57612f569201613061565b9060606040612f569380518452602081015160208501520151918160408201520190612c65565b95919061429f7f0000000000000000000000000000000000000000000000000000000000000000614b63565b6040519283845f80516020615b4c833981519152602081549384815201905f525f80516020615aac833981519152925f5b8181106147d85750506142e592500385612d09565b7f3031d39df71efbb605646fc51d7571499445af538fa6dd17ce8c07e8118ed97854908451156147c6576143375f916040519384928392635b10743960e11b8452604060048501526044840190612c65565b906024830152038173b55f857fc9a9757ffe70a3988f4a0b4f04f9d2a05af49081156105d2575f916147ac575b50614370848285613bd6565b949085341061478d576143838634612f6b565b8061477e575b506060608060405161439a81612cee565b5f81525f60208201525f60408201525f838201520152604051986143bd8a612cee565b6001600160481b0385168a5260018060a01b037f00000000000000000000000000000000000000000000000000000000000000001660208b01528760408b015261ffff861660608b0152604051998a60208101106001600160401b0360208d0111176123375760805f918c60206144979e01604052838152828201526040519c8d9283926315cfa3cb60e11b8452602060048501526001600160481b038151166024850152602081015160448501526040810151606485015261ffff6060820151166084850152015160a060a484015260c4830190612c65565b038173b55f857fc9a9757ffe70a3988f4a0b4f04f9d2a05af4998a156105d2576145139a5f928d928492614762575b506001600160401b03604051936144dc85612cb8565b16835260018060a01b031660208301526040820152604051809b81926311692f3760e31b835260206004840152602483019061424c565b038173b55f857fc9a9757ffe70a3988f4a0b4f04f9d2a05af49889156105d2575f9961473e575b5061ffff85165f525f80516020615a6c83398151915260205260405f2054928251928415614722575f5b84811061464f575050505050509161ffff6080926145a57fe54e51e42099622516fa3b48e9733581c9dbdcb771cafb093f745a0532a3598295610470612ee9565b9260405193845260208401521660408201526001600160401b0387166060820152a3604051614625602282602081019461ffff60f01b7f000000000000000000000000000000000000000000000000000000000000000060f01b1686526146158151809260208686019101612c44565b8101036002810184520182612d09565b5190207f3e6ae56314c6da8b461d872f41c6d0bb69317b9d0232805aaccfa45df1a16fa05f80a290565b6001600160a01b0361466182846131ee565b51169061466e81866131ee565b51825f525f80516020615bac83398151915260205261469760ff60405f205460101c16866131ee565b51833b156105dd576146dc938f8f938d8c5f966146ee61ffff956040519b8c998a988997634b5b050560e01b895216600488015260a0602488015260a4870190613bb6565b85810360031901604487015290612c65565b916064840152608483015203925af19182156105d257600192614713575b5001614564565b61471c90612c8a565b5f61470c565b604051630ebc95af60e21b815261ffff88166004820152602490fd5b61475b9199503d805f833e6147538183612d09565b810190614227565b975f61453a565b6147779192503d8086833e6147538183612d09565b905f6144c6565b61478790615401565b5f614389565b6040516306a91e3760e51b815260048101879052346024820152604490fd5b6147c091503d805f833e6117928183612d09565b5f614364565b6040516334e7b19560e11b8152600490fd5b84546001600160a01b03168352600194850194899450602090930192016142d0565b60409061ffff612f569493168152816020820152019061424c565b60405163b3f07bbd60e01b81529193926020918391829161483a9190600484016147fa565b038173b55f857fc9a9757ffe70a3988f4a0b4f04f9d2a05af49081156105d2575f916148c7575b5061486b81612e0c565b156148af57614879816150dc565b9283614886575091505f90565b7f4069dff8c9df7e38d2867c0910bd96fd61787695e5380281148c04932d02bef25f80a35f9190565b60249060405190630451c4fb60e41b82526004820152fd5b90506020813d6020116148f1575b816148e260209383612d09565b810103126105dd57515f614861565b3d91506148d5565b6001600160a01b03908116908115614952575f80516020615aec83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b604051631e4fbdf760e01b81525f6004820152602490fd5b6001600160401b039081811161497e571690565b60405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b6064820152608490fd5b9060ff8091169116039060ff82116118f857565b60ff16604d81116118f857600a0a90565b919060ff821660ff8216818114614a4b571115614a2a57614a1f612f569392614a24926149d2565b6149e6565b906132dc565b614a1f90614a37926149d2565b908181029181830414901517156118f85790565b5050505090565b60ff811660081015612f565750600890565b90600160481b600160901b0382549160481b1690600160481b600160901b031916179055565b5f80516020615b6c8339815191525460ff8160081c16614ab95f80516020615b4c83398151915254821461342e565b5f5b818110614b3b57505f5b818110614ade575050604060ff6131c99216111561342e565b60018082018083116118f8575b838110614afc575050600101614ac5565b8190614b35614b0a85613224565b90546003916001600160a01b03919082614b2387613224565b905490861b1c16931b1c16141561342e565b01614aeb565b80614b5d614b4a600193613224565b848060a01b0391549060031b1c16614fa0565b01614abb565b468103614b6d5750565b604490604051906377d879fb60e01b82526004820152466024820152fd5b6040516370a0823160e01b602082019081526001600160a01b0390931660248083019190915281525f92839291614bc181612cb8565b51915afa614bcd612eac565b9015612f59576020818051810103126105dd576020015190565b9293949095979691614bfa611cec612ee9565b9889610100600160481b0360ff614c256134946001600160401b039e8f848816908860081c166149f7565b60081b91909116911617967f00000000000000000000000000000000000000000000000000000000000000008b1615614f9a57614c60612f78565b50614c6c612c1d612f96565b614c76898261599d565b8b808a60081c169160081c16105b811580614f93575b614f6d5781614f65575b50614cb957505050505050614cb5929350614cb081615432565b6154f1565b5f90565b60049293949650614cec9795977f0000000000000000000000000000000000000000000000000000000000000000614b63565b614cf4613251565b956040958b87519116978882526020998a830152878201527ff33512b84e24a49905c26c6991942fc5a9652411769fc1e448f967cdb049f08a60603392a2855192614d3e84612c9d565b8352878301988952858301906001600160481b038093168252614de28c60608601814216815261ffff608088019416845260a087019533875260c08801998a528b5f525f80516020615bcc8339815191528d528a5f20975188556001809e5190890155600288019551166001600160481b03198654161785555116839067ffffffffffffffff60481b82549160481b169067ffffffffffffffff60481b1916179055565b51815461ffff60881b191660889190911b61ffff60881b16179055516003820180546001600160a01b0319166001600160a01b0392909216919091179055915180519098919092019190811161233757614e3c8254612e74565b601f8111614f2c575b5084601f8211600114614eab5781907f69add1952a6a6b9cb86f04d05f0cb605cbb469a50ae916139d34495a9991481f9798995f92614ea0575b50505f19600383901b1c191690871b1790555b51908152a1612f5634615401565b015190505f80614e7f565b601f19821698835f52865f20995f5b818110614f1757509188999a91847f69add1952a6a6b9cb86f04d05f0cb605cbb469a50ae916139d34495a9991481f9a959410614eff575b505050811b019055614e92565b01515f1960f88460031b161c191690555f8080614ef2565b828401518c559a89019a928801928801614eba565b614f5590835f52865f20601f840160051c810191888510614f5b575b601f0160051c0190613176565b5f614e45565b9091508190614f48565b90505f614c96565b604487614f78613251565b90604051916326fb55dd60e01b835260048301526024820152fd5b5080614c8c565b5f614c84565b9060018060a01b0380921691825f525f80516020615bac83398151915260205260405f2060405190614fd182612cb8565b5460ff9161500d838316158015938484526020840193604087808460081c1615938415885260101c16910195818752926150c2575b505061342e565b5f80516020615b2c83398151915254956001600160401b036001976001868651161b1616151591511515915f915f905f80516020615b6c8339815191525497878960081c16925b83811061508a575b505050506131c99697509161508091615078828796951461342e565b15151461342e565b511691161161342e565b828261509583613224565b90549060031b1c16146150a9578b01615054565b5098998a9950935082915061507890508461508061505c565b909150816150d3575b505f80615006565b9050155f6150cb565b5f525f80516020615acc83398151915260205260405f20805460ff811661510a5760ff191660011790555f90565b5050600190565b519061ffff821682036105dd57565b61514c915f604080920151825180958192635399ded560e11b8352602060048401526024830190612c65565b038173b55f857fc9a9757ffe70a3988f4a0b4f04f9d2a05af49283156152dd575f9361523c575b5061ffff80606085015116907f000000000000000000000000000000000000000000000000000000000000000016808203615221575050806151d86151b6612ee9565b806151d38188516001600160401b0360ff82169160081c166149f7565b613461565b930151908160a01c61520a57506001600160a01b0316906151fd908290849086615617565b61321f576131c992613a2f565b60249250519063033b960d60e41b82526004820152fd5b6044925191631ee5902560e11b835260048301526024820152fd5b9092503d805f833e61524e8183612d09565b81016020828203126105dd5781516001600160401b03928382116105dd57019060a0828203126105dd5784519261528484612cee565b82516001600160481b03811681036105dd5784526020830151602085015285830151868501526152b660608401615111565b606085015260808301519081116105dd576152d19201613061565b6080820152915f615173565b50513d5f823e3d90fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561531657565b604051631afcd79f60e31b8152600490fd5b604051615385916001600160a01b031661534182612cd3565b5f806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af161537f612eac565b916159d2565b8051908161539257505050565b82806153a2938301019101613449565b156153aa5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b5f80808084335af1615411612eac565b501561541a5750565b60249060405190630b288dc560e21b82526004820152fd5b6001600160401b0390817f000000000000000000000000000000000000000000000000000000000000000016156154ed5761546b612f78565b50600160481b600160901b03615482612c1d612f96565b610100600160481b0360ff6154bc5f80516020615c2c83398151915296808854976154ad818861599d565b60081c16908560081c16613b6d565b92169160081b161760481b16906001600160401b0360901b4260901b1690600160481b600160d01b03191617179055565b5050565b6001600160401b03807f0000000000000000000000000000000000000000000000000000000000000000161561321f5761ffff6131c993615530612f78565b5016805f525f80516020615b8c83398151915280602052615556612c1d60405f20612fdd565b5f9283526020919091526040909120805467ffffffffffffffff60901b191642841660901b67ffffffffffffffff60901b16178155928290615598818461599d565b60081c16828260081c16018281115f146156035750610100600160481b0360ff6155c18461496a565b92169160081b161790825490806001600160481b038316926155e3848661599d565b60081c16908360081c16105f146155fb575090614a64565b905090614a64565b60ff6155c1610100600160481b039261496a565b90926001600160401b037f000000000000000000000000000000000000000000000000000000000000000081161561579457615651612f78565b5061ffff85165f525f80516020615b8c833981519152602052615679612c1d60405f20612fdd565b615683858261599d565b81808660081c169160081c16105b6156aa575050506156a5614cb592826157bc565b615880565b7f7f63c9251d82a933210c2b6d0b0f116252c3c116788120e64e8e8215df6f316294509060016020949261576e604051916156e483612cb8565b6001600160481b03958616835242811688840190815260a085901b85900395861660408086019182525f8a81527f4e8909a01183a67951f5a6147d6e76ed02ea890c72afea01a9edee91edc609b88c522094518554925170ffffffffffffffffffffffffffffffffff19909316981697909717911660481b67ffffffffffffffff60481b16178255565b019151166bffffffffffffffffffffffff60a01b825416179055604051908152a1600190565b5f615691565b906157a5818361599d565b6001600160401b03809160081c169160081c161190565b6001600160401b03807f0000000000000000000000000000000000000000000000000000000000000000161561321f57610100600160481b0360ff61587261ffff6131c996615809612f78565b501693845f525f80516020615b8c83398151915280602052615830612c1d60405f20612fdd565b5f9687526020919091526040909520805467ffffffffffffffff60901b191642831660901b67ffffffffffffffff60901b161781559581906154ad818861599d565b92169160081b161790614a64565b6001600160401b0390817f000000000000000000000000000000000000000000000000000000000000000016156154ed576158b9612f78565b506158c5612c1d612f96565b90600160481b600160901b035f80516020615c2c83398151915293845493816001600160401b0360901b4260901b16946158ff818461599d565b60081c16828260081c16018281115f146159895750610100600160481b0360ff6159288461496a565b92169160081b1617906001600160481b03851690615946828461599d565b80856001600160401b0360901b1988161760081c16908360081c16105f1461598257505b60481b1691600160481b600160d01b03191617179055565b905061596a565b60ff615928610100600160481b039261496a565b60ff91821691168181036159af575050565b604051635ce6db6160e11b815260ff918216600482015291166024820152604490fd5b91929015615a3457508151156159e6575090565b3b156159ef5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015615a475750805190602001fd5b60405162461bcd60e51b81526020600482015290819061063a906024830190612c6556feebcc9f646b0f459ff8f387587d536b0af3484cf442e1577400f322334e7d1ef047028352a8b3feae1a85fba43bc13f990568bb1637dce33d3dbfd791a0808b7f6c3cb3f3ae91330f31ba2bc0ff8855fc834fb66dc27e8e0b1a398617dabaa5a668dfeeddfa5e4e9adceec01a3aba274bdcbab3f6ac9956417a4332f2b08abdda9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930064bacf405c5d7f563d3ba5252584a52c37e4fee380fd825b10666c27b8258022fd6568c039679b3b7cc93c26c41d9379b7b1bec1677120493b467688302cb11f00758a264b9bdbe3295fe36bd6ff7abaa122f48bf70e90af04a1b8a32d21e4e18561949d1c6242cee5c5a5aeb6b9c190ee611d7742fcec65d9e5b1341ea04d89efb21dcaedea63b55c44882f329622e13a8d0f5b947b3a372826208a9003da1549bca747e973430e858f2f5de357b8dba36ea6d375b81bdb5d53dfaabf0b3a7f852fa0677fef8612c6c15b518c9fa56761e9ed15cfd5c6e5399e5467985ac7ed9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00bfa91572ce1e5fe8776a160d3b1f862e83f5ee2c080a7423b4761602a3ad12497c25289a27ec8c9be54d4a154cf80490d69bda989cdb8328232e08fea9220420a264697066735822122085ac4db53de6930db3b039184653fb7a750b8e542da7aa92d1612cd0e41b416f64736f6c63430008160033000000000000000000000000c96d6ba0756f9e376c8a1ad61a62424a05debaca0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000000