UNPKG

@layerzerolabs/oapp-evm

Version:

LayerZero Labs reference EVM OmniChain Application (OApp) implementation

1 lines 267 kB
{"abi":[{"type":"constructor","inputs":[{"name":"_verifyHelper","type":"address","internalType":"address payable"},{"name":"_endpoint","type":"address","internalType":"address"},{"name":"_treasuryGasLimit","type":"uint256","internalType":"uint256"},{"name":"_treasuryGasForFeeCap","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"cmdHashLookup","inputs":[{"name":"oapp","type":"address","internalType":"address"},{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"nonce","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"cmdHash","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"commitVerification","inputs":[{"name":"_packetHeader","type":"bytes","internalType":"bytes"},{"name":"_cmdHash","type":"bytes32","internalType":"bytes32"},{"name":"_payloadHash","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"fees","inputs":[{"name":"worker","type":"address","internalType":"address"}],"outputs":[{"name":"fee","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getAppReadLibConfig","inputs":[{"name":"_oapp","type":"address","internalType":"address"},{"name":"_remoteEid","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"tuple","internalType":"struct ReadLibConfig","components":[{"name":"executor","type":"address","internalType":"address"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}],"stateMutability":"view"},{"type":"function","name":"getConfig","inputs":[{"name":"_eid","type":"uint32","internalType":"uint32"},{"name":"_oapp","type":"address","internalType":"address"},{"name":"_configType","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getReadLibConfig","inputs":[{"name":"_oapp","type":"address","internalType":"address"},{"name":"_remoteEid","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"rtnConfig","type":"tuple","internalType":"struct ReadLibConfig","components":[{"name":"executor","type":"address","internalType":"address"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}],"stateMutability":"view"},{"type":"function","name":"getTreasuryAndNativeFeeCap","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"hashLookup","inputs":[{"name":"headerHash","type":"bytes32","internalType":"bytes32"},{"name":"cmdHash","type":"bytes32","internalType":"bytes32"},{"name":"dvn","type":"address","internalType":"address"}],"outputs":[{"name":"payloadHash","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"isSupportedEid","inputs":[{"name":"_eid","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"messageLibType","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"enum MessageLibType"}],"stateMutability":"pure"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"quote","inputs":[{"name":"_packet","type":"tuple","internalType":"struct Packet","components":[{"name":"nonce","type":"uint64","internalType":"uint64"},{"name":"srcEid","type":"uint32","internalType":"uint32"},{"name":"sender","type":"address","internalType":"address"},{"name":"dstEid","type":"uint32","internalType":"uint32"},{"name":"receiver","type":"bytes32","internalType":"bytes32"},{"name":"guid","type":"bytes32","internalType":"bytes32"},{"name":"message","type":"bytes","internalType":"bytes"}]},{"name":"_options","type":"bytes","internalType":"bytes"},{"name":"_payInLzToken","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"tuple","internalType":"struct MessagingFee","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"send","inputs":[{"name":"_packet","type":"tuple","internalType":"struct Packet","components":[{"name":"nonce","type":"uint64","internalType":"uint64"},{"name":"srcEid","type":"uint32","internalType":"uint32"},{"name":"sender","type":"address","internalType":"address"},{"name":"dstEid","type":"uint32","internalType":"uint32"},{"name":"receiver","type":"bytes32","internalType":"bytes32"},{"name":"guid","type":"bytes32","internalType":"bytes32"},{"name":"message","type":"bytes","internalType":"bytes"}]},{"name":"_options","type":"bytes","internalType":"bytes"},{"name":"_payInLzToken","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"tuple","internalType":"struct MessagingFee","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}]},{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"type":"function","name":"setConfig","inputs":[{"name":"_oapp","type":"address","internalType":"address"},{"name":"_params","type":"tuple[]","internalType":"struct SetConfigParam[]","components":[{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"configType","type":"uint32","internalType":"uint32"},{"name":"config","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setDefaultReadLibConfigs","inputs":[{"name":"_params","type":"tuple[]","internalType":"struct SetDefaultReadLibConfigParam[]","components":[{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"config","type":"tuple","internalType":"struct ReadLibConfig","components":[{"name":"executor","type":"address","internalType":"address"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTreasury","inputs":[{"name":"_treasury","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTreasuryNativeFeeCap","inputs":[{"name":"_newTreasuryNativeFeeCap","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"_interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"testHelper","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract TestHelperOz5"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"verifiable","inputs":[{"name":"_config","type":"tuple","internalType":"struct ReadLibConfig","components":[{"name":"executor","type":"address","internalType":"address"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]},{"name":"_headerHash","type":"bytes32","internalType":"bytes32"},{"name":"_cmdHash","type":"bytes32","internalType":"bytes32"},{"name":"_payloadHash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"verify","inputs":[{"name":"_packetHeader","type":"bytes","internalType":"bytes"},{"name":"_cmdHash","type":"bytes32","internalType":"bytes32"},{"name":"_payloadHash","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"major","type":"uint64","internalType":"uint64"},{"name":"minor","type":"uint8","internalType":"uint8"},{"name":"endpointVersion","type":"uint8","internalType":"uint8"}],"stateMutability":"pure"},{"type":"function","name":"withdrawFee","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawLzTokenFee","inputs":[{"name":"_lzToken","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DVNFeePaid","inputs":[{"name":"requiredDVNs","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"fees","type":"uint256[]","indexed":false,"internalType":"uint256[]"}],"anonymous":false},{"type":"event","name":"DefaultReadLibConfigsSet","inputs":[{"name":"params","type":"tuple[]","indexed":false,"internalType":"struct SetDefaultReadLibConfigParam[]","components":[{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"config","type":"tuple","internalType":"struct ReadLibConfig","components":[{"name":"executor","type":"address","internalType":"address"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}]}],"anonymous":false},{"type":"event","name":"ExecutorFeePaid","inputs":[{"name":"executor","type":"address","indexed":false,"internalType":"address"},{"name":"fee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"LzTokenFeeWithdrawn","inputs":[{"name":"lzToken","type":"address","indexed":false,"internalType":"address"},{"name":"receiver","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"NativeFeeWithdrawn","inputs":[{"name":"worker","type":"address","indexed":false,"internalType":"address"},{"name":"receiver","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PayloadVerified","inputs":[{"name":"dvn","type":"address","indexed":false,"internalType":"address"},{"name":"header","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"cmdHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"payloadHash","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"ReadLibConfigSet","inputs":[{"name":"oapp","type":"address","indexed":false,"internalType":"address"},{"name":"eid","type":"uint32","indexed":false,"internalType":"uint32"},{"name":"config","type":"tuple","indexed":false,"internalType":"struct ReadLibConfig","components":[{"name":"executor","type":"address","internalType":"address"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}],"anonymous":false},{"type":"event","name":"TreasuryNativeFeeCapSet","inputs":[{"name":"newTreasuryNativeFeeCap","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TreasurySet","inputs":[{"name":"treasury","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"AddressInsufficientBalance","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"DVN_InvalidDVNIdx","inputs":[]},{"type":"error","name":"DVN_InvalidDVNOptions","inputs":[{"name":"cursor","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"LZ_MessageLib_OnlyEndpoint","inputs":[]},{"type":"error","name":"LZ_RL_AtLeastOneDVN","inputs":[]},{"type":"error","name":"LZ_RL_CannotWithdrawAltToken","inputs":[]},{"type":"error","name":"LZ_RL_InvalidAmount","inputs":[{"name":"requested","type":"uint256","internalType":"uint256"},{"name":"available","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"LZ_RL_InvalidCmdHash","inputs":[]},{"type":"error","name":"LZ_RL_InvalidConfigType","inputs":[{"name":"configType","type":"uint32","internalType":"uint32"}]},{"type":"error","name":"LZ_RL_InvalidEid","inputs":[]},{"type":"error","name":"LZ_RL_InvalidExecutor","inputs":[]},{"type":"error","name":"LZ_RL_InvalidOptionalDVNCount","inputs":[]},{"type":"error","name":"LZ_RL_InvalidOptionalDVNThreshold","inputs":[]},{"type":"error","name":"LZ_RL_InvalidPacketHeader","inputs":[]},{"type":"error","name":"LZ_RL_InvalidPacketVersion","inputs":[]},{"type":"error","name":"LZ_RL_InvalidReceiver","inputs":[]},{"type":"error","name":"LZ_RL_InvalidRequiredDVNCount","inputs":[]},{"type":"error","name":"LZ_RL_NotTreasury","inputs":[]},{"type":"error","name":"LZ_RL_Unsorted","inputs":[]},{"type":"error","name":"LZ_RL_UnsupportedEid","inputs":[{"name":"eid","type":"uint32","internalType":"uint32"}]},{"type":"error","name":"LZ_RL_Verifying","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidLegacyType1Option","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidLegacyType2Option","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidWorkerId","inputs":[{"name":"workerId","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"LZ_ULN_InvalidWorkerOptions","inputs":[{"name":"cursor","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"LZ_ULN_UnsupportedOptionType","inputs":[{"name":"optionType","type":"uint16","internalType":"uint16"}]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"SafeERC20FailedOperation","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"type":"error","name":"Transfer_NativeFailed","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Transfer_ToAddressIsZero","inputs":[]}],"bytecode":{"object":"0x60e060405234801562000010575f80fd5b5060405162004b8e38038062004b8e833981016040819052620000339162000170565b82836001600160a01b031663416ecebf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000071573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620000979190620001ba565b3380620000bd57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000c88162000109565b506001600160a01b0391821660805263ffffffff1660a05260c092909252600655600280546001600160a01b031916939091169290921790915550620001e6565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200016d575f80fd5b50565b5f805f806080858703121562000184575f80fd5b8451620001918162000158565b6020860151909450620001a48162000158565b6040860151606090960151949790965092505050565b5f60208284031215620001cb575f80fd5b815163ffffffff81168114620001df575f80fd5b9392505050565b60805160a05160c05161495a620002345f395f8181611ad8015261258901525f610baa01525f818161062c0152818161072f0152818161086b01528181610d2c01526116f9015261495a5ff3fe60806040526004361061017e575f3560e01c80637620fd01116100cd578063d15b0d4911610087578063f0f4426011610062578063f0f44260146104fc578063f2fde38b1461051b578063faaebd211461053a578063fd9be52214610565575f80fd5b8063d15b0d4914610492578063d80e9bd9146104b1578063ea69d69d146104dd575f80fd5b80637620fd011461039e5780638da5cb5b146103e05780638eb0bf30146103fc5780639c33abf714610428578063ab750e7514610454578063c85f4b4e14610473575f80fd5b806320efd7221161013857806354fd4d501161011357806354fd4d5014610321578063594924da1461034c5780636750cd4c1461036b578063715018a61461038a575f80fd5b806320efd722146102995780633c782a52146102b85780634389e58f146102f4575f80fd5b806301ffc9a714610189578063052368ca146101bd5780630e97289b146101dc5780631881d94d146102135780631fb512251461022e578063200175f714610278575f80fd5b3661018557005b5f80fd5b348015610194575f80fd5b506101a86101a336600461389b565b610584565b60405190151581526020015b60405180910390f35b3480156101c8575f80fd5b506101a86101d73660046138c2565b6105d5565b3480156101e7575f80fd5b506002546101fb906001600160a01b031681565b6040516001600160a01b0390911681526020016101b4565b34801561021e575f80fd5b5060026040516101b49190613915565b348015610239575f80fd5b5061026a610248366004613988565b600360209081525f938452604080852082529284528284209052825290205481565b6040519081526020016101b4565b348015610283575f80fd5b506102976102923660046139ca565b6105f5565b005b3480156102a4575f80fd5b506102976102b3366004613a4f565b61072d565b3480156102c3575f80fd5b5061026a6102d2366004613a9f565b600460209081525f938452604080852082529284528284209052825290205481565b3480156102ff575f80fd5b5061031361030e366004613b1f565b610854565b6040516101b4929190613be9565b34801561032c575f80fd5b5060408051600a81525f60208201526002918101919091526060016101b4565b348015610357575f80fd5b50610297610366366004613c0c565b610b5a565b348015610376575f80fd5b506101a8610385366004613c58565b610d90565b348015610395575f80fd5b50610297610d9a565b3480156103a9575f80fd5b506103c16007546006546001600160a01b0390911691565b604080516001600160a01b0390931683526020830191909152016101b4565b3480156103eb575f80fd5b505f546001600160a01b03166101fb565b348015610407575f80fd5b5061041b610416366004613c71565b610dad565b6040516101b49190613d56565b348015610433575f80fd5b50610447610442366004613d68565b61109c565b6040516101b49190613da1565b34801561045f575f80fd5b5061029761046e366004613c0c565b611104565b34801561047e575f80fd5b5061029761048d366004613db3565b61118d565b34801561049d575f80fd5b506102976104ac366004613df1565b61131c565b3480156104bc575f80fd5b506104d06104cb366004613b1f565b611391565b6040516101b49190613e08565b3480156104e8575f80fd5b5061041b6104f7366004613c71565b6114d4565b348015610507575f80fd5b50610297610516366004613e1f565b611606565b348015610526575f80fd5b50610297610535366004613e1f565b61165c565b348015610545575f80fd5b5061026a610554366004613e1f565b60056020525f908152604090205481565b348015610570575f80fd5b5061029761057f366004613e3a565b611699565b5f6001600160e01b031982166325fc096160e21b14806105b457506001600160e01b0319821663b6e9ace360e01b145b806105cf57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6105ea6105e286614035565b8585856117bd565b90505b949350505050565b6007546001600160a01b0316331461062057604051634b41868f60e11b815260040160405180910390fd5b826001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e1758bd86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610686573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106aa9190614040565b6001600160a01b0316036106d157604051632ddfd41160e21b815260040160405180910390fd5b6106dc838383611910565b604080516001600160a01b038086168252841660208201529081018290527fe081464b7278501267de69fa85b7b9560b0ae05d5fbfaab9b1986c70356e2efe906060015b60405180910390a1505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146107765760405163467409c360e01b815260040160405180910390fd5b5f5b8181101561084e57368383838181106107935761079361405b565b90506020028101906107a5919061406f565b90506107bc6107b76020830183613c58565b611950565b60016107ce6040830160208401613c58565b63ffffffff160361080e576108096107e96020830183613c58565b866107f7604085018561408d565b81019061080491906140cf565b61197e565b610845565b61081e6040820160208301613c58565b60405163065c274160e11b815263ffffffff90911660048201526024015b60405180910390fd5b50600101610778565b50505050565b604080518082019091525f808252602082015260607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146108b25760405163467409c360e01b815260040160405180910390fd5b60808601356108d66108ca6060890160408a01613e1f565b6001600160a01b031690565b146108f45760405163a4884a5960e01b815260040160405180910390fd5b5f806109018888886119c7565b90925090505f8061093261091b60608c0160408d01613e1f565b61092b60808d0160608e01613c58565b858a611a4c565b90925090506109418284614114565b925061095060c08b018b61408d565b60405161095e929190614127565b604051809103902060035f8c604001602081019061097c9190613e1f565b6001600160a01b0316815260208101919091526040015f908120906109a760808e0160608f01613c58565b63ffffffff1681526020808201929092526040015f908120916109cc908e018e614136565b6001600160401b03166001600160401b031681526020019081526020015f20819055505f610ad66040518060e001604052808d5f016020810190610a109190614136565b6001600160401b031681526020018d6060016020810190610a319190613c58565b63ffffffff1681526020018d6040016020810190610a4f9190613e1f565b6001600160a01b031681526020018d6020016020810190610a709190613c58565b63ffffffff16815260808e0135602082015260a08e01356040820152606001610a9c60c08f018f61408d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611b56565b600254604051631f5dad8b60e31b81529192506001600160a01b03169063faed6c5890610b0b9084908e908e90600401614177565b5f604051808303815f87803b158015610b22575f80fd5b505af1158015610b34573d5f803e3d5ffd5b505060408051808201909152958652505050602083015250925090505b94509492505050565b60518314610b7b5760405163864d08b360e01b815260040160405180910390fd5b6001610b878585611bae565b60ff1614610ba857604051637952a82f60e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff16610bd98585611bcf565b63ffffffff1614610bfd57604051631f4b6f8b60e11b815260040160405180910390fd5b5f610c088585611bf1565b90505f610c158686611c02565b90505f610c228787611c11565b6001600160a01b0384165f90815260036020908152604080832063ffffffff8716845282528083206001600160401b03851684529091529020549091508514610c7e576040516333074b7760e11b815260040160405180910390fd5b5f610c898484610dad565b9050610cae818989604051610c9f929190614127565b60405180910390208888611c33565b5f60405180606001604052808563ffffffff168152602001610cd08b8b611d7b565b81526001600160401b038581166020928301526040805163a825d74760e01b8152845163ffffffff1660048201529284015160248401528301511660448201526001600160a01b038781166064830152608482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a825d7479060a4015f604051808303815f87803b158015610d6f575f80fd5b505af1158015610d81573d5f803e3d5ffd5b50505050505050505050505050565b5f6105cf82611d93565b610da2611ded565b610dab5f611e19565b565b610db56137e9565b63ffffffff82165f8181527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602090815260408083206001600160a01b03888116855260018452828520958552949092529091208054919290911680610e255782546001600160a01b0316610e27565b805b6001600160a01b031684528154600160a01b900460ff16610eca578254600160a01b900460ff1615610ec55782600101805480602002602001604051908101604052809291908181526020018280548015610ea957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610e8b575b505050505060808501528254600160a01b900460ff1660208501525b610f4f565b8154600160a01b900460ff90811614610f4f5781600101805480602002602001604051908101604052809291908181526020018280548015610f3357602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f15575b505050505060808501528154600160a01b900460ff1660208501525b8154600160a81b900460ff16610ff6578254600160a81b900460ff1615610ff15782600201805480602002602001604051908101604052809291908181526020018280548015610fc657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610fa8575b505050505060a0850152825460ff600160a81b820481166040870152600160b01b9091041660608501525b61108a565b8154600160a81b900460ff9081161461108a578160020180548060200260200160405190810160405280929190818152602001828054801561105f57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611041575b505050505060a0850152815460ff600160a81b820481166040870152600160b01b9091041660608501525b61109384611e68565b50505092915050565b60605f1963ffffffff8316016110dc576110b68385610dad565b6040516020016110c69190613d56565b60405160208183030381529060405290506110fd565b60405163065c274160e11b815263ffffffff8316600482015260240161083c565b9392505050565b8060045f8686604051611118929190614127565b604080519182900390912082526020808301939093529081015f90812086825283528181203380835293528190209290925590517f04708e5dfef6005d6d646eb761e3b9e412e1cc5749fc9d884bca441cc7a952589161117f91879087908790879061419c565b60405180910390a150505050565b611195611ded565b5f5b818110156112de57368383838181106111b2576111b261405b565b90506020028101906111c491906141d4565b905060ff6111d560208301836141e8565b6111e69060408101906020016141fc565b60ff160361120757604051632ad00e0160e11b815260040160405180910390fd5b60ff61121660208301836141e8565b6112279060608101906040016141fc565b60ff1603611248576040516371aa1b6360e11b815260040160405180910390fd5b61126661125860208301836141e8565b61126190614035565b611e68565b5f61127460208301836141e8565b611282906020810190613e1f565b6001600160a01b0316036112a957604051633b6faad360e11b815260040160405180910390fd5b6112d55f6112ba6020840184613c58565b6112c760208501856141e8565b6112d090614035565b611ea0565b50600101611197565b507f65edb7dc0f21ba15c998f8bd220ea9fec30757ff9fb07696c634bcce00ce6f348282604051611310929190614295565b60405180910390a15050565b611324611ded565b6006548111156113555760065460405163b79d126360e01b815261083c918391600401918252602082015260400190565b60068190556040518181527f491ff913b5444f4136b0d4075f020cfe3a5f60de926ec0b091612401a22b7842906020015b60405180910390a150565b604080518082019091525f80825260208201525f806113b08686612128565b90925090505f6113c66060890160408a01613e1f565b90505f6113d960808a0160608b01613c58565b90505f6113e68383610dad565b90505f61141582856113ff6113fa8f614441565b6122dc565b8e8060c0019061140f919061408d565b8a612357565b825160405163c8f8dcd160e01b81529192506001600160a01b03169063c8f8dcd1906114479087908a906004016144db565b602060405180830381865afa158015611462573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148691906144fe565b6114909082614114565b90505f806114a08686858d6124fd565b90925090506114af8284614114565b6040805180820190915290815260208101919091529c9b505050505050505050505050565b6114dc6137e9565b6001600160a01b038084165f90815260016020818152604080842063ffffffff88168552825292839020835160c0810185528154958616815260ff600160a01b8704811682850152600160a81b8704811682870152600160b01b9096049095166060860152918201805484518184028101840190955280855292936080860193909283018282801561159557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611577575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156115f557602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116115d7575b505050505081525050905092915050565b61160e611ded565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f90602001611386565b611664611ded565b6001600160a01b03811661168d57604051631e4fbdf760e01b81525f600482015260240161083c565b61169681611e19565b50565b335f90815260056020526040902054808211156116d35760405163b79d126360e01b8152600481018390526024810182905260440161083c565b335f90815260056020908152604080832085850390558051631c2eb17b60e31b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169263e1758bd892600480820193918290030181865afa158015611746573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176a9190614040565b90506117778185856125cb565b604080513381526001600160a01b03861660208201529081018490527f820b7fd51bf79c54350bab98400651b3314ff6e79b33528821871d94a66698839060600161117f565b60208401515f9060ff1615611864575f5b856020015160ff168160ff16101561184d5761183886608001518260ff16815181106117fc576117fc61405b565b60200260200101518686865f9283526004602090815260408085209385529281528284206001600160a01b039095168452939093529020541490565b611845575f9150506105ed565b6001016117ce565b50846040015160ff165f03611864575060016105ed565b60608501515f5b866040015160ff168160ff161015611904576118d58760a001518260ff16815181106118995761189961405b565b60200260200101518787875f9283526004602090815260408085209385529281528284206001600160a01b039095168452939093529020541490565b156118fc57816118e481614515565b9250508160ff165f036118fc576001925050506105ed565b60010161186b565b505f9695505050505050565b6001600160a01b038216611937576040516306b7a93160e41b815260040160405180910390fd5b61194b6001600160a01b03841683836125ee565b505050565b61195981611d93565b611696576040516303fc0f9560e21b815263ffffffff8216600482015260240161083c565b611989828483611ea0565b6119938284610dad565b507fe8e2a5b92fc69ac50188ea142042492be8e8c34febb10b2cd02983684336e14282848360405161072093929190614530565b60605f805f6119d68686612128565b90925090505f6119ff6119ef60608a0160408b01613e1f565b61041660808b0160608c01613c58565b8051909150611a1e90611a1860608b0160408c01613e1f565b85612640565b93505f80611a2d838b8661272e565b9092509050611a3c8287614114565b909a909950975050505050505050565b6007545f9081906001600160a01b031615610b51576040516001600160a01b038716602482015263ffffffff861660448201526064810185905283151560848201525f9060a40160408051601f19818403018152919052602080820180516001600160e01b0316636a8e2a4360e11b1790526007549192505f918291611b00916001600160a01b0316907f0000000000000000000000000000000000000000000000000000000000000000908490876127f4565b91509150611b108787848461289e565b90955093508415611b4a576007546001600160a01b03165f9081526005602052604081208054879290611b44908490614114565b90915550505b50505094509492505050565b8051602080830151604080850151606080870151608088015160a089015160c08a015195519398611b9898600198919791966001600160a01b0316950161455f565b6040516020818303038152906040529050919050565b5f611bbc60018284866145d9565b611bc591614600565b60f81c9392505050565b5f611bde6031602d84866145d9565b611be791614630565b60e01c9392505050565b5f6110fd611bff8484612915565b90565b5f611bde600d600984866145d9565b5f611c206009600184866145d9565b611c299161465e565b60c01c9392505050565b611c3f848484846117bd565b611c5c576040516328ca4b5160e01b815260040160405180910390fd5b602084015160ff1615611ce9575f5b846020015160ff168160ff161015611ce7575f84815260046020908152604080832086845290915281206080870151805191929160ff8516908110611cb257611cb261405b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9055806001019050611c6b565b505b604084015160ff161561084e575f5b846040015160ff168160ff161015611d74575f848152600460209081526040808320868452909152812060a0870151805191929160ff8516908110611d3f57611d3f61405b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9055806001019050611cf8565b5050505050565b5f611d8a602d600d84866145d9565b6110fd9161468c565b63ffffffff81165f9081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081208054600160a01b900460ff161515806110fd575054600160b01b900460ff16151592915050565b5f546001600160a01b03163314610dab5760405163118cdaa760e01b815233600482015260240161083c565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b602081015160ff16158015611e825750606081015160ff16155b1561169657604051634dafcfbd60e11b815260040160405180910390fd5b602081015160ff9081161480611ebb5750602081015160ff16155b15611ee95760808101515115611ee457604051632ad00e0160e11b815260040160405180910390fd5b611f4f565b806020015160ff16816080015151141580611f2457506002611f0d600160ff6146a9565b611f1791906146c2565b60ff16816020015160ff16115b15611f4257604051632ad00e0160e11b815260040160405180910390fd5b611f4f8160800151612924565b604081015160ff9081161480611f6a5750604081015160ff16155b15611fbe5760a08101515115611f93576040516371aa1b6360e11b815260040160405180910390fd5b606081015160ff1615611fb957604051637c94a05f60e11b815260040160405180910390fd5b612063565b806040015160ff168160a0015151141580611ff957506002611fe2600160ff6146a9565b611fec91906146c2565b60ff16816040015160ff16115b15612017576040516371aa1b6360e11b815260040160405180910390fd5b606081015160ff1615806120385750806040015160ff16816060015160ff16115b1561205657604051637c94a05f60e11b815260040160405180910390fd5b6120638160a00151612924565b6001600160a01b038381165f90815260016020818152604080842063ffffffff881685528252928390208551815487840151958801516060890151929097166001600160a81b031990911617600160a01b60ff968716021761ffff60a81b1916600160a81b9686169690960260ff60b01b191695909517600160b01b949095169390930293909317825560808401518051859461210493850192019061382d565b5060a0820151805161212091600284019160209091019061382d565b505050505050565b606080600283101561214f5760405163196499c760e21b81525f600482015260240161083c565b5f61215d60028286886145d9565b612166916146ef565b60f01c9050600260021982016122c557805f5b8683101561226b575f61219160018501858a8c6145d9565b61219a91614600565b60f81c90505f8190036121c257604051636780cfaf60e01b81525f600482015260240161083c565b8160ff165f036121d457809150612210565b8160ff168160ff161461221057365f6121ef86868c8e6145d9565b915091506122008989868585612989565b9099509750859450919250829150505b60018401935f9061222690600301868b8d6145d9565b61222f916146ef565b60f01c90505f8190036122585760405163196499c760e21b81526004810186905260240161083c565b8060020161ffff16850194505050612179565b82871461228e5760405163196499c760e21b81526004810184905260240161083c565b60028711156122be57365f6122a585858b8d6145d9565b915091506122b68888858585612989565b909850965050505b50506122d3565b6122d0828787612aa6565b93505b50509250929050565b805160208083015160408085015160608087015160808801519351600160f81b9681019690965260c09690961b6001600160c01b031916602186015260e093841b6001600160e01b031990811660298701526001600160a01b03909216602d8601529490921b909116604d8301526051820152607101611b98565b5f805f61236384612c2c565b915091505f89604001518a6020015161237c919061471d565b90505f5b8160ff168160ff1610156124ef575f8b6020015160ff168260ff16106123d45760a08c015160208d01516123b490846146a9565b60ff16815181106123c7576123c761405b565b60200260200101516123f6565b8b608001518260ff16815181106123ed576123ed61405b565b60200260200101515b60408051602081019091525f808252919250905b8551811015612462578360ff168682815181106124295761242961405b565b602002602001015160ff160361245a5786818151811061244b5761244b61405b565b60200260200101519150612462565b60010161240a565b5060405163fdb9b0f160e01b81526001600160a01b0383169063fdb9b0f190612497908f908f908f908f908890600401614736565b602060405180830381865afa1580156124b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124d691906144fe565b6124e09088614114565b96505050806001019050612380565b505050509695505050505050565b6007545f9081906001600160a01b031615610b51576040516001600160a01b038716602482015263ffffffff861660448201526064810185905283151560848201525f9060a40160408051601f19818403018152919052602080820180516001600160e01b031663d424422160e01b1790526007549192505f9182916125af916001600160a01b0316907f00000000000000000000000000000000000000000000000000000000000000009086612e87565b915091506125bf8787848461289e565b94509450505050610b51565b6001600160a01b0383166125e35761194b8282612f2d565b61194b838383611910565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261194b908490612fd6565b60405163c015bb7d60e01b81525f906001600160a01b0385169063c015bb7d9061267090869086906004016144db565b6020604051808303815f875af115801561268c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126b091906144fe565b905080156126e5576001600160a01b0384165f90815260056020526040812080548392906126df908490614114565b90915550505b604080516001600160a01b0386168152602081018390527f61ed099e74a97a1d7f8bb0952a88ca8b7b8ebd00c126ea04671f92a81213318a910160405180910390a19392505050565b5f60608161273e6113fa86614441565b90505f61275261274d87614441565b613037565b9050606061277d8861276989840160408b01613e1f565b8561277760c08c018c61408d565b8b613054565b6040519196509150612795908490849060200161478c565b60405160208183030381529060405293507f07ea52d82345d6e838192107d8fd7123d9c2ec8e916cd0aad13fd2b60db2464488608001518960a00151836040516127e1939291906147ba565b60405180910390a1505050935093915050565b5f6060863b80830361281957604080515f808252602082019092529250925050612894565b5f805f8761ffff166001600160401b0381111561283857612838613e64565b6040519080825280601f01601f191660200182016040528015612862576020820181803683370190505b5090505f80885160208a018c8f8ff191503d925087831115612882578792505b828152825f602083013e909450925050505b9550959350505050565b5f808315806128ae575082516020115b156128bd57505f905080610b51565b5f838060200190518101906128d291906144fe565b905085156128e25780915061290b565b5f60065488116128f4576006546128f6565b875b90508082116129055781612907565b805b9350505b5094509492505050565b5f611d8a6051603184866145d9565b5f805b825181101561194b575f8382815181106129435761294361405b565b60200260200101519050826001600160a01b0316816001600160a01b03161161297f5760405163c0762a5d60e01b815260040160405180910390fd5b9150600101612927565b6060805f1960ff861601612a04578651156129c7578684846040516020016129b393929190614816565b6040516020818303038152906040526129fd565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505b9650612a9b565b60011960ff861601612a7d57855115612a4057858484604051602001612a2c93929190614816565b604051602081830303815290604052612a76565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505b9550612a9b565b604051636780cfaf60e01b815260ff8616600482015260240161083c565b509495939450505050565b60605f1961ffff851601612b445760228214612ad5576040516301b8ca5560e31b815260040160405180910390fd5b5f612af5612ae76022600286886145d9565b612af09161468c565b6132fb565b604051600160f81b60208201819052601160f01b602183015260238201526001600160801b0319608083901b1660248201529091506034016040516020818303038152906040529150506110fd565b60011961ffff851601612c0d57604282111580612b615750606282115b15612b7f576040516360493e2b60e11b815260040160405180910390fd5b5f612b91612ae76022600286886145d9565b90505f612ba5612ae76042602287896145d9565b90505f6041198501612bba866042818a6145d9565b612bc39161468c565b60405160086020938403029190911c9250612bf4916001916011918391889183916031916002918b918b910161483c565b60405160208183030381529060405293505050506110fd565b604051630417051360e41b815261ffff8516600482015260240161083c565b60608082515f03612c3c57915091565b5f612c468461333b565b90508060ff16600103612cf65760408051600180825281830190925290816020015b6060815260200190600190039081612c6857905050925083835f81518110612c9257612c9261405b565b602090810291909101015260408051600180825281830190925290816020016020820280368337019050509150612cca846003613412565b825f81518110612cdc57612cdc61405b565b602002602001019060ff16908160ff168152505050915091565b8060ff166001600160401b03811115612d1157612d11613e64565b604051908082528060200260200182016040528015612d3a578160200160208202803683370190505b5091508060ff166001600160401b03811115612d5857612d58613e64565b604051908082528060200260200182016040528015612d8b57816020015b6060815260200190600190039081612d765790505b5092505f8060ff5b8651831015612e1d576001909201915f612dad888561346d565b6002949094019390505f612dc18986613412565b90508260ff1660ff03612dd657809250612e0e565b8260ff168160ff1614612e0e57600219848603015f612df68b87846134c9565b9050612e048a8a87846135d5565b5093909301929150815b5061ffff169290920191612d93565b8183035f612e2c8985846134c9565b9050612e3a888885846135d5565b5f5b8660ff168160ff161015612e7b57878160ff1681518110612e5f57612e5f61405b565b6020908102919091010180515f190160ff169052600101612e3c565b50505050505050915091565b5f6060853b808303612eac57604080515f808252602082019092529250925050610b51565b5f805f8761ffff166001600160401b03811115612ecb57612ecb613e64565b6040519080825280601f01601f191660200182016040528015612ef5576020820181803683370190505b5090505f80885160208a018d8dfa91503d925087831115612f14578792505b828152825f602083013e90999098509650505050505050565b6001600160a01b038216612f54576040516306b7a93160e41b815260040160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612f9d576040519150601f19603f3d011682016040523d82523d5f602084013e612fa2565b606091505b505090508061194b57604051631196f20d60e21b81526001600160a01b03841660048201526024810183905260440161083c565b5f612fea6001600160a01b038416836136e7565b905080515f1415801561300e57508080602001905181019061300c91906148d3565b155b1561194b57604051635274afe760e01b81526001600160a01b038416600482015260240161083c565b60608160a001518260c00151604051602001611b989291906148ee565b5f60605f8061306285612c2c565b915091505f8a604001518b6020015161307b919061471d565b90508060ff166001600160401b0381111561309857613098613e64565b6040519080825280602002602001820160405280156130c1578160200160208202803683370190505b5093505f5b8160ff168160ff1610156132ec575f8c6020015160ff168260ff161061311a5760a08d015160208e01516130fa90846146a9565b60ff168151811061310d5761310d61405b565b602002602001015161313c565b8c608001518260ff16815181106131335761313361405b565b60200260200101515b60408051602081019091525f808252919250905b85518110156131a8578360ff1686828151811061316f5761316f61405b565b602002602001015160ff16036131a0578681815181106131915761319161405b565b602002602001015191506131a8565b600101613150565b50816001600160a01b031663f42ed2ed8e8e8e8e866040518663ffffffff1660e01b81526004016131dd959493929190614736565b6020604051808303815f875af11580156131f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061321d91906144fe565b878460ff16815181106132325761323261405b565b6020026020010181815250505f878460ff16815181106132545761325461405b565b602002602001015111156132e257868360ff16815181106132775761327761405b565b602002602001015160055f846001600160a01b03166001600160a01b031681526020019081526020015f205f8282546132b09190614114565b92505081905550868360ff16815181106132cc576132cc61405b565b6020026020010151886132df9190614114565b97505b50506001016130c6565b50505050965096945050505050565b5f6fffffffffffffffffffffffffffffffff821115613337576040516306dfcc6560e41b8152608060048201526024810183905260440161083c565b5090565b5f80805b83518210156133e7576001909101905f613359858461346d565b905060028301925060028161ffff16101561338a5760405163013adb8360e21b81526004810184905260240161083c565b5f6133958685613412565b90508060ff1660ff036133bb576040516334f4f66f60e21b815260040160405180910390fd5b600160ff82161b83166133d85760019485019460ff82161b831792505b5061ffff16919091019061333f565b8351821461340b5760405163013adb8360e21b81526004810183905260240161083c565b5050919050565b5f61341e826001614114565b835110156134645760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b604482015260640161083c565b50016001015190565b5f613479826002614114565b835110156134c05760405162461bcd60e51b8152602060048201526014602482015273746f55696e7431365f6f75744f66426f756e647360601b604482015260640161083c565b50016002015190565b6060816134d781601f614114565b10156135165760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640161083c565b6135208284614114565b845110156135645760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640161083c565b6060821580156135825760405191505f8252602082016040526135cc565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156135bb5780518352602092830192016135a3565b5050858452601f01601f1916604052505b50949350505050565b8160ff1660ff036135f9576040516334f4f66f60e21b815260040160405180910390fd5b5f61360583600161471d565b90505f5b8451811015612120575f8582815181106136255761362561405b565b602002602001015190508060ff168360ff160361369a5786828151811061364e5761364e61405b565b60200260200101518460405160200161366892919061478c565b6040516020818303038152906040528783815181106136895761368961405b565b602002602001018190525050612120565b8060ff165f036136de57828683815181106136b7576136b761405b565b602002602001019060ff16908160ff1681525050838783815181106136895761368961405b565b50600101613609565b60606110fd83835f845f80856001600160a01b0316848660405161370b9190614913565b5f6040518083038185875af1925050503d805f8114613745576040519150601f19603f3d011682016040523d82523d5f602084013e61374a565b606091505b509150915061375a868383613764565b9695505050505050565b60608261377957613774826137c0565b6110fd565b815115801561379057506001600160a01b0384163b155b156137b957604051639996b31560e01b81526001600160a01b038516600482015260240161083c565b50806110fd565b8051156137d05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060c001604052805f6001600160a01b031681526020015f60ff1681526020015f60ff1681526020015f60ff16815260200160608152602001606081525090565b828054828255905f5260205f20908101928215613880579160200282015b8281111561388057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061384b565b506133379291505b80821115613337575f8155600101613888565b5f602082840312156138ab575f80fd5b81356001600160e01b0319811681146110fd575f80fd5b5f805f80608085870312156138d5575f80fd5b84356001600160401b038111156138ea575f80fd5b850160c081880312156138fb575f80fd5b966020860135965060408601359560600135945092505050565b602081016003831061393557634e487b7160e01b5f52602160045260245ffd5b91905290565b6001600160a01b0381168114611696575f80fd5b803561395a8161393b565b919050565b803563ffffffff8116811461395a575f80fd5b80356001600160401b038116811461395a575f80fd5b5f805f6060848603121561399a575f80fd5b83356139a58161393b565b92506139b36020850161395f565b91506139c160408501613972565b90509250925092565b5f805f606084860312156139dc575f80fd5b83356139e78161393b565b925060208401356139f78161393b565b929592945050506040919091013590565b5f8083601f840112613a18575f80fd5b5081356001600160401b03811115613a2e575f80fd5b6020830191508360208260051b8501011115613a48575f80fd5b9250929050565b5f805f60408486031215613a61575f80fd5b8335613a6c8161393b565b925060208401356001600160401b03811115613a86575f80fd5b613a9286828701613a08565b9497909650939450505050565b5f805f60608486031215613ab1575f80fd5b83359250602084013591506040840135613aca8161393b565b809150509250925092565b5f8083601f840112613ae5575f80fd5b5081356001600160401b03811115613afb575f80fd5b602083019150836020828501011115613a48575f80fd5b8015158114611696575f80fd5b5f805f8060608587031215613b32575f80fd5b84356001600160401b0380821115613b48575f80fd5b9086019060e08289031215613b5b575f80fd5b90945060208601359080821115613b70575f80fd5b50613b7d87828801613ad5565b9094509250506040850135613b9181613b12565b939692955090935050565b5f5b83811015613bb6578181015183820152602001613b9e565b50505f910152565b5f8151808452613bd5816020860160208601613b9c565b601f01601f19169290920160200192915050565b8251815260208084015190820152606060408201525f6105ed6060830184613bbe565b5f805f8060608587031215613c1f575f80fd5b84356001600160401b03811115613c34575f80fd5b613c4087828801613ad5565b90989097506020870135966040013595509350505050565b5f60208284031215613c68575f80fd5b6110fd8261395f565b5f8060408385031215613c82575f80fd5b8235613c8d8161393b565b9150613c9b6020840161395f565b90509250929050565b5f815180845260208085019450602084015f5b83811015613cdc5781516001600160a01b031687529582019590820190600101613cb7565b509495945050505050565b60018060a01b03815116825260ff602082015116602083015260ff604082015116604083015260ff60608201511660608301525f608082015160c06080850152613d3460c0850182613ca4565b905060a083015184820360a0860152613d4d8282613ca4565b95945050505050565b602081525f6110fd6020830184613ce7565b5f805f60608486031215613d7a575f80fd5b613d838461395f565b92506020840135613d938161393b565b91506139c16040850161395f565b602081525f6110fd6020830184613bbe565b5f8060208385031215613dc4575f80fd5b82356001600160401b03811115613dd9575f80fd5b613de585828601613a08565b90969095509350505050565b5f60208284031215613e01575f80fd5b5035919050565b8151815260208083015190820152604081016105cf565b5f60208284031215613e2f575f80fd5b81356110fd8161393b565b5f8060408385031215613e4b575f80fd5b8235613e568161393b565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b0381118282101715613e9a57613e9a613e64565b60405290565b60405160e081016001600160401b0381118282101715613e9a57613e9a613e64565b604051601f8201601f191681016001600160401b0381118282101715613eea57613eea613e64565b604052919050565b803560ff8116811461395a575f80fd5b5f82601f830112613f11575f80fd5b813560206001600160401b03821115613f2c57613f2c613e64565b816