diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 4c964e1767..7426a46392 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -65,7 +65,7 @@ CommitStore_verify:test_Paused_Revert() (gas: 18496) CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36785) DefensiveExampleTest:test_HappyPath_Success() (gas: 200018) DefensiveExampleTest:test_Recovery() (gas: 424253) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106777) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106837) EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 263045) EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 93686) EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12334) @@ -75,30 +75,30 @@ EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainPrevO EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 102154) EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 12423) EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 12398) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 278819) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 224246) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 149607) -EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 178905) -EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 136137) -EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 520321) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 278879) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 224306) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 149627) +EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 178945) +EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 136157) +EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 520361) EVM2EVMMultiOffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10441) EVM2EVMMultiOffRamp_ccipReceive:test_Reverts() (gas: 17112) -EVM2EVMMultiOffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7024424) -EVM2EVMMultiOffRamp_commit:test_NoConfig_Revert() (gas: 6607347) +EVM2EVMMultiOffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7030444) +EVM2EVMMultiOffRamp_commit:test_NoConfig_Revert() (gas: 6613367) EVM2EVMMultiOffRamp_commit:test_SingleReport_Success() (gas: 161050) EVM2EVMMultiOffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 120903) -EVM2EVMMultiOffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 7043199) -EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 6693178) -EVM2EVMMultiOffRamp_constructor:test_SourceChainSelector_Revert() (gas: 100000) -EVM2EVMMultiOffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 98581) -EVM2EVMMultiOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 100033) -EVM2EVMMultiOffRamp_constructor:test_ZeroRMNProxy_Revert() (gas: 96338) -EVM2EVMMultiOffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 96428) -EVM2EVMMultiOffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7073921) -EVM2EVMMultiOffRamp_execute:test_NoConfig_Revert() (gas: 6656587) -EVM2EVMMultiOffRamp_execute:test_SingleReport_Success() (gas: 156855) -EVM2EVMMultiOffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 140699) -EVM2EVMMultiOffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 7436229) +EVM2EVMMultiOffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 7049219) +EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 6699198) +EVM2EVMMultiOffRamp_constructor:test_SourceChainSelector_Revert() (gas: 100010) +EVM2EVMMultiOffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 98591) +EVM2EVMMultiOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 100043) +EVM2EVMMultiOffRamp_constructor:test_ZeroRMNProxy_Revert() (gas: 96348) +EVM2EVMMultiOffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 96438) +EVM2EVMMultiOffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7079961) +EVM2EVMMultiOffRamp_execute:test_NoConfig_Revert() (gas: 6662627) +EVM2EVMMultiOffRamp_execute:test_SingleReport_Success() (gas: 156875) +EVM2EVMMultiOffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 140719) +EVM2EVMMultiOffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 7442269) EVM2EVMMultiOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20642) EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 255841) EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 22871) @@ -112,54 +112,55 @@ EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithValidatio EVM2EVMMultiOffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 37471) EVM2EVMMultiOffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 21760) EVM2EVMMultiOffRamp_executeSingleReport:test_InvalidMessageId_Revert() (gas: 41784) -EVM2EVMMultiOffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 448826) +EVM2EVMMultiOffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 448866) EVM2EVMMultiOffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 53535) EVM2EVMMultiOffRamp_executeSingleReport:test_MessageTooLarge_Revert() (gas: 154093) EVM2EVMMultiOffRamp_executeSingleReport:test_MismatchingOnRampAddress_Revert() (gas: 44609) EVM2EVMMultiOffRamp_executeSingleReport:test_MismatchingSourceChainSelector_Revert() (gas: 41676) EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 37730) -EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 170521) -EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 182126) +EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 170541) +EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 182146) EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 49176) EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 406064) -EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 233299) -EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 180875) -EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 251935) -EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 119104) -EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 383681) +EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 233339) +EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 180915) +EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 251955) +EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 119124) +EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 383701) EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 55923) EVM2EVMMultiOffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 53355) -EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 528845) -EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 466372) +EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 528885) +EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 466412) EVM2EVMMultiOffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 35849) -EVM2EVMMultiOffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 518773) -EVM2EVMMultiOffRamp_executeSingleReport:test_Unhealthy_Revert() (gas: 516171) +EVM2EVMMultiOffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 518813) +EVM2EVMMultiOffRamp_executeSingleReport:test_Unhealthy_Revert() (gas: 516211) EVM2EVMMultiOffRamp_executeSingleReport:test_UnsupportedNumberOfTokens_Revert() (gas: 65466) -EVM2EVMMultiOffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 483389) -EVM2EVMMultiOffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 147660) -EVM2EVMMultiOffRamp_execute_upgrade:test_NoPrevOffRampForChain_Success() (gas: 239545) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 239490) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 290042) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 270541) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 247759) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 235734) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedWithMultiRamp_Revert() (gas: 7609067) -EVM2EVMMultiOffRamp_execute_upgrade:test_Upgraded_Success() (gas: 136490) +EVM2EVMMultiOffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 483429) +EVM2EVMMultiOffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 147680) +EVM2EVMMultiOffRamp_execute_upgrade:test_NoPrevOffRampForChain_Success() (gas: 239585) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 239530) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 290102) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 270581) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 247819) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 235794) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedWithMultiRamp_Revert() (gas: 7615107) +EVM2EVMMultiOffRamp_execute_upgrade:test_Upgraded_Success() (gas: 136510) EVM2EVMMultiOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3590746) EVM2EVMMultiOffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 117760) EVM2EVMMultiOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 86873) EVM2EVMMultiOffRamp_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 75619) -EVM2EVMMultiOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 495885) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 197979) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 28211) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchMultipleReports_Revert() (gas: 160638) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 79995) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 28698) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 200700) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithMultiReportGasOverride_Success() (gas: 642578) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithPartialMessages_Success() (gas: 287624) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 200126) -EVM2EVMMultiOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2342912) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 79972) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 28721) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 152516) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 198036) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 28254) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 160615) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 495948) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2371462) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 200146) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 200742) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 642734) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 287749) EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnOnRampAddress_Success() (gas: 11027) EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnSourceChain_Success() (gas: 11080) EVM2EVMMultiOffRamp_metadataHash:test_MetadataHash_Success() (gas: 9191) @@ -186,11 +187,11 @@ EVM2EVMMultiOffRamp_reportCommit:test_Unhealthy_Revert() (gas: 69784) EVM2EVMMultiOffRamp_reportCommit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 140904) EVM2EVMMultiOffRamp_reportCommit:test_ZeroEpochAndRound_Revert() (gas: 17735) EVM2EVMMultiOffRamp_reportExec:test_IncorrectArrayType_Revert() (gas: 10004) -EVM2EVMMultiOffRamp_reportExec:test_LargeBatch_Success() (gas: 1470770) -EVM2EVMMultiOffRamp_reportExec:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 293423) -EVM2EVMMultiOffRamp_reportExec:test_MultipleReports_Success() (gas: 224618) +EVM2EVMMultiOffRamp_reportExec:test_LargeBatch_Success() (gas: 1471370) +EVM2EVMMultiOffRamp_reportExec:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 293483) +EVM2EVMMultiOffRamp_reportExec:test_MultipleReports_Success() (gas: 224678) EVM2EVMMultiOffRamp_reportExec:test_NonArray_Revert() (gas: 22774) -EVM2EVMMultiOffRamp_reportExec:test_SingleReport_Success() (gas: 133799) +EVM2EVMMultiOffRamp_reportExec:test_SingleReport_Success() (gas: 133819) EVM2EVMMultiOffRamp_reportExec:test_ZeroReports_Revert() (gas: 9899) EVM2EVMMultiOffRamp_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11377) EVM2EVMMultiOffRamp_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 155750) @@ -222,7 +223,7 @@ EVM2EVMMultiOnRamp_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFee EVM2EVMMultiOnRamp_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13116) EVM2EVMMultiOnRamp_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17292) EVM2EVMMultiOnRamp_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14279) -EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkChainSelectorEqZero_Revert() (gas: 188963) +EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkChainSelectorEqZero_Revert() (gas: 186179) EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkTokenEqAddressZero_Revert() (gas: 181803) EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 184035) EVM2EVMMultiOnRamp_constructor:test_Constructor_Success() (gas: 5244326) @@ -302,41 +303,41 @@ EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthRe EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 44501) EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 214353) EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 306982) -EVM2EVMOffRamp__report:test_Report_Success() (gas: 127804) +EVM2EVMOffRamp__report:test_Report_Success() (gas: 127824) EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 255301) EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 263892) EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 336088) EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 314736) EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17096) -EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153455) -EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5485118) -EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 144211) +EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153464) +EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5491136) +EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 144220) EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21485) EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36464) EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 51767) -EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 474022) +EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 474062) EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 46423) EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 152496) EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101289) -EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165120) -EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177968) +EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165140) +EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177988) EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41295) EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 402660) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159741) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 174964) -EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248756) -EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115194) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409580) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159781) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175004) +EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248776) +EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115214) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409600) EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54216) -EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132250) +EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132270) EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52165) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 560776) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 500076) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 560816) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 500116) EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35486) -EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 548751) +EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 548791) EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 64049) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 123435) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 143587) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 123455) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 143607) EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20615) EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 282106) EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20264) @@ -345,22 +346,23 @@ EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 4875 EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48241) EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 316806) EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 72643) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 232006) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 280927) -EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 261988) -EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 230469) -EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 132006) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 232046) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 280987) +EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 262028) +EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 230529) +EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 132026) EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408) EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556) EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 484013) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 186969) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25916) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 484053) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 187049) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25894) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43519) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 25966) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 189203) -EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 188664) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2000757) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 26009) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 189243) +EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 188704) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2028045) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 144226) EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871) EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429) EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38804) @@ -603,7 +605,7 @@ MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24205) MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 62379) MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39969) MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33006) -MultiRampsE2E:test_E2E_3MessagesSuccess_gas() (gas: 1338988) +MultiRampsE2E:test_E2E_3MessagesSuccess_gas() (gas: 1339048) OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12171) OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42233) OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84124) diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip index 3930d3c2e9..31c4bfff6d 100755 --- a/contracts/scripts/native_solc_compile_all_ccip +++ b/contracts/scripts/native_solc_compile_all_ccip @@ -8,7 +8,7 @@ echo " └─────────────────────── SOLC_VERSION="0.8.24" OPTIMIZE_RUNS=26000 -OPTIMIZE_RUNS_OFFRAMP=19500 +OPTIMIZE_RUNS_OFFRAMP=18000 OPTIMIZE_RUNS_ONRAMP=3600 diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol index 0a8e50517a..a51cc9ccb9 100644 --- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol @@ -500,8 +500,12 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 // Since it's hard to estimate whether manual execution will succeed, we // revert the entire transaction if it fails. This will show the user if // their manual exec will fail before they submit it. - if (manualExecution && newState == Internal.MessageExecutionState.FAILURE) { - // If manual execution fails, we revert the entire transaction. + if ( + manualExecution && newState == Internal.MessageExecutionState.FAILURE + && originalState != Internal.MessageExecutionState.UNTOUCHED + ) { + // If manual execution fails, we revert the entire transaction, unless the originalState is UNTOUCHED as we + // would still be making progress by changing the state from UNTOUCHED to FAILURE. revert ExecutionError(message.messageId, returnData); } diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol index 86886aace3..54f4eead19 100644 --- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol @@ -358,8 +358,12 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio // Since it's hard to estimate whether manual execution will succeed, we // revert the entire transaction if it fails. This will show the user if // their manual exec will fail before they submit it. - if (manualExecution && newState == Internal.MessageExecutionState.FAILURE) { - // If manual execution fails, we revert the entire transaction. + if ( + manualExecution && newState == Internal.MessageExecutionState.FAILURE + && originalState != Internal.MessageExecutionState.UNTOUCHED + ) { + // If manual execution fails, we revert the entire transaction, unless the originalState is UNTOUCHED as we + // would still be making progress by changing the state from UNTOUCHED to FAILURE. revert ExecutionError(returnData); } @@ -427,10 +431,9 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio // prepended by the 4 bytes of ReceiverError.selector, TokenHandlingError.selector or InvalidPoolAddress.selector. // Max length of revert data is Router.MAX_RET_BYTES, max length of err is 4 + Router.MAX_RET_BYTES return (Internal.MessageExecutionState.FAILURE, err); - } else { - // If revert is not caused by CCIP receiver, it is unexpected, bubble up the revert. - revert ExecutionError(err); } + // If revert is not caused by CCIP receiver, it is unexpected, bubble up the revert. + revert ExecutionError(err); } // If message execution succeeded, no CCIP receiver return data is expected, return with empty bytes. return (Internal.MessageExecutionState.SUCCESS, ""); diff --git a/contracts/src/v0.8/ccip/test/e2e/End2End.t.sol b/contracts/src/v0.8/ccip/test/e2e/End2End.t.sol index b381c0fcca..ad2aecdde9 100644 --- a/contracts/src/v0.8/ccip/test/e2e/End2End.t.sol +++ b/contracts/src/v0.8/ccip/test/e2e/End2End.t.sol @@ -72,17 +72,17 @@ contract E2E is EVM2EVMOnRampSetup, CommitStoreSetup, EVM2EVMOffRampSetup { vm.warp(BLOCK_TIME + 2000); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[1].sequenceNumber, messages[1].messageId, Internal.MessageExecutionState.SUCCESS, "" ); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[2].sequenceNumber, messages[2].messageId, Internal.MessageExecutionState.SUCCESS, "" ); diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol index a0d4bd1c9d..bedcaac03d 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol @@ -401,7 +401,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { } function test_SingleMessageNoTokens_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( messages[0].sourceChainSelector, @@ -433,7 +433,8 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { } function test_SingleMessageNoTokensOtherChain_Success() public { - Internal.EVM2EVMMessage[] memory messagesChain1 = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messagesChain1 = + _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); s_offRamp.executeSingleReport( _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesChain1), new uint256[](0) ); @@ -441,7 +442,8 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { uint64 nonceChain1 = s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messagesChain1[0].sender); assertGt(nonceChain1, 0); - Internal.EVM2EVMMessage[] memory messagesChain2 = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_3, ON_RAMP_ADDRESS_3); + Internal.EVM2EVMMessage[] memory messagesChain2 = + _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_3, ON_RAMP_ADDRESS_3); assertEq(s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_3, messagesChain2[0].sender), 0); s_offRamp.executeSingleReport( @@ -454,7 +456,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { } function test_ReceiverError_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); bytes memory realError1 = new bytes(2); realError1[0] = 0xbe; @@ -483,7 +485,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { } function test_SkippedIncorrectNonce_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].nonce++; messages[0].messageId = @@ -520,7 +522,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { } function test__execute_SkippedAlreadyExecutedMessage_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -542,7 +544,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { // Send a message to a contract that does not implement the CCIPReceiver interface // This should execute successfully. function test_SingleMessageToNonCCIPReceiver_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); MaybeRevertMessageReceiverNo165 newReceiver = new MaybeRevertMessageReceiverNo165(true); messages[0].receiver = address(newReceiver); messages[0].messageId = @@ -562,7 +564,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { function test_SingleMessagesNoTokensSuccess_gas() public { vm.pauseGasMetering(); - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -690,7 +692,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { // Reverts function test_InvalidMessageId_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].nonce++; // MessageID no longer matches hash. Internal.ExecutionReportSingleChain memory executionReport = @@ -700,7 +702,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { } function test_MismatchingSourceChainSelector_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_3, ON_RAMP_ADDRESS_3); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_3, ON_RAMP_ADDRESS_3); messages[0].sourceChainSelector = SOURCE_CHAIN_SELECTOR_1; // MessageID no longer matches hash. Internal.ExecutionReportSingleChain memory executionReport = @@ -710,7 +712,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { } function test_MismatchingOnRampAddress_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_3)); // MessageID no longer matches hash. @@ -765,7 +767,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { function test_UnexpectedTokenData_Revert() public { Internal.ExecutionReportSingleChain memory report = _generateReportFromMessages( - SOURCE_CHAIN_SELECTOR_1, _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) + SOURCE_CHAIN_SELECTOR_1, _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ); report.offchainTokenData = new bytes[][](report.messages.length + 1); @@ -792,7 +794,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { s_offRamp.setVerifyOverrideResult(SOURCE_CHAIN_SELECTOR_1, 0); vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.RootNotCommitted.selector, SOURCE_CHAIN_SELECTOR_1)); - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); s_offRamp.executeSingleReport( _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), _getGasLimitsFromMessages(messages) ); @@ -805,7 +807,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { abi.encodeWithSelector(EVM2EVMMultiOffRamp.ManualExecutionNotYetEnabled.selector, SOURCE_CHAIN_SELECTOR_1) ); - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); s_offRamp.executeSingleReport( _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), _getGasLimitsFromMessages(messages) ); @@ -815,21 +817,21 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { uint64 newSourceChainSelector = SOURCE_CHAIN_SELECTOR_1 + 1; address newOnRamp = address(uint160(ON_RAMP_ADDRESS_1) + 1); - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(newSourceChainSelector, newOnRamp); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(newSourceChainSelector, newOnRamp); vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.SourceChainNotEnabled.selector, newSourceChainSelector)); s_offRamp.executeSingleReport(_generateReportFromMessages(newSourceChainSelector, messages), new uint256[](0)); } function test_DisabledSourceChain_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_2, ON_RAMP_ADDRESS_2); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_2, ON_RAMP_ADDRESS_2); vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.SourceChainNotEnabled.selector, SOURCE_CHAIN_SELECTOR_2)); s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_2, messages), new uint256[](0)); } function test_UnsupportedNumberOfTokens_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); Client.EVMTokenAmount[] memory newTokens = new Client.EVMTokenAmount[](MAX_TOKENS_LENGTH + 1); messages[0].tokenAmounts = newTokens; messages[0].messageId = @@ -845,7 +847,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { } function test_TokenDataMismatch_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain memory report = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); report.offchainTokenData[0] = new bytes[](messages[0].tokenAmounts.length + 1); @@ -859,7 +861,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { } function test_MessageTooLarge_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].data = new bytes(MAX_DATA_SIZE + 1); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); @@ -875,7 +877,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { } function test_RouterYULCall_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); // gas limit too high, Router's external call should revert messages[0].gasLimit = 1e36; @@ -897,7 +899,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { } function test_RetryFailedMessageWithoutManualExecution_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); bytes memory realError1 = new bytes(2); realError1[0] = 0xbe; @@ -978,7 +980,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { } function test_Upgraded_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( SOURCE_CHAIN_SELECTOR_1, @@ -992,14 +994,15 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { } function test_NoPrevOffRampForChain_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); uint64 startNonceChain3 = s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_3, messages[0].sender); s_prevOffRamp.execute(_generateSingleRampReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); // Nonce unchanged for chain 3 assertEq(startNonceChain3, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_3, messages[0].sender)); - Internal.EVM2EVMMessage[] memory messagesChain3 = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_3, ON_RAMP_ADDRESS_3); + Internal.EVM2EVMMessage[] memory messagesChain3 = + _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_3, ON_RAMP_ADDRESS_3); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( SOURCE_CHAIN_SELECTOR_3, @@ -1016,7 +1019,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { } function test_UpgradedSenderNoncesReadsPreviousRamp_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); uint64 startNonce = s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); for (uint64 i = 1; i < 4; ++i) { @@ -1032,7 +1035,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { } function test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_2, ON_RAMP_ADDRESS_2); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_2, ON_RAMP_ADDRESS_2); uint64 startNonce = s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_2, messages[0].sender); for (uint64 i = 1; i < 4; ++i) { @@ -1051,7 +1054,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { } function test_UpgradedNonceStartsAtV1Nonce_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); uint64 startNonce = s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); s_prevOffRamp.execute(_generateSingleRampReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); @@ -1093,7 +1096,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { } function test_UpgradedNonceNewSenderStartsAtZero_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); s_prevOffRamp.execute(_generateSingleRampReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); @@ -1118,7 +1121,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { } function test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); address newSender = address(1234567); messages[0].sender = newSender; @@ -1163,7 +1166,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { } function test_UpgradedWithMultiRamp_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( SOURCE_CHAIN_SELECTOR_1, @@ -1355,7 +1358,7 @@ contract EVM2EVMMultiOffRamp_batchExecute is EVM2EVMMultiOffRampSetup { } function test_SingleReport_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( messages[0].sourceChainSelector, @@ -1465,7 +1468,7 @@ contract EVM2EVMMultiOffRamp_batchExecute is EVM2EVMMultiOffRampSetup { } function test_MultipleReportsSkipDuplicate_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain[] memory reports = new Internal.ExecutionReportSingleChain[](2); reports[0] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); @@ -1539,8 +1542,8 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { s_offRamp.setVerifyOverrideResult(SOURCE_CHAIN_SELECTOR_3, 1); } - function test_ManualExec_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + function test_manuallyExecute_Success() public { + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); @@ -1562,8 +1565,8 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); } - function test_ManualExecWithGasOverride_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + function test_manuallyExecute_WithGasOverride_Success() public { + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); @@ -1587,7 +1590,37 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); } - function test_ManualExecWithMultiReportGasOverride_Success() public { + function test_manuallyExecute_DoesNotRevertIfUntouched_Success() public { + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + messages[0].receiver = address(s_reverting_receiver); + messages[0].messageId = + Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + + assertEq(messages[0].nonce - 1, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); + + s_reverting_receiver.setRevert(true); + + vm.expectEmit(); + emit EVM2EVMMultiOffRamp.ExecutionStateChanged( + SOURCE_CHAIN_SELECTOR_1, + messages[0].sequenceNumber, + messages[0].messageId, + Internal.MessageExecutionState.FAILURE, + abi.encodeWithSelector( + EVM2EVMMultiOffRamp.ReceiverError.selector, + abi.encodeWithSelector(MaybeRevertMessageReceiver.CustomError.selector, "") + ) + ); + + uint256[][] memory gasLimitOverrides = new uint256[][](1); + gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); + + s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); + + assertEq(messages[0].nonce, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); + } + + function test_manuallyExecute_WithMultiReportGasOverride_Success() public { Internal.EVM2EVMMessage[] memory messages1 = new Internal.EVM2EVMMessage[](3); Internal.EVM2EVMMessage[] memory messages2 = new Internal.EVM2EVMMessage[](2); @@ -1646,7 +1679,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { s_offRamp.manuallyExecute(reports, gasLimitOverrides); } - function test_ManualExecWithPartialMessages_Success() public { + function test_manuallyExecute_WithPartialMessages_Success() public { Internal.EVM2EVMMessage[] memory messages = new Internal.EVM2EVMMessage[](3); for (uint64 i = 0; i < 3; ++i) { @@ -1710,8 +1743,8 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, newMessages), gasLimitOverrides); } - function test_LowGasLimitManualExec_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + function test_manuallyExecute_LowGasLimit_Success() public { + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].gasLimit = 1; messages[0].receiver = address(new ConformingReceiver(address(s_destRouter), s_destFeeToken)); messages[0].messageId = @@ -1747,8 +1780,8 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { // Reverts - function test_ManualExecForkedChain_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + function test_manuallyExecute_ForkedChain_Revert() public { + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain[] memory reports = _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); @@ -1794,7 +1827,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { s_offRamp.manuallyExecute(reports, gasLimitOverrides); } - function test_ManualExecGasLimitMismatchMultipleReports_Revert() public { + function test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() public { Internal.EVM2EVMMessage[] memory messages1 = new Internal.EVM2EVMMessage[](2); Internal.EVM2EVMMessage[] memory messages2 = new Internal.EVM2EVMMessage[](1); @@ -1838,7 +1871,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { } function test_ManualExecInvalidGasLimit_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); uint256[][] memory gasLimitOverrides = new uint256[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); @@ -1852,8 +1885,8 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); } - function test_ManualExecFailedTx_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + function test_manuallyExecute_FailedTx_Revert() public { + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); messages[0].messageId = @@ -1879,7 +1912,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); } - function test_ReentrancyManualExecuteFails() public { + function test_manuallyExecute_ReentrancyFails() public { uint256 tokenAmount = 1e9; IERC20 tokenToAbuse = IERC20(s_destFeeToken); @@ -1891,7 +1924,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { // For this test any message will be flagged as correct by the // commitStore. In a real scenario the abuser would have to actually // send the message that they want to replay. - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].tokenAmounts = new Client.EVMTokenAmount[](1); messages[0].tokenAmounts[0] = Client.EVMTokenAmount({token: s_sourceFeeToken, amount: tokenAmount}); messages[0].receiver = address(receiver); @@ -1917,16 +1950,17 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { // The first entry should be fine and triggers the second entry. This one fails // but since it's an inner tx of the first one it is caught in the try-catch. - // Since this is manual exec, the entire tx fails on any failure. - vm.expectRevert( + // This means the first tx is marked `FAILURE` with the error message of the second tx. + vm.expectEmit(); + emit EVM2EVMMultiOffRamp.ExecutionStateChanged( + messages[0].sourceChainSelector, + messages[0].sequenceNumber, + messages[0].messageId, + Internal.MessageExecutionState.FAILURE, abi.encodeWithSelector( - EVM2EVMMultiOffRamp.ExecutionError.selector, - messages[0].messageId, + EVM2EVMMultiOffRamp.ReceiverError.selector, abi.encodeWithSelector( - EVM2EVMMultiOffRamp.ReceiverError.selector, - abi.encodeWithSelector( - EVM2EVMMultiOffRamp.AlreadyExecuted.selector, SOURCE_CHAIN_SELECTOR_1, messages[0].sequenceNumber - ) + EVM2EVMMultiOffRamp.AlreadyExecuted.selector, messages[0].sourceChainSelector, messages[0].sequenceNumber ) ) ); @@ -1947,7 +1981,7 @@ contract EVM2EVMMultiOffRamp_reportExec is EVM2EVMMultiOffRampSetup { // Asserts that execute completes function test_SingleReport_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain[] memory reports = _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); @@ -2106,7 +2140,7 @@ contract EVM2EVMMultiOffRamp_reportExec is EVM2EVMMultiOffRampSetup { } function test_NonArray_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain memory report = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); vm.expectRevert(); @@ -2125,7 +2159,7 @@ contract EVM2EVMMultiOffRamp_execute is EVM2EVMMultiOffRampSetup { function test_SingleReport_Success() public { bytes32[3] memory reportContext = [s_configDigestExec, s_configDigestExec, s_configDigestExec]; - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain[] memory reports = _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); @@ -2152,7 +2186,7 @@ contract EVM2EVMMultiOffRamp_execute is EVM2EVMMultiOffRampSetup { function test_UnauthorizedTransmitter_Revert() public { bytes32[3] memory reportContext = [s_configDigestExec, s_configDigestExec, s_configDigestExec]; - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain[] memory reports = _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); @@ -2166,7 +2200,7 @@ contract EVM2EVMMultiOffRamp_execute is EVM2EVMMultiOffRampSetup { bytes32[3] memory reportContext = [bytes32(""), s_configDigestExec, s_configDigestExec]; - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain[] memory reports = _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); @@ -2193,7 +2227,7 @@ contract EVM2EVMMultiOffRamp_execute is EVM2EVMMultiOffRampSetup { bytes32[3] memory reportContext = [bytes32(""), s_configDigestExec, s_configDigestExec]; - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain[] memory reports = _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); @@ -2222,7 +2256,7 @@ contract EVM2EVMMultiOffRamp_execute is EVM2EVMMultiOffRampSetup { bytes32[3] memory reportContext = [s_configDigestExec, s_configDigestExec, s_configDigestExec]; - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); Internal.ExecutionReportSingleChain[] memory reports = _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol index 985086f7be..b8217808de 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol @@ -326,7 +326,7 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba return message; } - function _generateBasicMessages( + function _generateSingleBasicMessage( uint64 sourceChainSelector, address onRamp ) internal view returns (Internal.EVM2EVMMessage[] memory) { diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol index c97e8b924d..defe7a62d3 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol @@ -189,9 +189,9 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { error PausedError(); function test_SingleMessageNoTokens_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -202,7 +202,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -212,12 +212,12 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { } function test_SingleMessageNoTokensUnordered_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); messages[0].nonce = 0; messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -232,7 +232,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -245,7 +245,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { } function test_ReceiverError_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); bytes memory realError1 = new bytes(2); realError1[0] = 0xbe; @@ -256,7 +256,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.FAILURE, @@ -272,14 +272,14 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { } function test_StrictUntouchedToSuccess_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); messages[0].strict = true; messages[0].receiver = address(s_receiver); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); // Nonce should increment on a strict untouched -> success. @@ -289,13 +289,13 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { } function test_SkippedIncorrectNonce_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); messages[0].nonce++; messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit SkippedIncorrectNonce(messages[0].nonce, messages[0].sender); + emit EVM2EVMOffRamp.SkippedIncorrectNonce(messages[0].nonce, messages[0].sender); s_offRamp.execute(_generateReportFromMessages(messages), new uint256[](0)); } @@ -307,21 +307,21 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { messages[1].messageId = Internal._hash(messages[1], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); vm.expectEmit(); - emit SkippedIncorrectNonce(messages[1].nonce, messages[1].sender); + emit EVM2EVMOffRamp.SkippedIncorrectNonce(messages[1].nonce, messages[1].sender); s_offRamp.execute(_generateReportFromMessages(messages), new uint256[](0)); } function test__execute_SkippedAlreadyExecutedMessage_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -334,12 +334,12 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { } function test__execute_SkippedAlreadyExecutedMessageUnordered_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); messages[0].nonce = 0; messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -354,13 +354,13 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { // Send a message to a contract that does not implement the CCIPReceiver interface // This should execute successfully. function test_SingleMessageToNonCCIPReceiver_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); MaybeRevertMessageReceiverNo165 newReceiver = new MaybeRevertMessageReceiverNo165(true); messages[0].receiver = address(newReceiver); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -369,10 +369,10 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { function test_SingleMessagesNoTokensSuccess_gas() public { vm.pauseGasMetering(); - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -390,12 +390,12 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { messages[1].messageId = Internal._hash(messages[1], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[1].sequenceNumber, messages[1].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -412,12 +412,12 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { messages[1].messageId = Internal._hash(messages[1], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[1].sequenceNumber, messages[1].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -443,7 +443,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { messages[i].messageId = Internal._hash(messages[i], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[i].sequenceNumber, messages[i].messageId, Internal.MessageExecutionState.SUCCESS, "" ); } @@ -477,7 +477,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { messages[1].messageId = Internal._hash(messages[1], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.FAILURE, @@ -493,7 +493,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { // Reverts function test_InvalidMessageId_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); messages[0].nonce++; // MessageID no longer matches hash. Internal.ExecutionReport memory executionReport = _generateReportFromMessages(messages); @@ -519,7 +519,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { } function test_UnexpectedTokenData_Revert() public { - Internal.ExecutionReport memory report = _generateReportFromMessages(_generateBasicMessages()); + Internal.ExecutionReport memory report = _generateReportFromMessages(_generateSingleBasicMessage()); report.offchainTokenData = new bytes[][](report.messages.length + 1); vm.expectRevert(EVM2EVMOffRamp.UnexpectedTokenData.selector); @@ -544,7 +544,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { vm.mockCall(address(s_mockCommitStore), abi.encodeWithSelector(ICommitStore.verify.selector), abi.encode(0)); vm.expectRevert(EVM2EVMOffRamp.RootNotCommitted.selector); - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); s_offRamp.execute(_generateReportFromMessages(messages), _getGasLimitsFromMessages(messages)); vm.clearMockedCalls(); } @@ -555,13 +555,13 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { ); vm.expectRevert(EVM2EVMOffRamp.ManualExecutionNotYetEnabled.selector); - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); s_offRamp.execute(_generateReportFromMessages(messages), _getGasLimitsFromMessages(messages)); vm.clearMockedCalls(); } function test_InvalidSourceChain_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); messages[0].sourceChainSelector = SOURCE_CHAIN_SELECTOR + 1; messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); @@ -570,7 +570,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { } function test_UnsupportedNumberOfTokens_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); Client.EVMTokenAmount[] memory newTokens = new Client.EVMTokenAmount[](MAX_TOKENS_LENGTH + 1); messages[0].tokenAmounts = newTokens; messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); @@ -583,7 +583,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { } function test_TokenDataMismatch_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); Internal.ExecutionReport memory report = _generateReportFromMessages(messages); report.offchainTokenData[0] = new bytes[](messages[0].tokenAmounts.length + 1); @@ -593,7 +593,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { } function test_MessageTooLarge_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); messages[0].data = new bytes(MAX_DATA_SIZE + 1); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); @@ -605,7 +605,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { } function test_RouterYULCall_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); // gas limit too high, Router's external call should revert messages[0].gasLimit = 1e36; @@ -623,7 +623,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { } function test_RetryFailedMessageWithoutManualExecution_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); bytes memory realError1 = new bytes(2); realError1[0] = 0xbe; @@ -634,7 +634,7 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup { messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.FAILURE, @@ -662,9 +662,9 @@ contract EVM2EVMOffRamp_execute_upgrade is EVM2EVMOffRampSetup { } function test_V2_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -672,7 +672,7 @@ contract EVM2EVMOffRamp_execute_upgrade is EVM2EVMOffRampSetup { } function test_V2SenderNoncesReadsPreviousRamp_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); uint64 startNonce = s_offRamp.getSenderNonce(messages[0].sender); for (uint64 i = 1; i < 4; ++i) { @@ -687,9 +687,9 @@ contract EVM2EVMOffRamp_execute_upgrade is EVM2EVMOffRampSetup { } function test_V2NonceStartsAtV1Nonce_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -703,7 +703,7 @@ contract EVM2EVMOffRamp_execute_upgrade is EVM2EVMOffRampSetup { messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -715,7 +715,7 @@ contract EVM2EVMOffRamp_execute_upgrade is EVM2EVMOffRampSetup { messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -724,9 +724,9 @@ contract EVM2EVMOffRamp_execute_upgrade is EVM2EVMOffRampSetup { } function test_V2NonceNewSenderStartsAtZero_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -737,7 +737,7 @@ contract EVM2EVMOffRamp_execute_upgrade is EVM2EVMOffRampSetup { messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -748,7 +748,7 @@ contract EVM2EVMOffRamp_execute_upgrade is EVM2EVMOffRampSetup { } function test_V2OffRampNonceSkipsIfMsgInFlight_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); address newSender = address(1234567); messages[0].sender = newSender; @@ -769,7 +769,7 @@ contract EVM2EVMOffRamp_execute_upgrade is EVM2EVMOffRampSetup { // previous offramp executes msg and increases nonce vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); s_prevOffRamp.execute(_generateReportFromMessages(messages), new uint256[](0)); @@ -780,7 +780,7 @@ contract EVM2EVMOffRamp_execute_upgrade is EVM2EVMOffRampSetup { // new offramp is able to execute vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -922,11 +922,11 @@ contract EVM2EVMOffRamp_executeSingleMessage is EVM2EVMOffRampSetup { contract EVM2EVMOffRamp__report is EVM2EVMOffRampSetup { // Asserts that execute completes function test_Report_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); Internal.ExecutionReport memory report = _generateReportFromMessages(messages); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); s_offRamp.report(abi.encode(report)); @@ -935,7 +935,7 @@ contract EVM2EVMOffRamp__report is EVM2EVMOffRampSetup { contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { function test_ManualExec_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); messages[0].receiver = address(s_reverting_receiver); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); s_offRamp.execute(_generateReportFromMessages(messages), new uint256[](0)); @@ -943,14 +943,39 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { s_reverting_receiver.setRevert(false); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); s_offRamp.manuallyExecute(_generateReportFromMessages(messages), new uint256[](messages.length)); } + function test_manuallyExecute_DoesNotRevertIfUntouched_Success() public { + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); + messages[0].receiver = address(s_reverting_receiver); + messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); + + assertEq(messages[0].nonce - 1, s_offRamp.getSenderNonce(messages[0].sender)); + + s_reverting_receiver.setRevert(true); + + vm.expectEmit(); + emit EVM2EVMOffRamp.ExecutionStateChanged( + messages[0].sequenceNumber, + messages[0].messageId, + Internal.MessageExecutionState.FAILURE, + abi.encodeWithSelector( + EVM2EVMOffRamp.ReceiverError.selector, + abi.encodeWithSelector(MaybeRevertMessageReceiver.CustomError.selector, "") + ) + ); + + s_offRamp.manuallyExecute(_generateReportFromMessages(messages), new uint256[](1)); + + assertEq(messages[0].nonce, s_offRamp.getSenderNonce(messages[0].sender)); + } + function test_ManualExecWithGasOverride_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); messages[0].receiver = address(s_reverting_receiver); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); s_offRamp.execute(_generateReportFromMessages(messages), new uint256[](0)); @@ -958,7 +983,7 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { s_reverting_receiver.setRevert(false); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); @@ -969,13 +994,13 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { } function test_LowGasLimitManualExec_Success() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); messages[0].gasLimit = 1; messages[0].receiver = address(new ConformingReceiver(address(s_destRouter), s_destFeeToken)); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.FAILURE, @@ -990,14 +1015,14 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { emit MaybeRevertMessageReceiver.MessageReceived(); vm.expectEmit(); - emit ExecutionStateChanged( + emit EVM2EVMOffRamp.ExecutionStateChanged( messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, "" ); s_offRamp.manuallyExecute(_generateReportFromMessages(messages), gasLimitOverrides); } function test_ManualExecForkedChain_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); Internal.ExecutionReport memory report = _generateReportFromMessages(messages); uint256 chain1 = block.chainid; @@ -1009,7 +1034,7 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { } function test_ManualExecGasLimitMismatch_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); vm.expectRevert(EVM2EVMOffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(_generateReportFromMessages(messages), new uint256[](0)); @@ -1022,7 +1047,7 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { } function test_ManualExecInvalidGasLimit_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); uint256[] memory gasLimits = _getGasLimitsFromMessages(messages); gasLimits[0]--; @@ -1032,7 +1057,7 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { } function test_ManualExecFailedTx_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); messages[0].receiver = address(s_reverting_receiver); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); @@ -1065,7 +1090,7 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { // For this test any message will be flagged as correct by the // commitStore. In a real scenario the abuser would have to actually // send the message that they want to replay. - Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(); + Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(); messages[0].tokenAmounts = new Client.EVMTokenAmount[](1); messages[0].tokenAmounts[0] = Client.EVMTokenAmount({token: s_sourceFeeToken, amount: tokenAmount}); messages[0].receiver = address(receiver); @@ -1087,14 +1112,15 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { // The first entry should be fine and triggers the second entry. This one fails // but since it's an inner tx of the first one it is caught in the try-catch. - // Since this is manual exec, the entire tx fails on any failure. - vm.expectRevert( + // This means the first tx is marked `FAILURE` with the error message of the second tx. + vm.expectEmit(); + emit EVM2EVMOffRamp.ExecutionStateChanged( + messages[0].sequenceNumber, + messages[0].messageId, + Internal.MessageExecutionState.FAILURE, abi.encodeWithSelector( - EVM2EVMOffRamp.ExecutionError.selector, - abi.encodeWithSelector( - EVM2EVMOffRamp.ReceiverError.selector, - abi.encodeWithSelector(EVM2EVMOffRamp.AlreadyExecuted.selector, messages[0].sequenceNumber) - ) + EVM2EVMOffRamp.ReceiverError.selector, + abi.encodeWithSelector(EVM2EVMOffRamp.AlreadyExecuted.selector, messages[0].sequenceNumber) ) ); diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRampSetup.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRampSetup.t.sol index 22c0eea8a7..053869b88a 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRampSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRampSetup.t.sol @@ -32,11 +32,6 @@ contract EVM2EVMOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSetup { EVM2EVMOffRampHelper internal s_offRamp; address internal s_sourceTokenPool = makeAddr("sourceTokenPool"); - event ExecutionStateChanged( - uint64 indexed sequenceNumber, bytes32 indexed messageId, Internal.MessageExecutionState state, bytes returnData - ); - event SkippedIncorrectNonce(uint64 indexed nonce, address indexed sender); - function setUp() public virtual override(TokenSetup, PriceRegistrySetup, OCR2BaseSetup) { TokenSetup.setUp(); PriceRegistrySetup.setUp(); @@ -190,7 +185,7 @@ contract EVM2EVMOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSetup { return message; } - function _generateBasicMessages() internal view returns (Internal.EVM2EVMMessage[] memory) { + function _generateSingleBasicMessage() internal view returns (Internal.EVM2EVMMessage[] memory) { Internal.EVM2EVMMessage[] memory messages = new Internal.EVM2EVMMessage[](1); messages[0] = _generateAny2EVMMessageNoTokens(1); return messages; diff --git a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol index 219a63fbfe..5e29e945d4 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol @@ -107,17 +107,6 @@ contract EVM2EVMMultiOnRamp_constructor is EVM2EVMMultiOnRampSetup { } function test_Constructor_InvalidConfigLinkChainSelectorEqZero_Revert() public { - EVM2EVMMultiOnRamp.DynamicConfig memory dynamicConfig = - _generateDynamicMultiOnRampConfig(address(s_sourceRouter), address(s_priceRegistry)); - EVM2EVMMultiOnRamp.DestChainConfigArgs[] memory destChainConfigArgs = _generateDestChainConfigArgs(); - EVM2EVMMultiOnRamp.StaticConfig memory staticConfig = EVM2EVMMultiOnRamp.StaticConfig({ - linkToken: s_sourceTokens[0], - chainSelector: 0, - maxFeeJuelsPerMsg: MAX_NOP_FEES_JUELS, - rmnProxy: address(s_mockRMN), - tokenAdminRegistry: address(s_tokenAdminRegistry) - }); - vm.expectRevert(EVM2EVMMultiOnRamp.InvalidConfig.selector); new EVM2EVMMultiOnRampHelper( EVM2EVMMultiOnRamp.StaticConfig({ diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go index b82392aadb..0ee7005184 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go @@ -161,7 +161,7 @@ type MultiOCR3BaseOCRConfigArgs struct { var EVM2EVMMultiOffRampMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"}],\"name\":\"InvalidInterval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRoot\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeavesCannotBeEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PausedError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StaleCommitReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"StaticConfigCannotBeChanged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroChainSelectorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"RootRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfig\",\"name\":\"sourceConfig\",\"type\":\"tuple\"}],\"name\":\"SourceChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applySourceChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestPriceEpochAndRound\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"getMerkleRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"isBlessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"isUnpausedAndNotCursed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"uniqueReports\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"}],\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"name\":\"configInfo\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"name\":\"ocrConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"reports\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[][]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[][]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.UnblessedRoot[]\",\"name\":\"rootToReset\",\"type\":\"tuple[]\"}],\"name\":\"resetUnblessedRoots\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint40\",\"name\":\"latestPriceEpochAndRound\",\"type\":\"uint40\"}],\"name\":\"setLatestPriceEpochAndRound\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"uniqueReports\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x610100604052600b805460ff60281b191690553480156200001f57600080fd5b5060405162007a8b38038062007a8b833981016040819052620000429162000608565b3380600081620000995760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000cc57620000cc8162000181565b5050466080525060208201516001600160a01b03161580620000f9575060408201516001600160a01b0316155b1562000118576040516342bcdf7f60e11b815260040160405180910390fd5b81516001600160401b0316600003620001445760405163c656089560e01b815260040160405180910390fd5b81516001600160401b031660a05260208201516001600160a01b0390811660c05260408301511660e05262000179816200022c565b505062000790565b336001600160a01b03821603620001db5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000090565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b8151811015620004dc5760008282815181106200025057620002506200077a565b60200260200101519050600081600001519050806001600160401b03166000036200028e5760405163c656089560e01b815260040160405180910390fd5b60608201516001600160a01b0316620002ba576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b038116600090815260076020526040902060018101546001600160a01b0316620003c0576200031c8284606001517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3620004e060201b60201c565b600282015560608301516001820180546001600160a01b039283166001600160a01b03199091161790556040808501518354610100600160481b03199190931669010000000000000000000216610100600160e81b031990921691909117610100178255516001600160401b03831681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a16200042f565b606083015160018201546001600160a01b03908116911614158062000404575060408301518154690100000000000000000090046001600160a01b03908116911614155b156200042f5760405163c39a620560e01b81526001600160401b038316600482015260240162000090565b6020830151815490151560ff199091161781556040516001600160401b038316907fa73c588738263db34ef8c1942db8f99559bc6696f6a812d42e76bafb4c0e8d3090620004c5908490815460ff811615158252600881901c6001600160401b0316602083015260481c6001600160a01b0390811660408301526001830154166060820152600290910154608082015260a00190565b60405180910390a25050508060010190506200022f565b5050565b60a0805160408051602081018590526001600160401b0380881692820192909252911660608201526001600160a01b0384166080820152600091016040516020818303038152906040528051906020012090509392505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156200057557620005756200053a565b60405290565b604051608081016001600160401b03811182821017156200057557620005756200053a565b604051601f8201601f191681016001600160401b0381118282101715620005cb57620005cb6200053a565b604052919050565b80516001600160401b0381168114620005eb57600080fd5b919050565b80516001600160a01b0381168114620005eb57600080fd5b6000808284036080808212156200061e57600080fd5b6060808312156200062e57600080fd5b6200063862000550565b92506200064586620005d3565b8352602062000656818801620005f0565b8185015260406200066a60408901620005f0565b604086015260608801519496506001600160401b03808611156200068d57600080fd5b858901955089601f870112620006a257600080fd5b855181811115620006b757620006b76200053a565b620006c7848260051b01620005a0565b818152848101925060079190911b87018401908b821115620006e857600080fd5b968401965b81881015620007685786888d031215620007075760008081fd5b620007116200057b565b6200071c89620005d3565b8152858901518015158114620007325760008081fd5b8187015262000743898601620005f0565b8582015262000754878a01620005f0565b8188015283529686019691840191620006ed565b80985050505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e05161726d6200081e6000396000818161026c01528181610a0b0152612db3015260008181610230015281816109e401528181611084015281816117c501528181611ae30152613597015260008181610200015281816109c00152613f49015260008181610bd301528181610c1f01528181611f1e0152611f6a015261726d6000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80637f63b711116100f9578063ccd37ba311610097578063e9d68a8e11610071578063e9d68a8e146105f0578063f2fde38b14610718578063f52121a51461072b578063ff888fb11461073e57600080fd5b8063ccd37ba314610585578063d2a15d35146105ca578063d783efe7146105dd57600080fd5b80638b364334116100d35780638b364334146105175780638da5cb5b1461052a57806396c62bcc14610552578063c673e5841461056557600080fd5b80637f63b711146104ee5780638456cb591461050157806385572ffb1461050957600080fd5b8063311cd513116101665780635c975abb116101405780635c975abb146103805780635e36480c146103a05780637437ff9f146103c057806379ba5097146104e657600080fd5b8063311cd513146103525780633f4ba83a14610365578063542625af1461036d57600080fd5b8063181f5a7711610197578063181f5a77146102e357806329b980e41461032c5780632d04ab761461033f57600080fd5b806305a754ec146101be57806306285c69146101d357806310c374ed146102bf575b600080fd5b6101d16101cc36600461527e565b610751565b005b6102a9604080516060810182526000808252602082018190529181019190915260405180606001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516102b69190615348565b60405180910390f35b600b5464ffffffffff165b60405167ffffffffffffffff90911681526020016102b6565b61031f6040518060400160405280601d81526020017f45564d3245564d4d756c74694f666652616d7020312e362e302d64657600000081525081565b6040516102b691906153e0565b6101d161033a3660046153f3565b610a6a565b6101d161034d3660046154b2565b610aaa565b6101d1610360366004615565565b610b37565b6101d1610b6a565b6101d161037b366004615b62565b610bd0565b600b5465010000000000900460ff165b60405190151581526020016102b6565b6103b36103ae366004615c8d565b610dfd565b6040516102b69190615d09565b6104d96040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915250604080516101008101825260045473ffffffffffffffffffffffffffffffffffffffff808216835263ffffffff74010000000000000000000000000000000000000000830481166020850152780100000000000000000000000000000000000000000000000083048116948401949094527c01000000000000000000000000000000000000000000000000000000009091048316606083015260055461ffff8116608084015262010000810490931660a08301526601000000000000909204821660c082015260065490911660e082015290565b6040516102b69190615dc6565b6101d1610e91565b6101d16104fc366004615dd5565b610f8e565b6101d1610fa2565b6101d16101b9366004615eb9565b6102ca610525366004615ef4565b61100a565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102b6565b610390610560366004615f22565b611020565b610578610573366004615f50565b61110d565b6040516102b69190615fbd565b6105bc61059336600461603f565b67ffffffffffffffff919091166000908152600a60209081526040808320938352929052205490565b6040519081526020016102b6565b6101d16105d836600461606b565b61129e565b6101d16105eb366004616148565b611358565b6106ae6105fe366004615f22565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091525067ffffffffffffffff908116600090815260076020908152604091829020825160a081018452815460ff81161515825261010081049095169281019290925273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009094048416928201929092526001820154909216606083015260020154608082015290565b6040516102b69190600060a08201905082511515825267ffffffffffffffff6020840151166020830152604083015173ffffffffffffffffffffffffffffffffffffffff808216604085015280606086015116606085015250506080830151608083015292915050565b6101d16107263660046162a8565b61139a565b6101d16107393660046162c5565b6113ab565b61039061074c366004616329565b611762565b610759611830565b60e081015173ffffffffffffffffffffffffffffffffffffffff166107aa576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff166107f8576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516004805460208085015160408087015160608089015163ffffffff9081167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9382167801000000000000000000000000000000000000000000000000029390931677ffffffffffffffffffffffffffffffffffffffffffffffff95821674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090981673ffffffffffffffffffffffffffffffffffffffff9a8b16179790971794909416959095171790945560808601516005805460a089015160c08a015189166601000000000000027fffffffffffff0000000000000000000000000000000000000000ffffffffffff9190951662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090921661ffff90941693909317179190911691909117905560e0850151600680549186167fffffffffffffffffffffffff0000000000000000000000000000000000000000929092169190911790558251918201835267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682527f00000000000000000000000000000000000000000000000000000000000000008416908201527f000000000000000000000000000000000000000000000000000000000000000090921682820152517ff778ca28f5b9f37b5d23ffa5357592348ea60ec4e42b1dce5c857a5a65b276f791610a5f918490616342565b60405180910390a150565b610a72611830565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff92909216919091179055565b610ab9878760208b01356118b3565b610b2d600089898989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152508a9250611dda915050565b5050505050505050565b610b41828261222c565b604080516000808252602082019092529050610b64600185858585866000611dda565b50505050565b610b72611830565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b467f000000000000000000000000000000000000000000000000000000000000000014610c60576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff461660248201526044015b60405180910390fd5b815181518114610c9c576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610ded576000848281518110610cbb57610cbb616398565b60200260200101519050600081602001515190506000858481518110610ce357610ce3616398565b6020026020010151905080518214610d27576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82811015610dde576000828281518110610d4657610d46616398565b6020026020010151905080600014158015610d81575084602001518281518110610d7257610d72616398565b60200260200101516080015181105b15610dd55784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024810183905260448101829052606401610c57565b50600101610d2a565b50505050806001019050610c9f565b50610df88383612268565b505050565b6000610e0b600160046163f6565b6002610e18608085616438565b67ffffffffffffffff16610e2c919061645f565b67ffffffffffffffff8516600090815260096020526040812090610e51608087616476565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c166003811115610e8857610e88615cc6565b90505b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c57565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f96611830565b610f9f81612318565b50565b610faa611830565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff16650100000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610bc6565b60008061101784846126b6565b50949350505050565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608083901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa1580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef919061649d565b158015610e8b5750600b5465010000000000900460ff161592915050565b6111586040805161010081019091526000606082018181526080830182905260a0830182905260c0830182905260e08301919091528190815260200160608152602001606081525090565b60ff8083166000908152600260208181526040928390208351610100808201865282546060830190815260018401548089166080850152918204881660a08401526201000082048816151560c08401526301000000909104909616151560e08201529485529182018054845181840281018401909552808552929385830193909283018282801561121f57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111f4575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561128e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611263575b5050505050815250509050919050565b6112a6611830565b60005b81811015610df85760008383838181106112c5576112c5616398565b9050604002018036038101906112db91906164ba565b90506112ea8160200151611762565b61134f57805167ffffffffffffffff166000908152600a602090815260408083208285018051855290835281842093909355915191519182527f202f1139a3e334b6056064c0e9b19fd07e44a88d8f6e5ded571b24cf8c371f12910160405180910390a15b506001016112a9565b611360611830565b60005b81518110156113965761138e82828151811061138157611381616398565b60200260200101516127ee565b600101611363565b5050565b6113a2611830565b610f9f81612c26565b3330146113e4576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611421565b60408051808201909152600080825260208201528152602001906001900390816113fa5790505b5061014084015151909150156114bc576101408301516040805160608101909152602085015173ffffffffffffffffffffffffffffffffffffffff1660808201526114b991908060a0810160408051601f19818403018152918152908252875167ffffffffffffffff1660208301528781015173ffffffffffffffffffffffffffffffffffffffff1691015261016086015185612d1b565b90505b60006114c88483613263565b6005549091506601000000000000900473ffffffffffffffffffffffffffffffffffffffff1680156115d9576040517fa219f6e500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063a219f6e5906115469085906004016165af565b600060405180830381600087803b15801561156057600080fd5b505af1925050508015611571575060015b6115d9573d80801561159f576040519150601f19603f3d011682016040523d82523d6000602084013e6115a4565b606091505b50806040517f09c25325000000000000000000000000000000000000000000000000000000008152600401610c5791906153e0565b610120850151511580156115ef57506080850151155b806116135750604085015173ffffffffffffffffffffffffffffffffffffffff163b155b806116605750604085015161165e9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb00000000000000000000000000000000000000000000000000000000613313565b155b1561166c575050505050565b60048054608087015160408089015190517f3cf97983000000000000000000000000000000000000000000000000000000008152600094859473ffffffffffffffffffffffffffffffffffffffff1693633cf97983936116d4938a93611388939291016165c2565b6000604051808303816000875af11580156116f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261171b9190810190616650565b50915091508161175957806040517f0a8d6e8c000000000000000000000000000000000000000000000000000000008152600401610c5791906153e0565b50505050505050565b6040805180820182523081526020810183815291517f4d616771000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9081166004830152915160248201526000917f00000000000000000000000000000000000000000000000000000000000000001690634d61677190604401602060405180830381865afa15801561180c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8b919061649d565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c57565b565b600b5465010000000000900460ff16156118f9576040517feced32bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061190783850185616837565b8051515190915015158061192057508051602001515115155b15611a4957600b5464ffffffffff80841691161015611a0a57600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff841617905560065481516040517f3937306f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921691633937306f916119c091600401616a96565b600060405180830381600087803b1580156119da57600080fd5b505af11580156119ee573d6000803e3d6000fd5b50505050806020015151600003611a055750505050565b611a49565b806020015151600003611a49576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b816020015151811015611d9c57600082602001518281518110611a7157611a71616398565b602090810291909101015180516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608083901b1660048201529192509073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa158015611b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4e919061649d565b15611b91576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610c57565b67ffffffffffffffff81166000908152600760205260409020805460ff16611bf1576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c57565b6020830151518154610100900467ffffffffffffffff9081169116141580611c30575060208084015190810151905167ffffffffffffffff9182169116115b15611c7057825160208401516040517feefb0cac000000000000000000000000000000000000000000000000000000008152610c57929190600401616aa9565b6040830151611cab576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825167ffffffffffffffff166000908152600a6020908152604080832081870151845290915290205415611d2457825160408085015190517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90921660048301526024820152604401610c57565b6020808401510151611d37906001616ade565b81547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff92831602179091558251166000908152600a602090815260408083209481015183529390529190912042905550600101611a4c565b507f3a3950e13dd607cc37980db0ef14266c40d2bba9c01b2e44bfe549808883095d81604051611dcc9190616b06565b60405180910390a150505050565b60ff8781166000908152600260209081526040808320815160a08101835281548152600190910154808616938201939093526101008304851691810191909152620100008204841615156060820152630100000090910490921615156080830152873590611e498760a4616ba3565b9050826080015115611e91578451611e6290602061645f565b8651611e6f90602061645f565b611e7a9060a0616ba3565b611e849190616ba3565b611e8e9082616ba3565b90505b368114611ed3576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610c57565b5081518114611f1b5781516040517f93df584c000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610c57565b467f000000000000000000000000000000000000000000000000000000000000000014611f9c576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610c57565b60ff808a1660009081526003602090815260408083203384528252808320815180830190925280548086168352939491939092840191610100909104166002811115611fea57611fea615cc6565b6002811115611ffb57611ffb615cc6565b905250905060028160200151600281111561201857612018615cc6565b1480156120795750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff168154811061205457612054616398565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b6120af576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b508160800151156121d75760008260600151156120fb576002836020015184604001516120dc9190616bb6565b6120e69190616bcf565b6120f1906001616bb6565b60ff169050612111565b602083015161210b906001616bb6565b60ff1690505b8086511461214b576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451865114612186576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060008787604051612199929190616bf1565b6040519081900381206121b0918b90602001616c01565b6040516020818303038152906040528051906020012090506121d58a8288888861332f565b505b6040805182815260208a81013560081c63ffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b61139661223b82840184616c15565b6040805160008082526020820190925290612266565b60608152602001906001900390816122515790505b505b81516000036122a2576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b8451811015612311576123098582815181106122d7576122d7616398565b602002602001015184612303578583815181106122f6576122f6616398565b6020026020010151613549565b83613549565b6001016122b9565b5050505050565b60005b815181101561139657600082828151811061233857612338616398565b602002602001015190506000816000015190508067ffffffffffffffff1660000361238f576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606082015173ffffffffffffffffffffffffffffffffffffffff166123e0576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600760205260409020600181015473ffffffffffffffffffffffffffffffffffffffff1661253e576124478284606001517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3613f43565b6002820155606083015160018201805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905560408085015183547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff91909316690100000000000000000002167fffffff00000000000000000000000000000000000000000000000000000000ff909216919091176101001782555167ffffffffffffffff831681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a16125de565b6060830151600182015473ffffffffffffffffffffffffffffffffffffffff908116911614158061259b5750604083015181546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff908116911614155b156125de576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c57565b602083015181549015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911617815560405167ffffffffffffffff8316907fa73c588738263db34ef8c1942db8f99559bc6696f6a812d42e76bafb4c0e8d30906126a0908490815460ff811615158252600881901c67ffffffffffffffff16602083015260481c73ffffffffffffffffffffffffffffffffffffffff90811660408301526001830154166060820152600290910154608082015260a00190565b60405180910390a250505080600101905061231b565b67ffffffffffffffff808316600090815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205490918291168082036127e05767ffffffffffffffff85166000908152600760205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1680156127de576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015282169063856c824790602401602060405180830381865afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d19190616c4a565b60019350935050506127e7565b505b9150600090505b9250929050565b806040015160ff166000036128325760006040517f367f56a2000000000000000000000000000000000000000000000000000000008152600401610c579190616c67565b60208082015160ff808216600090815260029093526040832060018101549293909283921690036128d2576060840151600182018054608087015115156301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff9315156201000002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9091161791909117905561294c565b6060840151600182015460ff6201000090910416151590151514158061291057506080840151600182015460ff630100000090910416151590151514155b1561294c576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff84166004820152602401610c57565b60c08401518051601f60ff821611156129945760016040517f367f56a2000000000000000000000000000000000000000000000000000000008152600401610c579190616c67565b612a0785856003018054806020026020016040519081016040528092919081815260200182805480156129fd57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116129d2575b5050505050613fd3565b856080015115612b7557612a8285856002018054806020026020016040519081016040528092919081815260200182805480156129fd5760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116129d2575050505050613fd3565b60a08601518051612a9c9060028701906020840190615033565b5080516001850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff841690810291909117909155601f1015612b155760026040517f367f56a2000000000000000000000000000000000000000000000000000000008152600401610c579190616c67565b6040880151612b25906003616c81565b60ff168160ff1611612b665760036040517f367f56a2000000000000000000000000000000000000000000000000000000008152600401610c579190616c67565b612b7287836001614066565b50505b612b8185836002614066565b8151612b969060038601906020850190615033565b506040868101516001850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316179055875180865560c089015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f54793612c0d938a939260028b01929190616c9d565b60405180910390a1612c1e85614261565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff821603612ca5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c57565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8360005b8551811015611017576000848281518110612d3c57612d3c616398565b6020026020010151806020019051810190612d579190616d30565b90506000612d688260200151614294565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612dfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1e9190616de5565b905073ffffffffffffffffffffffffffffffffffffffff81161580612e805750612e7e73ffffffffffffffffffffffffffffffffffffffff82167faff2afbf00000000000000000000000000000000000000000000000000000000613313565b155b15612ecf576040517fae9b4ce900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610c57565b60008061303c633907753760e01b6040518061010001604052808d6000015181526020018d6020015167ffffffffffffffff1681526020018d6040015173ffffffffffffffffffffffffffffffffffffffff1681526020018e8a81518110612f3957612f39616398565b60200260200101516020015181526020018773ffffffffffffffffffffffffffffffffffffffff16815260200188600001518152602001886040015181526020018b8a81518110612f8c57612f8c616398565b6020026020010151815250604051602401612fa79190616e02565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600454859063ffffffff7c01000000000000000000000000000000000000000000000000000000009091041661138860846142ef565b50915091508161307a57806040517fe1cd5509000000000000000000000000000000000000000000000000000000008152600401610c5791906153e0565b80516020146130c25780516040517f78ef8024000000000000000000000000000000000000000000000000000000008152602060048201526024810191909152604401610c57565b6000818060200190518101906130d89190616ef3565b60408c810151815173ffffffffffffffffffffffffffffffffffffffff909116602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526004549192506131979187907801000000000000000000000000000000000000000000000000900463ffffffff1661138860846142ef565b509093509150826131d657816040517fe1cd5509000000000000000000000000000000000000000000000000000000008152600401610c5791906153e0565b848888815181106131e9576131e9616398565b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508088888151811061323a5761323a616398565b60200260200101516020018181525050505050505050806001019050612d1f565b949350505050565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff16815260200184602001516040516020016132e8919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b600061331e83614415565b8015610e885750610e888383614479565b6133376150b9565b835160005b81811015610b2d57600060018886846020811061335b5761335b616398565b61336891901a601b616bb6565b89858151811061337a5761337a616398565b602002602001015189868151811061339457613394616398565b6020026020010151604051600081526020016040526040516133d2949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156133f4573d6000803e3d6000fd5b505060408051601f1981015160ff808e1660009081526003602090815285822073ffffffffffffffffffffffffffffffffffffffff85168352815285822085870190965285548084168652939750909550929392840191610100900416600281111561346257613462615cc6565b600281111561347357613473615cc6565b905250905060018160200151600281111561349057613490615cc6565b146134c7576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051859060ff16601f81106134de576134de616398565b60200201511561351a576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600185826000015160ff16601f811061353557613535616398565b91151560209092020152505060010161333c565b81516040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608082901b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa1580156135f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613617919061649d565b1561365a576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610c57565b602083015151600081900361369a576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83604001515181146136d8576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff82166000908152600760205260409020805460ff16613738576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610c57565b60008267ffffffffffffffff811115613753576137536150ed565b60405190808252806020026020018201604052801561377c578160200160208202803683370190505b50905060005b83811015613841576000876020015182815181106137a2576137a2616398565b602002602001015190506137ba818560020154614548565b8383815181106137cc576137cc616398565b6020026020010181815250508061018001518383815181106137f0576137f0616398565b602002602001015114613838578061018001516040517f345039be000000000000000000000000000000000000000000000000000000008152600401610c5791815260200190565b50600101613782565b506000613858858389606001518a608001516146b1565b9050806000036138a0576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610c57565b8551151560005b85811015613f38576000896020015182815181106138c7576138c7616398565b6020026020010151905060006138e1898360600151610dfd565b905060028160038111156138f7576138f7615cc6565b0361394d5760608201516040805167ffffffffffffffff808d16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a15050613f30565b600081600381111561396157613961615cc6565b148061397e5750600381600381111561397c5761397c615cc6565b145b6139ce5760608201516040517f25507e7f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c1660048301529091166024820152604401610c57565b8315613aaf5760045460009074010000000000000000000000000000000000000000900463ffffffff16613a0287426163f6565b1190508080613a2257506003826003811115613a2057613a20615cc6565b145b613a64576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8b166004820152602401610c57565b8a8481518110613a7657613a76616398565b6020026020010151600014613aa9578a8481518110613a9757613a97616398565b60200260200101518360800181815250505b50613b14565b6000816003811115613ac357613ac3615cc6565b14613b145760608201516040517f3ef2a99c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c1660048301529091166024820152604401610c57565b600080613b258b85602001516126b6565b915091508015613c455760c084015167ffffffffffffffff16613b49836001616ade565b67ffffffffffffffff1614613bd95760c084015160208501516040517f5444a3301c7c42dd164cbf6ba4b72bf02504f86c049b06a27fc2b662e334bdbd92613bc8928f9267ffffffffffffffff938416815291909216602082015273ffffffffffffffffffffffffffffffffffffffff91909116604082015260600190565b60405180910390a150505050613f30565b67ffffffffffffffff8b811660009081526008602090815260408083208883015173ffffffffffffffffffffffffffffffffffffffff168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169184169190911790555b6000836003811115613c5957613c59615cc6565b03613cf75760c084015167ffffffffffffffff16613c78836001616ade565b67ffffffffffffffff1614613cf75760c084015160208501516040517f852dc8e405695593e311bd83991cf39b14a328f304935eac6d3d55617f911d8992613bc8928f9267ffffffffffffffff938416815291909216602082015273ffffffffffffffffffffffffffffffffffffffff91909116604082015260600190565b60008d604001518681518110613d0f57613d0f616398565b60200260200101519050613d3d8561018001518d87606001518861014001515189610120015151865161474e565b613d4d8c86606001516001614856565b600080613d5a8784614934565b91509150613d6d8e886060015184614856565b888015613d8b57506003826003811115613d8957613d89615cc6565b145b15613dcb57866101800151816040517f2b11b8d9000000000000000000000000000000000000000000000000000000008152600401610c57929190616f0c565b6003826003811115613ddf57613ddf615cc6565b14158015613dff57506002826003811115613dfc57613dfc615cc6565b14155b15613e40578d8760600151836040517f926c5a3e000000000000000000000000000000000000000000000000000000008152600401610c5793929190616f25565b6000866003811115613e5457613e54615cc6565b03613ecf5767ffffffffffffffff808f1660009081526008602090815260408083208b83015173ffffffffffffffffffffffffffffffffffffffff168452909152812080549092169190613ea783616f4b565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b866101800151876060015167ffffffffffffffff168f67ffffffffffffffff167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df28585604051613f20929190616f72565b60405180910390a4505050505050505b6001016138a7565b505050505050505050565b600081847f000000000000000000000000000000000000000000000000000000000000000085604051602001613fb3949392919093845267ffffffffffffffff92831660208501529116604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b6040516020818303038152906040528051906020012090505b9392505050565b60005b8151811015610df85760ff83166000908152600360205260408120835190919084908490811061400857614008616398565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055600101613fd6565b60005b82518160ff161015610b64576000838260ff168151811061408c5761408c616398565b60200260200101519050600060028111156140a9576140a9615cc6565b60ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290205461010090041660028111156140f5576140f5615cc6565b1461412f5760046040517f367f56a2000000000000000000000000000000000000000000000000000000008152600401610c579190616c67565b73ffffffffffffffffffffffffffffffffffffffff811661417c576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff1681526020018460028111156141a2576141a2615cc6565b905260ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845282529091208351815493167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841681178255918401519092909183917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561424757614247615cc6565b0217905550905050508061425a90616f92565b9050614069565b60ff8116610f9f57600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000016905550565b600081516020146142d357816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610c5791906153e0565b610e8b828060200190518101906142ea9190616ef3565b614c58565b6000606060008361ffff1667ffffffffffffffff811115614312576143126150ed565b6040519080825280601f01601f19166020018201604052801561433c576020820181803683370190505b509150863b61436f577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a858110156143a2577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b85900360408104810387106143db577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156143fe5750835b808352806000602085013e50955095509592505050565b6000614441827f01ffc9a700000000000000000000000000000000000000000000000000000000614479565b8015610e8b5750614472827fffffffff00000000000000000000000000000000000000000000000000000000614479565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015614531575060208210155b801561453d5750600081115b979650505050505050565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016145eb98979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016146249190616fb1565b604051602081830303815290604052805190602001208761016001516040516020016146509190617073565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e0015b60405160208183030381529060405280519060200120905092915050565b600b5460009065010000000000900460ff16156146fa576040517feced32bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000614707858585614cd2565b905061471281611762565b61472057600091505061325b565b67ffffffffffffffff86166000908152600a6020908152604080832093835292905220549050949350505050565b60055461ffff168311156147a2576040517fa1e5205a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808716600483015285166024820152604401610c57565b8083146147ef576040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808716600483015285166024820152604401610c57565b60055462010000900463ffffffff16821115612c1e576005546040517f1fd8fd04000000000000000000000000000000000000000000000000000000008152600481018890526201000090910463ffffffff16602482015260448101839052606401610c57565b60006002614865608085616438565b67ffffffffffffffff16614879919061645f565b67ffffffffffffffff8516600090815260096020526040812091925090816148a2608087616476565b67ffffffffffffffff1681526020810191909152604001600020549050816148cc600160046163f6565b901b1916818360038111156148e3576148e3615cc6565b67ffffffffffffffff871660009081526009602052604081209190921b92909217918291614912608088616476565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a5906149789087908790600401617086565b600060405180830381600087803b15801561499257600080fd5b505af19250505080156149a3575060015b614c3d573d8080156149d1576040519150601f19603f3d011682016040523d82523d6000602084013e6149d6565b606091505b5060006149e282617210565b90507f0a8d6e8c000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082161480614a7557507fe1cd5509000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80614ac157507f8d666f60000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80614b0d57507f78ef8024000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80614b5957507f0c3b563c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80614ba557507fae9b4ce9000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80614bf157507f09c25325000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b15614c0257506003925090506127e7565b856101800151826040517f2b11b8d9000000000000000000000000000000000000000000000000000000008152600401610c57929190616f0c565b50506040805160208101909152600081526002909250929050565b600073ffffffffffffffffffffffffffffffffffffffff821180614c7d575061040082105b15614cce5760408051602081018490520160408051601f19818403018152908290527f8d666f60000000000000000000000000000000000000000000000000000000008252610c57916004016153e0565b5090565b8251825160009190818303614d13576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590614d2757506101018111155b614d5d576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82820101610100811115614dbe576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003614deb5786600081518110614dd957614dd9616398565b60200260200101519350505050613fcc565b60008167ffffffffffffffff811115614e0657614e066150ed565b604051908082528060200260200182016040528015614e2f578160200160208202803683370190505b50905060008080805b85811015614f725760006001821b8b811603614e935788851015614e7c578c5160018601958e918110614e6d57614e6d616398565b60200260200101519050614eb5565b8551600185019487918110614e6d57614e6d616398565b8b5160018401938d918110614eaa57614eaa616398565b602002602001015190505b600089861015614ee5578d5160018701968f918110614ed657614ed6616398565b60200260200101519050614f07565b8651600186019588918110614efc57614efc616398565b602002602001015190505b82851115614f41576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f4b8282614ff2565b878481518110614f5d57614f5d616398565b60209081029190910101525050600101614e38565b506001850382148015614f8457508683145b8015614f8f57508581145b614fc5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001860381518110614fda57614fda616398565b60200260200101519750505050505050509392505050565b600081831061500a576150058284615010565b610e88565b610e8883835b604080516001602082015290810183905260608101829052600090608001614693565b8280548282559060005260206000209081019282156150ad579160200282015b828111156150ad57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190615053565b50614cce9291506150d8565b604051806103e00160405280601f906020820280368337509192915050565b5b80821115614cce57600081556001016150d9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561513f5761513f6150ed565b60405290565b6040516101a0810167ffffffffffffffff8111828210171561513f5761513f6150ed565b60405160a0810167ffffffffffffffff8111828210171561513f5761513f6150ed565b6040516080810167ffffffffffffffff8111828210171561513f5761513f6150ed565b60405160e0810167ffffffffffffffff8111828210171561513f5761513f6150ed565b6040516060810167ffffffffffffffff8111828210171561513f5761513f6150ed565b604051601f8201601f1916810167ffffffffffffffff8111828210171561521e5761521e6150ed565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f9f57600080fd5b803561525381615226565b919050565b803563ffffffff8116811461525357600080fd5b803561ffff8116811461525357600080fd5b600061010080838503121561529257600080fd5b6040519081019067ffffffffffffffff821181831017156152b5576152b56150ed565b81604052833591506152c682615226565b8181526152d560208501615258565b60208201526152e660408501615258565b60408201526152f760608501615258565b60608201526153086080850161526c565b608082015261531960a08501615258565b60a082015261532a60c08501615248565b60c082015261533b60e08501615248565b60e0820152949350505050565b60608101610e8b8284805167ffffffffffffffff16825260208082015173ffffffffffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60005b838110156153ab578181015183820152602001615393565b50506000910152565b600081518084526153cc816020860160208601615390565b601f01601f19169290920160200192915050565b602081526000610e8860208301846153b4565b60006020828403121561540557600080fd5b813564ffffffffff81168114613fcc57600080fd5b8060608101831015610e8b57600080fd5b60008083601f84011261543d57600080fd5b50813567ffffffffffffffff81111561545557600080fd5b6020830191508360208285010111156127e757600080fd5b60008083601f84011261547f57600080fd5b50813567ffffffffffffffff81111561549757600080fd5b6020830191508360208260051b85010111156127e757600080fd5b60008060008060008060008060e0898b0312156154ce57600080fd5b6154d88a8a61541a565b9750606089013567ffffffffffffffff808211156154f557600080fd5b6155018c838d0161542b565b909950975060808b013591508082111561551a57600080fd5b6155268c838d0161546d565b909750955060a08b013591508082111561553f57600080fd5b5061554c8b828c0161546d565b999c989b50969995989497949560c00135949350505050565b60008060006080848603121561557a57600080fd5b615584858561541a565b9250606084013567ffffffffffffffff8111156155a057600080fd5b6155ac8682870161542b565b9497909650939450505050565b600067ffffffffffffffff8211156155d3576155d36150ed565b5060051b60200190565b67ffffffffffffffff81168114610f9f57600080fd5b8035615253816155dd565b8015158114610f9f57600080fd5b8035615253816155fe565b600067ffffffffffffffff821115615631576156316150ed565b50601f01601f191660200190565b600082601f83011261565057600080fd5b813561566361565e82615617565b6151f5565b81815284602083860101111561567857600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126156a657600080fd5b813560206156b661565e836155b9565b82815260069290921b840181019181810190868411156156d557600080fd5b8286015b8481101561571d57604081890312156156f25760008081fd5b6156fa61511c565b813561570581615226565b815281850135858201528352918301916040016156d9565b509695505050505050565b600082601f83011261573957600080fd5b8135602061574961565e836155b9565b82815260059290921b8401810191818101908684111561576857600080fd5b8286015b8481101561571d57803567ffffffffffffffff81111561578c5760008081fd5b61579a8986838b010161563f565b84525091830191830161576c565b60006101a082840312156157bb57600080fd5b6157c3615145565b90506157ce826155f3565b81526157dc60208301615248565b60208201526157ed60408301615248565b60408201526157fe606083016155f3565b60608201526080820135608082015261581960a0830161560c565b60a082015261582a60c083016155f3565b60c082015261583b60e08301615248565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561586857600080fd5b6158748683870161563f565b8385015261014092508285013591508082111561589057600080fd5b61589c86838701615695565b838501526101609250828501359150808211156158b857600080fd5b506158c585828601615728565b82840152505061018080830135818301525092915050565b600082601f8301126158ee57600080fd5b813560206158fe61565e836155b9565b82815260059290921b8401810191818101908684111561591d57600080fd5b8286015b8481101561571d57803567ffffffffffffffff8111156159415760008081fd5b61594f8986838b01016157a8565b845250918301918301615921565b600082601f83011261596e57600080fd5b8135602061597e61565e836155b9565b82815260059290921b8401810191818101908684111561599d57600080fd5b8286015b8481101561571d57803567ffffffffffffffff8111156159c15760008081fd5b6159cf8986838b0101615728565b8452509183019183016159a1565b600082601f8301126159ee57600080fd5b813560206159fe61565e836155b9565b8083825260208201915060208460051b870101935086841115615a2057600080fd5b602086015b8481101561571d5780358352918301918301615a25565b600082601f830112615a4d57600080fd5b81356020615a5d61565e836155b9565b82815260059290921b84018101918181019086841115615a7c57600080fd5b8286015b8481101561571d57803567ffffffffffffffff80821115615aa15760008081fd5b818901915060a080601f19848d03011215615abc5760008081fd5b615ac4615169565b615acf8885016155f3565b815260408085013584811115615ae55760008081fd5b615af38e8b838901016158dd565b8a8401525060608086013585811115615b0c5760008081fd5b615b1a8f8c838a010161595d565b8385015250608091508186013585811115615b355760008081fd5b615b438f8c838a01016159dd565b9184019190915250919093013590830152508352918301918301615a80565b6000806040808486031215615b7657600080fd5b833567ffffffffffffffff80821115615b8e57600080fd5b615b9a87838801615a3c565b9450602091508186013581811115615bb157600080fd5b8601601f81018813615bc257600080fd5b8035615bd061565e826155b9565b81815260059190911b8201840190848101908a831115615bef57600080fd5b8584015b83811015615c7b57803586811115615c0b5760008081fd5b8501603f81018d13615c1d5760008081fd5b87810135615c2d61565e826155b9565b81815260059190911b82018a0190898101908f831115615c4d5760008081fd5b928b01925b82841015615c6b5783358252928a0192908a0190615c52565b8652505050918601918601615bf3565b50809750505050505050509250929050565b60008060408385031215615ca057600080fd5b8235615cab816155dd565b91506020830135615cbb816155dd565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110615d0557615d05615cc6565b9052565b60208101610e8b8284615cf5565b73ffffffffffffffffffffffffffffffffffffffff8151168252602081015163ffffffff808216602085015280604084015116604085015280606084015116606085015261ffff60808401511660808501528060a08401511660a0850152505060c0810151615d9e60c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e0810151610df860e084018273ffffffffffffffffffffffffffffffffffffffff169052565b6101008101610e8b8284615d17565b60006020808385031215615de857600080fd5b823567ffffffffffffffff811115615dff57600080fd5b8301601f81018513615e1057600080fd5b8035615e1e61565e826155b9565b81815260079190911b82018301908381019087831115615e3d57600080fd5b928401925b8284101561453d5760808489031215615e5b5760008081fd5b615e6361518c565b8435615e6e816155dd565b815284860135615e7d816155fe565b81870152604085810135615e9081615226565b90820152606085810135615ea381615226565b9082015282526080939093019290840190615e42565b600060208284031215615ecb57600080fd5b813567ffffffffffffffff811115615ee257600080fd5b820160a08185031215613fcc57600080fd5b60008060408385031215615f0757600080fd5b8235615f12816155dd565b91506020830135615cbb81615226565b600060208284031215615f3457600080fd5b8135613fcc816155dd565b803560ff8116811461525357600080fd5b600060208284031215615f6257600080fd5b610e8882615f3f565b60008151808452602080850194506020840160005b83811015615fb257815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101615f80565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff60408201511660608401526060810151151560808401526080810151151560a084015250602083015160e060c0840152616019610100840182615f6b565b90506040840151601f198483030160e08501526160368282615f6b565b95945050505050565b6000806040838503121561605257600080fd5b823561605d816155dd565b946020939093013593505050565b6000806020838503121561607e57600080fd5b823567ffffffffffffffff8082111561609657600080fd5b818501915085601f8301126160aa57600080fd5b8135818111156160b957600080fd5b8660208260061b85010111156160ce57600080fd5b60209290920196919550909350505050565b600082601f8301126160f157600080fd5b8135602061610161565e836155b9565b8083825260208201915060208460051b87010193508684111561612357600080fd5b602086015b8481101561571d57803561613b81615226565b8352918301918301616128565b6000602080838503121561615b57600080fd5b823567ffffffffffffffff8082111561617357600080fd5b818501915085601f83011261618757600080fd5b813561619561565e826155b9565b81815260059190911b830184019084810190888311156161b457600080fd5b8585015b8381101561629b578035858111156161cf57600080fd5b860160e0818c03601f190112156161e65760008081fd5b6161ee6151af565b8882013581526040616201818401615f3f565b8a8301526060616212818501615f3f565b828401526080915061622582850161560c565b9083015260a061623684820161560c565b8284015260c0915081840135898111156162505760008081fd5b61625e8f8d838801016160e0565b82850152505060e0830135888111156162775760008081fd5b6162858e8c838701016160e0565b91830191909152508452509186019186016161b8565b5098975050505050505050565b6000602082840312156162ba57600080fd5b8135613fcc81615226565b600080604083850312156162d857600080fd5b823567ffffffffffffffff808211156162f057600080fd5b6162fc868387016157a8565b9350602085013591508082111561631257600080fd5b5061631f85828601615728565b9150509250929050565b60006020828403121561633b57600080fd5b5035919050565b610160810161638b8285805167ffffffffffffffff16825260208082015173ffffffffffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b613fcc6060830184615d17565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610e8b57610e8b6163c7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061645357616453616409565b92169190910692915050565b8082028115828204841417610e8b57610e8b6163c7565b600067ffffffffffffffff8084168061649157616491616409565b92169190910492915050565b6000602082840312156164af57600080fd5b8151613fcc816155fe565b6000604082840312156164cc57600080fd5b6164d461511c565b82356164df816155dd565b81526020928301359281019290925250919050565b60008151808452602080850194506020840160005b83811015615fb2578151805173ffffffffffffffffffffffffffffffffffffffff1688526020908101519088015260408701965090820190600101616509565b8051825267ffffffffffffffff60208201511660208301526000604082015160a0604085015261657c60a08501826153b4565b90506060830151848203606086015261659582826153b4565b9150506080830151848203608086015261603682826164f4565b602081526000610e886020830184616549565b6080815260006165d56080830187616549565b61ffff95909516602083015250604081019290925273ffffffffffffffffffffffffffffffffffffffff16606090910152919050565b600082601f83011261661c57600080fd5b815161662a61565e82615617565b81815284602083860101111561663f57600080fd5b61325b826020830160208701615390565b60008060006060848603121561666557600080fd5b8351616670816155fe565b602085015190935067ffffffffffffffff81111561668d57600080fd5b6166998682870161660b565b925050604084015190509250925092565b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461525357600080fd5b600082601f8301126166e757600080fd5b813560206166f761565e836155b9565b82815260069290921b8401810191818101908684111561671657600080fd5b8286015b8481101561571d57604081890312156167335760008081fd5b61673b61511c565b8135616746816155dd565b81526167538286016166aa565b8186015283529183019160400161671a565b600082601f83011261677657600080fd5b8135602061678661565e836155b9565b82815260079290921b840181019181810190868411156167a557600080fd5b8286015b8481101561571d5780880360808112156167c35760008081fd5b6167cb6151d2565b82356167d6816155dd565b81526040601f1983018113156167ec5760008081fd5b6167f461511c565b925086840135616803816155dd565b835283810135616812816155dd565b83880152818701929092526060830135918101919091528352918301916080016167a9565b6000602080838503121561684a57600080fd5b823567ffffffffffffffff8082111561686257600080fd5b8185019150604080838803121561687857600080fd5b61688061511c565b83358381111561688f57600080fd5b84016040818a0312156168a157600080fd5b6168a961511c565b8135858111156168b857600080fd5b8201601f81018b136168c957600080fd5b80356168d761565e826155b9565b81815260069190911b8201890190898101908d8311156168f657600080fd5b928a01925b828410156169465787848f0312156169135760008081fd5b61691b61511c565b843561692681615226565b8152616933858d016166aa565b818d0152825292870192908a01906168fb565b84525050508187013593508484111561695e57600080fd5b61696a8a8584016166d6565b818801528252508385013591508282111561698457600080fd5b61699088838601616765565b85820152809550505050505092915050565b805160408084528151848201819052600092602091908201906060870190855b81811015616a1b578351805173ffffffffffffffffffffffffffffffffffffffff1684528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168584015292840192918501916001016169c2565b50508583015187820388850152805180835290840192506000918401905b80831015616a8a578351805167ffffffffffffffff1683528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1685830152928401926001929092019190850190616a39565b50979650505050505050565b602081526000610e8860208301846169a2565b67ffffffffffffffff8316815260608101613fcc6020830184805167ffffffffffffffff908116835260209182015116910152565b67ffffffffffffffff818116838216019080821115616aff57616aff6163c7565b5092915050565b600060208083526060845160408084870152616b2560608701836169a2565b87850151878203601f19016040890152805180835290860193506000918601905b8083101561629b57845167ffffffffffffffff815116835287810151616b8589850182805167ffffffffffffffff908116835260209182015116910152565b50840151828701529386019360019290920191608090910190616b46565b80820180821115610e8b57610e8b6163c7565b60ff8181168382160190811115610e8b57610e8b6163c7565b600060ff831680616be257616be2616409565b8060ff84160491505092915050565b8183823760009101908152919050565b828152606082602083013760800192915050565b600060208284031215616c2757600080fd5b813567ffffffffffffffff811115616c3e57600080fd5b61325b84828501615a3c565b600060208284031215616c5c57600080fd5b8151613fcc816155dd565b6020810160058310616c7b57616c7b615cc6565b91905290565b60ff8181168382160290811690818114616aff57616aff6163c7565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b81811015616d0457845473ffffffffffffffffffffffffffffffffffffffff1683526001948501949284019201616cd2565b50508481036060860152616d188188615f6b565b935050505060ff831660808301529695505050505050565b600060208284031215616d4257600080fd5b815167ffffffffffffffff80821115616d5a57600080fd5b9083019060608286031215616d6e57600080fd5b616d766151d2565b825182811115616d8557600080fd5b616d918782860161660b565b825250602083015182811115616da657600080fd5b616db28782860161660b565b602083015250604083015182811115616dca57600080fd5b616dd68782860161660b565b60408301525095945050505050565b600060208284031215616df757600080fd5b8151613fcc81615226565b6020815260008251610100806020850152616e216101208501836153b4565b91506020850151616e3e604086018267ffffffffffffffff169052565b50604085015173ffffffffffffffffffffffffffffffffffffffff8116606086015250606085015160808501526080850151616e9260a086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a0850151601f19808685030160c0870152616eaf84836153b4565b935060c08701519150808685030160e0870152616ecc84836153b4565b935060e0870151915080868503018387015250616ee983826153b4565b9695505050505050565b600060208284031215616f0557600080fd5b5051919050565b82815260406020820152600061325b60408301846153b4565b67ffffffffffffffff8481168252831660208201526060810161325b6040830184615cf5565b600067ffffffffffffffff808316818103616f6857616f686163c7565b6001019392505050565b616f7c8184615cf5565b60406020820152600061325b60408301846153b4565b600060ff821660ff8103616fa857616fa86163c7565b60010192915050565b6020808252825182820181905260009190848201906040850190845b8181101561700d578351805173ffffffffffffffffffffffffffffffffffffffff1684526020908101519084015260408301938501939250600101616fcd565b50909695505050505050565b60008282518085526020808601955060208260051b8401016020860160005b8481101561706657601f198684030189526170548383516153b4565b98840198925090830190600101617038565b5090979650505050505050565b602081526000610e886020830184617019565b604081526170a160408201845167ffffffffffffffff169052565b600060208401516170ca606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c08401516101006171388185018367ffffffffffffffff169052565b60e086015191506101206171638186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a061016081818701526171936101e08701856153b4565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06101808188870301818901526171d286866164f4565b9550828a015194508188870301848901526171ed8686617019565b9550808a01516101c0890152505050505082810360208401526160368185617019565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156172585780818460040360031b1b83161693505b50505091905056fea164736f6c6343000818000a", + Bin: "0x610100604052600b805460ff60281b191690553480156200001f57600080fd5b5060405162007aa938038062007aa9833981016040819052620000429162000608565b3380600081620000995760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000cc57620000cc8162000181565b5050466080525060208201516001600160a01b03161580620000f9575060408201516001600160a01b0316155b1562000118576040516342bcdf7f60e11b815260040160405180910390fd5b81516001600160401b0316600003620001445760405163c656089560e01b815260040160405180910390fd5b81516001600160401b031660a05260208201516001600160a01b0390811660c05260408301511660e05262000179816200022c565b505062000790565b336001600160a01b03821603620001db5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000090565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b8151811015620004dc5760008282815181106200025057620002506200077a565b60200260200101519050600081600001519050806001600160401b03166000036200028e5760405163c656089560e01b815260040160405180910390fd5b60608201516001600160a01b0316620002ba576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b038116600090815260076020526040902060018101546001600160a01b0316620003c0576200031c8284606001517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3620004e060201b60201c565b600282015560608301516001820180546001600160a01b039283166001600160a01b03199091161790556040808501518354610100600160481b03199190931669010000000000000000000216610100600160e81b031990921691909117610100178255516001600160401b03831681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a16200042f565b606083015160018201546001600160a01b03908116911614158062000404575060408301518154690100000000000000000090046001600160a01b03908116911614155b156200042f5760405163c39a620560e01b81526001600160401b038316600482015260240162000090565b6020830151815490151560ff199091161781556040516001600160401b038316907fa73c588738263db34ef8c1942db8f99559bc6696f6a812d42e76bafb4c0e8d3090620004c5908490815460ff811615158252600881901c6001600160401b0316602083015260481c6001600160a01b0390811660408301526001830154166060820152600290910154608082015260a00190565b60405180910390a25050508060010190506200022f565b5050565b60a0805160408051602081018590526001600160401b0380881692820192909252911660608201526001600160a01b0384166080820152600091016040516020818303038152906040528051906020012090509392505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156200057557620005756200053a565b60405290565b604051608081016001600160401b03811182821017156200057557620005756200053a565b604051601f8201601f191681016001600160401b0381118282101715620005cb57620005cb6200053a565b604052919050565b80516001600160401b0381168114620005eb57600080fd5b919050565b80516001600160a01b0381168114620005eb57600080fd5b6000808284036080808212156200061e57600080fd5b6060808312156200062e57600080fd5b6200063862000550565b92506200064586620005d3565b8352602062000656818801620005f0565b8185015260406200066a60408901620005f0565b604086015260608801519496506001600160401b03808611156200068d57600080fd5b858901955089601f870112620006a257600080fd5b855181811115620006b757620006b76200053a565b620006c7848260051b01620005a0565b818152848101925060079190911b87018401908b821115620006e857600080fd5b968401965b81881015620007685786888d031215620007075760008081fd5b620007116200057b565b6200071c89620005d3565b8152858901518015158114620007325760008081fd5b8187015262000743898601620005f0565b8582015262000754878a01620005f0565b8188015283529686019691840191620006ed565b80985050505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e05161728b6200081e6000396000818161026c01528181610a0b0152612db3015260008181610230015281816109e401528181611084015281816117c501528181611ae30152613597015260008181610200015281816109c00152613f67015260008181610bd301528181610c1f01528181611f1e0152611f6a015261728b6000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80637f63b711116100f9578063ccd37ba311610097578063e9d68a8e11610071578063e9d68a8e146105f0578063f2fde38b14610718578063f52121a51461072b578063ff888fb11461073e57600080fd5b8063ccd37ba314610585578063d2a15d35146105ca578063d783efe7146105dd57600080fd5b80638b364334116100d35780638b364334146105175780638da5cb5b1461052a57806396c62bcc14610552578063c673e5841461056557600080fd5b80637f63b711146104ee5780638456cb591461050157806385572ffb1461050957600080fd5b8063311cd513116101665780635c975abb116101405780635c975abb146103805780635e36480c146103a05780637437ff9f146103c057806379ba5097146104e657600080fd5b8063311cd513146103525780633f4ba83a14610365578063542625af1461036d57600080fd5b8063181f5a7711610197578063181f5a77146102e357806329b980e41461032c5780632d04ab761461033f57600080fd5b806305a754ec146101be57806306285c69146101d357806310c374ed146102bf575b600080fd5b6101d16101cc36600461529c565b610751565b005b6102a9604080516060810182526000808252602082018190529181019190915260405180606001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516102b69190615366565b60405180910390f35b600b5464ffffffffff165b60405167ffffffffffffffff90911681526020016102b6565b61031f6040518060400160405280601d81526020017f45564d3245564d4d756c74694f666652616d7020312e362e302d64657600000081525081565b6040516102b691906153fe565b6101d161033a366004615411565b610a6a565b6101d161034d3660046154d0565b610aaa565b6101d1610360366004615583565b610b37565b6101d1610b6a565b6101d161037b366004615b80565b610bd0565b600b5465010000000000900460ff165b60405190151581526020016102b6565b6103b36103ae366004615cab565b610dfd565b6040516102b69190615d27565b6104d96040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915250604080516101008101825260045473ffffffffffffffffffffffffffffffffffffffff808216835263ffffffff74010000000000000000000000000000000000000000830481166020850152780100000000000000000000000000000000000000000000000083048116948401949094527c01000000000000000000000000000000000000000000000000000000009091048316606083015260055461ffff8116608084015262010000810490931660a08301526601000000000000909204821660c082015260065490911660e082015290565b6040516102b69190615de4565b6101d1610e91565b6101d16104fc366004615df3565b610f8e565b6101d1610fa2565b6101d16101b9366004615ed7565b6102ca610525366004615f12565b61100a565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102b6565b610390610560366004615f40565b611020565b610578610573366004615f6e565b61110d565b6040516102b69190615fdb565b6105bc61059336600461605d565b67ffffffffffffffff919091166000908152600a60209081526040808320938352929052205490565b6040519081526020016102b6565b6101d16105d8366004616089565b61129e565b6101d16105eb366004616166565b611358565b6106ae6105fe366004615f40565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091525067ffffffffffffffff908116600090815260076020908152604091829020825160a081018452815460ff81161515825261010081049095169281019290925273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009094048416928201929092526001820154909216606083015260020154608082015290565b6040516102b69190600060a08201905082511515825267ffffffffffffffff6020840151166020830152604083015173ffffffffffffffffffffffffffffffffffffffff808216604085015280606086015116606085015250506080830151608083015292915050565b6101d16107263660046162c6565b61139a565b6101d16107393660046162e3565b6113ab565b61039061074c366004616347565b611762565b610759611830565b60e081015173ffffffffffffffffffffffffffffffffffffffff166107aa576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff166107f8576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516004805460208085015160408087015160608089015163ffffffff9081167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9382167801000000000000000000000000000000000000000000000000029390931677ffffffffffffffffffffffffffffffffffffffffffffffff95821674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090981673ffffffffffffffffffffffffffffffffffffffff9a8b16179790971794909416959095171790945560808601516005805460a089015160c08a015189166601000000000000027fffffffffffff0000000000000000000000000000000000000000ffffffffffff9190951662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090921661ffff90941693909317179190911691909117905560e0850151600680549186167fffffffffffffffffffffffff0000000000000000000000000000000000000000929092169190911790558251918201835267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682527f00000000000000000000000000000000000000000000000000000000000000008416908201527f000000000000000000000000000000000000000000000000000000000000000090921682820152517ff778ca28f5b9f37b5d23ffa5357592348ea60ec4e42b1dce5c857a5a65b276f791610a5f918490616360565b60405180910390a150565b610a72611830565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff92909216919091179055565b610ab9878760208b01356118b3565b610b2d600089898989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152508a9250611dda915050565b5050505050505050565b610b41828261222c565b604080516000808252602082019092529050610b64600185858585866000611dda565b50505050565b610b72611830565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b467f000000000000000000000000000000000000000000000000000000000000000014610c60576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff461660248201526044015b60405180910390fd5b815181518114610c9c576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610ded576000848281518110610cbb57610cbb6163b6565b60200260200101519050600081602001515190506000858481518110610ce357610ce36163b6565b6020026020010151905080518214610d27576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82811015610dde576000828281518110610d4657610d466163b6565b6020026020010151905080600014158015610d81575084602001518281518110610d7257610d726163b6565b60200260200101516080015181105b15610dd55784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024810183905260448101829052606401610c57565b50600101610d2a565b50505050806001019050610c9f565b50610df88383612268565b505050565b6000610e0b60016004616414565b6002610e18608085616456565b67ffffffffffffffff16610e2c919061647d565b67ffffffffffffffff8516600090815260096020526040812090610e51608087616494565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c166003811115610e8857610e88615ce4565b90505b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c57565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f96611830565b610f9f81612318565b50565b610faa611830565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff16650100000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610bc6565b60008061101784846126b6565b50949350505050565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608083901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa1580156110cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ef91906164bb565b158015610e8b5750600b5465010000000000900460ff161592915050565b6111586040805161010081019091526000606082018181526080830182905260a0830182905260c0830182905260e08301919091528190815260200160608152602001606081525090565b60ff8083166000908152600260208181526040928390208351610100808201865282546060830190815260018401548089166080850152918204881660a08401526201000082048816151560c08401526301000000909104909616151560e08201529485529182018054845181840281018401909552808552929385830193909283018282801561121f57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111f4575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561128e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611263575b5050505050815250509050919050565b6112a6611830565b60005b81811015610df85760008383838181106112c5576112c56163b6565b9050604002018036038101906112db91906164d8565b90506112ea8160200151611762565b61134f57805167ffffffffffffffff166000908152600a602090815260408083208285018051855290835281842093909355915191519182527f202f1139a3e334b6056064c0e9b19fd07e44a88d8f6e5ded571b24cf8c371f12910160405180910390a15b506001016112a9565b611360611830565b60005b81518110156113965761138e828281518110611381576113816163b6565b60200260200101516127ee565b600101611363565b5050565b6113a2611830565b610f9f81612c26565b3330146113e4576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611421565b60408051808201909152600080825260208201528152602001906001900390816113fa5790505b5061014084015151909150156114bc576101408301516040805160608101909152602085015173ffffffffffffffffffffffffffffffffffffffff1660808201526114b991908060a0810160408051601f19818403018152918152908252875167ffffffffffffffff1660208301528781015173ffffffffffffffffffffffffffffffffffffffff1691015261016086015185612d1b565b90505b60006114c88483613263565b6005549091506601000000000000900473ffffffffffffffffffffffffffffffffffffffff1680156115d9576040517fa219f6e500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063a219f6e5906115469085906004016165cd565b600060405180830381600087803b15801561156057600080fd5b505af1925050508015611571575060015b6115d9573d80801561159f576040519150601f19603f3d011682016040523d82523d6000602084013e6115a4565b606091505b50806040517f09c25325000000000000000000000000000000000000000000000000000000008152600401610c5791906153fe565b610120850151511580156115ef57506080850151155b806116135750604085015173ffffffffffffffffffffffffffffffffffffffff163b155b806116605750604085015161165e9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb00000000000000000000000000000000000000000000000000000000613313565b155b1561166c575050505050565b60048054608087015160408089015190517f3cf97983000000000000000000000000000000000000000000000000000000008152600094859473ffffffffffffffffffffffffffffffffffffffff1693633cf97983936116d4938a93611388939291016165e0565b6000604051808303816000875af11580156116f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261171b919081019061666e565b50915091508161175957806040517f0a8d6e8c000000000000000000000000000000000000000000000000000000008152600401610c5791906153fe565b50505050505050565b6040805180820182523081526020810183815291517f4d616771000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9081166004830152915160248201526000917f00000000000000000000000000000000000000000000000000000000000000001690634d61677190604401602060405180830381865afa15801561180c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8b91906164bb565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c57565b565b600b5465010000000000900460ff16156118f9576040517feced32bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061190783850185616855565b8051515190915015158061192057508051602001515115155b15611a4957600b5464ffffffffff80841691161015611a0a57600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff841617905560065481516040517f3937306f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921691633937306f916119c091600401616ab4565b600060405180830381600087803b1580156119da57600080fd5b505af11580156119ee573d6000803e3d6000fd5b50505050806020015151600003611a055750505050565b611a49565b806020015151600003611a49576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b816020015151811015611d9c57600082602001518281518110611a7157611a716163b6565b602090810291909101015180516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608083901b1660048201529192509073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa158015611b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4e91906164bb565b15611b91576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610c57565b67ffffffffffffffff81166000908152600760205260409020805460ff16611bf1576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c57565b6020830151518154610100900467ffffffffffffffff9081169116141580611c30575060208084015190810151905167ffffffffffffffff9182169116115b15611c7057825160208401516040517feefb0cac000000000000000000000000000000000000000000000000000000008152610c57929190600401616ac7565b6040830151611cab576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825167ffffffffffffffff166000908152600a6020908152604080832081870151845290915290205415611d2457825160408085015190517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90921660048301526024820152604401610c57565b6020808401510151611d37906001616afc565b81547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff92831602179091558251166000908152600a602090815260408083209481015183529390529190912042905550600101611a4c565b507f3a3950e13dd607cc37980db0ef14266c40d2bba9c01b2e44bfe549808883095d81604051611dcc9190616b24565b60405180910390a150505050565b60ff8781166000908152600260209081526040808320815160a08101835281548152600190910154808616938201939093526101008304851691810191909152620100008204841615156060820152630100000090910490921615156080830152873590611e498760a4616bc1565b9050826080015115611e91578451611e6290602061647d565b8651611e6f90602061647d565b611e7a9060a0616bc1565b611e849190616bc1565b611e8e9082616bc1565b90505b368114611ed3576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610c57565b5081518114611f1b5781516040517f93df584c000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610c57565b467f000000000000000000000000000000000000000000000000000000000000000014611f9c576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610c57565b60ff808a1660009081526003602090815260408083203384528252808320815180830190925280548086168352939491939092840191610100909104166002811115611fea57611fea615ce4565b6002811115611ffb57611ffb615ce4565b905250905060028160200151600281111561201857612018615ce4565b1480156120795750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff1681548110612054576120546163b6565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b6120af576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b508160800151156121d75760008260600151156120fb576002836020015184604001516120dc9190616bd4565b6120e69190616bed565b6120f1906001616bd4565b60ff169050612111565b602083015161210b906001616bd4565b60ff1690505b8086511461214b576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451865114612186576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060008787604051612199929190616c0f565b6040519081900381206121b0918b90602001616c1f565b6040516020818303038152906040528051906020012090506121d58a8288888861332f565b505b6040805182815260208a81013560081c63ffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b61139661223b82840184616c33565b6040805160008082526020820190925290612266565b60608152602001906001900390816122515790505b505b81516000036122a2576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b8451811015612311576123098582815181106122d7576122d76163b6565b602002602001015184612303578583815181106122f6576122f66163b6565b6020026020010151613549565b83613549565b6001016122b9565b5050505050565b60005b8151811015611396576000828281518110612338576123386163b6565b602002602001015190506000816000015190508067ffffffffffffffff1660000361238f576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606082015173ffffffffffffffffffffffffffffffffffffffff166123e0576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600760205260409020600181015473ffffffffffffffffffffffffffffffffffffffff1661253e576124478284606001517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3613f61565b6002820155606083015160018201805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905560408085015183547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff91909316690100000000000000000002167fffffff00000000000000000000000000000000000000000000000000000000ff909216919091176101001782555167ffffffffffffffff831681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a16125de565b6060830151600182015473ffffffffffffffffffffffffffffffffffffffff908116911614158061259b5750604083015181546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff908116911614155b156125de576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610c57565b602083015181549015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911617815560405167ffffffffffffffff8316907fa73c588738263db34ef8c1942db8f99559bc6696f6a812d42e76bafb4c0e8d30906126a0908490815460ff811615158252600881901c67ffffffffffffffff16602083015260481c73ffffffffffffffffffffffffffffffffffffffff90811660408301526001830154166060820152600290910154608082015260a00190565b60405180910390a250505080600101905061231b565b67ffffffffffffffff808316600090815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205490918291168082036127e05767ffffffffffffffff85166000908152600760205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1680156127de576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015282169063856c824790602401602060405180830381865afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d19190616c68565b60019350935050506127e7565b505b9150600090505b9250929050565b806040015160ff166000036128325760006040517f367f56a2000000000000000000000000000000000000000000000000000000008152600401610c579190616c85565b60208082015160ff808216600090815260029093526040832060018101549293909283921690036128d2576060840151600182018054608087015115156301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff9315156201000002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9091161791909117905561294c565b6060840151600182015460ff6201000090910416151590151514158061291057506080840151600182015460ff630100000090910416151590151514155b1561294c576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff84166004820152602401610c57565b60c08401518051601f60ff821611156129945760016040517f367f56a2000000000000000000000000000000000000000000000000000000008152600401610c579190616c85565b612a0785856003018054806020026020016040519081016040528092919081815260200182805480156129fd57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116129d2575b5050505050613ff1565b856080015115612b7557612a8285856002018054806020026020016040519081016040528092919081815260200182805480156129fd5760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116129d2575050505050613ff1565b60a08601518051612a9c9060028701906020840190615051565b5080516001850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff841690810291909117909155601f1015612b155760026040517f367f56a2000000000000000000000000000000000000000000000000000000008152600401610c579190616c85565b6040880151612b25906003616c9f565b60ff168160ff1611612b665760036040517f367f56a2000000000000000000000000000000000000000000000000000000008152600401610c579190616c85565b612b7287836001614084565b50505b612b8185836002614084565b8151612b969060038601906020850190615051565b506040868101516001850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316179055875180865560c089015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f54793612c0d938a939260028b01929190616cbb565b60405180910390a1612c1e8561427f565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff821603612ca5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c57565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8360005b8551811015611017576000848281518110612d3c57612d3c6163b6565b6020026020010151806020019051810190612d579190616d4e565b90506000612d6882602001516142b2565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612dfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1e9190616e03565b905073ffffffffffffffffffffffffffffffffffffffff81161580612e805750612e7e73ffffffffffffffffffffffffffffffffffffffff82167faff2afbf00000000000000000000000000000000000000000000000000000000613313565b155b15612ecf576040517fae9b4ce900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610c57565b60008061303c633907753760e01b6040518061010001604052808d6000015181526020018d6020015167ffffffffffffffff1681526020018d6040015173ffffffffffffffffffffffffffffffffffffffff1681526020018e8a81518110612f3957612f396163b6565b60200260200101516020015181526020018773ffffffffffffffffffffffffffffffffffffffff16815260200188600001518152602001886040015181526020018b8a81518110612f8c57612f8c6163b6565b6020026020010151815250604051602401612fa79190616e20565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600454859063ffffffff7c010000000000000000000000000000000000000000000000000000000090910416611388608461430d565b50915091508161307a57806040517fe1cd5509000000000000000000000000000000000000000000000000000000008152600401610c5791906153fe565b80516020146130c25780516040517f78ef8024000000000000000000000000000000000000000000000000000000008152602060048201526024810191909152604401610c57565b6000818060200190518101906130d89190616f11565b60408c810151815173ffffffffffffffffffffffffffffffffffffffff909116602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526004549192506131979187907801000000000000000000000000000000000000000000000000900463ffffffff16611388608461430d565b509093509150826131d657816040517fe1cd5509000000000000000000000000000000000000000000000000000000008152600401610c5791906153fe565b848888815181106131e9576131e96163b6565b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508088888151811061323a5761323a6163b6565b60200260200101516020018181525050505050505050806001019050612d1f565b949350505050565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff16815260200184602001516040516020016132e8919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b600061331e83614433565b8015610e885750610e888383614497565b6133376150d7565b835160005b81811015610b2d57600060018886846020811061335b5761335b6163b6565b61336891901a601b616bd4565b89858151811061337a5761337a6163b6565b6020026020010151898681518110613394576133946163b6565b6020026020010151604051600081526020016040526040516133d2949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156133f4573d6000803e3d6000fd5b505060408051601f1981015160ff808e1660009081526003602090815285822073ffffffffffffffffffffffffffffffffffffffff85168352815285822085870190965285548084168652939750909550929392840191610100900416600281111561346257613462615ce4565b600281111561347357613473615ce4565b905250905060018160200151600281111561349057613490615ce4565b146134c7576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051859060ff16601f81106134de576134de6163b6565b60200201511561351a576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600185826000015160ff16601f8110613535576135356163b6565b91151560209092020152505060010161333c565b81516040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608082901b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa1580156135f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361791906164bb565b1561365a576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610c57565b602083015151600081900361369a576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83604001515181146136d8576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff82166000908152600760205260409020805460ff16613738576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610c57565b60008267ffffffffffffffff8111156137535761375361510b565b60405190808252806020026020018201604052801561377c578160200160208202803683370190505b50905060005b83811015613841576000876020015182815181106137a2576137a26163b6565b602002602001015190506137ba818560020154614566565b8383815181106137cc576137cc6163b6565b6020026020010181815250508061018001518383815181106137f0576137f06163b6565b602002602001015114613838578061018001516040517f345039be000000000000000000000000000000000000000000000000000000008152600401610c5791815260200190565b50600101613782565b506000613858858389606001518a608001516146cf565b9050806000036138a0576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610c57565b8551151560005b85811015613f56576000896020015182815181106138c7576138c76163b6565b6020026020010151905060006138e1898360600151610dfd565b905060028160038111156138f7576138f7615ce4565b0361394d5760608201516040805167ffffffffffffffff808d16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a15050613f4e565b600081600381111561396157613961615ce4565b148061397e5750600381600381111561397c5761397c615ce4565b145b6139ce5760608201516040517f25507e7f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c1660048301529091166024820152604401610c57565b8315613aaf5760045460009074010000000000000000000000000000000000000000900463ffffffff16613a028742616414565b1190508080613a2257506003826003811115613a2057613a20615ce4565b145b613a64576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8b166004820152602401610c57565b8a8481518110613a7657613a766163b6565b6020026020010151600014613aa9578a8481518110613a9757613a976163b6565b60200260200101518360800181815250505b50613b14565b6000816003811115613ac357613ac3615ce4565b14613b145760608201516040517f3ef2a99c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c1660048301529091166024820152604401610c57565b600080613b258b85602001516126b6565b915091508015613c455760c084015167ffffffffffffffff16613b49836001616afc565b67ffffffffffffffff1614613bd95760c084015160208501516040517f5444a3301c7c42dd164cbf6ba4b72bf02504f86c049b06a27fc2b662e334bdbd92613bc8928f9267ffffffffffffffff938416815291909216602082015273ffffffffffffffffffffffffffffffffffffffff91909116604082015260600190565b60405180910390a150505050613f4e565b67ffffffffffffffff8b811660009081526008602090815260408083208883015173ffffffffffffffffffffffffffffffffffffffff168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169184169190911790555b6000836003811115613c5957613c59615ce4565b03613cf75760c084015167ffffffffffffffff16613c78836001616afc565b67ffffffffffffffff1614613cf75760c084015160208501516040517f852dc8e405695593e311bd83991cf39b14a328f304935eac6d3d55617f911d8992613bc8928f9267ffffffffffffffff938416815291909216602082015273ffffffffffffffffffffffffffffffffffffffff91909116604082015260600190565b60008d604001518681518110613d0f57613d0f6163b6565b60200260200101519050613d3d8561018001518d87606001518861014001515189610120015151865161476c565b613d4d8c86606001516001614874565b600080613d5a8784614952565b91509150613d6d8e886060015184614874565b888015613d8b57506003826003811115613d8957613d89615ce4565b145b8015613da957506000866003811115613da657613da6615ce4565b14155b15613de957866101800151816040517f2b11b8d9000000000000000000000000000000000000000000000000000000008152600401610c57929190616f2a565b6003826003811115613dfd57613dfd615ce4565b14158015613e1d57506002826003811115613e1a57613e1a615ce4565b14155b15613e5e578d8760600151836040517f926c5a3e000000000000000000000000000000000000000000000000000000008152600401610c5793929190616f43565b6000866003811115613e7257613e72615ce4565b03613eed5767ffffffffffffffff808f1660009081526008602090815260408083208b83015173ffffffffffffffffffffffffffffffffffffffff168452909152812080549092169190613ec583616f69565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b866101800151876060015167ffffffffffffffff168f67ffffffffffffffff167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df28585604051613f3e929190616f90565b60405180910390a4505050505050505b6001016138a7565b505050505050505050565b600081847f000000000000000000000000000000000000000000000000000000000000000085604051602001613fd1949392919093845267ffffffffffffffff92831660208501529116604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b6040516020818303038152906040528051906020012090505b9392505050565b60005b8151811015610df85760ff831660009081526003602052604081208351909190849084908110614026576140266163b6565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055600101613ff4565b60005b82518160ff161015610b64576000838260ff16815181106140aa576140aa6163b6565b60200260200101519050600060028111156140c7576140c7615ce4565b60ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902054610100900416600281111561411357614113615ce4565b1461414d5760046040517f367f56a2000000000000000000000000000000000000000000000000000000008152600401610c579190616c85565b73ffffffffffffffffffffffffffffffffffffffff811661419a576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff1681526020018460028111156141c0576141c0615ce4565b905260ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845282529091208351815493167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841681178255918401519092909183917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561426557614265615ce4565b0217905550905050508061427890616fb0565b9050614087565b60ff8116610f9f57600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000016905550565b600081516020146142f157816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610c5791906153fe565b610e8b828060200190518101906143089190616f11565b614c76565b6000606060008361ffff1667ffffffffffffffff8111156143305761433061510b565b6040519080825280601f01601f19166020018201604052801561435a576020820181803683370190505b509150863b61438d577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a858110156143c0577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b85900360408104810387106143f9577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d8481111561441c5750835b808352806000602085013e50955095509592505050565b600061445f827f01ffc9a700000000000000000000000000000000000000000000000000000000614497565b8015610e8b5750614490827fffffffff00000000000000000000000000000000000000000000000000000000614497565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d9150600051905082801561454f575060208210155b801561455b5750600081115b979650505050505050565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b610100015160405160200161460998979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016146429190616fcf565b6040516020818303038152906040528051906020012087610160015160405160200161466e9190617091565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e0015b60405160208183030381529060405280519060200120905092915050565b600b5460009065010000000000900460ff1615614718576040517feced32bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000614725858585614cf0565b905061473081611762565b61473e57600091505061325b565b67ffffffffffffffff86166000908152600a6020908152604080832093835292905220549050949350505050565b60055461ffff168311156147c0576040517fa1e5205a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808716600483015285166024820152604401610c57565b80831461480d576040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808716600483015285166024820152604401610c57565b60055462010000900463ffffffff16821115612c1e576005546040517f1fd8fd04000000000000000000000000000000000000000000000000000000008152600481018890526201000090910463ffffffff16602482015260448101839052606401610c57565b60006002614883608085616456565b67ffffffffffffffff16614897919061647d565b67ffffffffffffffff8516600090815260096020526040812091925090816148c0608087616494565b67ffffffffffffffff1681526020810191909152604001600020549050816148ea60016004616414565b901b19168183600381111561490157614901615ce4565b67ffffffffffffffff871660009081526009602052604081209190921b92909217918291614930608088616494565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a59061499690879087906004016170a4565b600060405180830381600087803b1580156149b057600080fd5b505af19250505080156149c1575060015b614c5b573d8080156149ef576040519150601f19603f3d011682016040523d82523d6000602084013e6149f4565b606091505b506000614a008261722e565b90507f0a8d6e8c000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082161480614a9357507fe1cd5509000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80614adf57507f8d666f60000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80614b2b57507f78ef8024000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80614b7757507f0c3b563c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80614bc357507fae9b4ce9000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80614c0f57507f09c25325000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b15614c2057506003925090506127e7565b856101800151826040517f2b11b8d9000000000000000000000000000000000000000000000000000000008152600401610c57929190616f2a565b50506040805160208101909152600081526002909250929050565b600073ffffffffffffffffffffffffffffffffffffffff821180614c9b575061040082105b15614cec5760408051602081018490520160408051601f19818403018152908290527f8d666f60000000000000000000000000000000000000000000000000000000008252610c57916004016153fe565b5090565b8251825160009190818303614d31576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590614d4557506101018111155b614d7b576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82820101610100811115614ddc576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003614e095786600081518110614df757614df76163b6565b60200260200101519350505050613fea565b60008167ffffffffffffffff811115614e2457614e2461510b565b604051908082528060200260200182016040528015614e4d578160200160208202803683370190505b50905060008080805b85811015614f905760006001821b8b811603614eb15788851015614e9a578c5160018601958e918110614e8b57614e8b6163b6565b60200260200101519050614ed3565b8551600185019487918110614e8b57614e8b6163b6565b8b5160018401938d918110614ec857614ec86163b6565b602002602001015190505b600089861015614f03578d5160018701968f918110614ef457614ef46163b6565b60200260200101519050614f25565b8651600186019588918110614f1a57614f1a6163b6565b602002602001015190505b82851115614f5f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f698282615010565b878481518110614f7b57614f7b6163b6565b60209081029190910101525050600101614e56565b506001850382148015614fa257508683145b8015614fad57508581145b614fe3576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001860381518110614ff857614ff86163b6565b60200260200101519750505050505050509392505050565b600081831061502857615023828461502e565b610e88565b610e8883835b6040805160016020820152908101839052606081018290526000906080016146b1565b8280548282559060005260206000209081019282156150cb579160200282015b828111156150cb57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190615071565b50614cec9291506150f6565b604051806103e00160405280601f906020820280368337509192915050565b5b80821115614cec57600081556001016150f7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561515d5761515d61510b565b60405290565b6040516101a0810167ffffffffffffffff8111828210171561515d5761515d61510b565b60405160a0810167ffffffffffffffff8111828210171561515d5761515d61510b565b6040516080810167ffffffffffffffff8111828210171561515d5761515d61510b565b60405160e0810167ffffffffffffffff8111828210171561515d5761515d61510b565b6040516060810167ffffffffffffffff8111828210171561515d5761515d61510b565b604051601f8201601f1916810167ffffffffffffffff8111828210171561523c5761523c61510b565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f9f57600080fd5b803561527181615244565b919050565b803563ffffffff8116811461527157600080fd5b803561ffff8116811461527157600080fd5b60006101008083850312156152b057600080fd5b6040519081019067ffffffffffffffff821181831017156152d3576152d361510b565b81604052833591506152e482615244565b8181526152f360208501615276565b602082015261530460408501615276565b604082015261531560608501615276565b60608201526153266080850161528a565b608082015261533760a08501615276565b60a082015261534860c08501615266565b60c082015261535960e08501615266565b60e0820152949350505050565b60608101610e8b8284805167ffffffffffffffff16825260208082015173ffffffffffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60005b838110156153c95781810151838201526020016153b1565b50506000910152565b600081518084526153ea8160208601602086016153ae565b601f01601f19169290920160200192915050565b602081526000610e8860208301846153d2565b60006020828403121561542357600080fd5b813564ffffffffff81168114613fea57600080fd5b8060608101831015610e8b57600080fd5b60008083601f84011261545b57600080fd5b50813567ffffffffffffffff81111561547357600080fd5b6020830191508360208285010111156127e757600080fd5b60008083601f84011261549d57600080fd5b50813567ffffffffffffffff8111156154b557600080fd5b6020830191508360208260051b85010111156127e757600080fd5b60008060008060008060008060e0898b0312156154ec57600080fd5b6154f68a8a615438565b9750606089013567ffffffffffffffff8082111561551357600080fd5b61551f8c838d01615449565b909950975060808b013591508082111561553857600080fd5b6155448c838d0161548b565b909750955060a08b013591508082111561555d57600080fd5b5061556a8b828c0161548b565b999c989b50969995989497949560c00135949350505050565b60008060006080848603121561559857600080fd5b6155a28585615438565b9250606084013567ffffffffffffffff8111156155be57600080fd5b6155ca86828701615449565b9497909650939450505050565b600067ffffffffffffffff8211156155f1576155f161510b565b5060051b60200190565b67ffffffffffffffff81168114610f9f57600080fd5b8035615271816155fb565b8015158114610f9f57600080fd5b80356152718161561c565b600067ffffffffffffffff82111561564f5761564f61510b565b50601f01601f191660200190565b600082601f83011261566e57600080fd5b813561568161567c82615635565b615213565b81815284602083860101111561569657600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126156c457600080fd5b813560206156d461567c836155d7565b82815260069290921b840181019181810190868411156156f357600080fd5b8286015b8481101561573b57604081890312156157105760008081fd5b61571861513a565b813561572381615244565b815281850135858201528352918301916040016156f7565b509695505050505050565b600082601f83011261575757600080fd5b8135602061576761567c836155d7565b82815260059290921b8401810191818101908684111561578657600080fd5b8286015b8481101561573b57803567ffffffffffffffff8111156157aa5760008081fd5b6157b88986838b010161565d565b84525091830191830161578a565b60006101a082840312156157d957600080fd5b6157e1615163565b90506157ec82615611565b81526157fa60208301615266565b602082015261580b60408301615266565b604082015261581c60608301615611565b60608201526080820135608082015261583760a0830161562a565b60a082015261584860c08301615611565b60c082015261585960e08301615266565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561588657600080fd5b6158928683870161565d565b838501526101409250828501359150808211156158ae57600080fd5b6158ba868387016156b3565b838501526101609250828501359150808211156158d657600080fd5b506158e385828601615746565b82840152505061018080830135818301525092915050565b600082601f83011261590c57600080fd5b8135602061591c61567c836155d7565b82815260059290921b8401810191818101908684111561593b57600080fd5b8286015b8481101561573b57803567ffffffffffffffff81111561595f5760008081fd5b61596d8986838b01016157c6565b84525091830191830161593f565b600082601f83011261598c57600080fd5b8135602061599c61567c836155d7565b82815260059290921b840181019181810190868411156159bb57600080fd5b8286015b8481101561573b57803567ffffffffffffffff8111156159df5760008081fd5b6159ed8986838b0101615746565b8452509183019183016159bf565b600082601f830112615a0c57600080fd5b81356020615a1c61567c836155d7565b8083825260208201915060208460051b870101935086841115615a3e57600080fd5b602086015b8481101561573b5780358352918301918301615a43565b600082601f830112615a6b57600080fd5b81356020615a7b61567c836155d7565b82815260059290921b84018101918181019086841115615a9a57600080fd5b8286015b8481101561573b57803567ffffffffffffffff80821115615abf5760008081fd5b818901915060a080601f19848d03011215615ada5760008081fd5b615ae2615187565b615aed888501615611565b815260408085013584811115615b035760008081fd5b615b118e8b838901016158fb565b8a8401525060608086013585811115615b2a5760008081fd5b615b388f8c838a010161597b565b8385015250608091508186013585811115615b535760008081fd5b615b618f8c838a01016159fb565b9184019190915250919093013590830152508352918301918301615a9e565b6000806040808486031215615b9457600080fd5b833567ffffffffffffffff80821115615bac57600080fd5b615bb887838801615a5a565b9450602091508186013581811115615bcf57600080fd5b8601601f81018813615be057600080fd5b8035615bee61567c826155d7565b81815260059190911b8201840190848101908a831115615c0d57600080fd5b8584015b83811015615c9957803586811115615c295760008081fd5b8501603f81018d13615c3b5760008081fd5b87810135615c4b61567c826155d7565b81815260059190911b82018a0190898101908f831115615c6b5760008081fd5b928b01925b82841015615c895783358252928a0192908a0190615c70565b8652505050918601918601615c11565b50809750505050505050509250929050565b60008060408385031215615cbe57600080fd5b8235615cc9816155fb565b91506020830135615cd9816155fb565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110615d2357615d23615ce4565b9052565b60208101610e8b8284615d13565b73ffffffffffffffffffffffffffffffffffffffff8151168252602081015163ffffffff808216602085015280604084015116604085015280606084015116606085015261ffff60808401511660808501528060a08401511660a0850152505060c0810151615dbc60c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e0810151610df860e084018273ffffffffffffffffffffffffffffffffffffffff169052565b6101008101610e8b8284615d35565b60006020808385031215615e0657600080fd5b823567ffffffffffffffff811115615e1d57600080fd5b8301601f81018513615e2e57600080fd5b8035615e3c61567c826155d7565b81815260079190911b82018301908381019087831115615e5b57600080fd5b928401925b8284101561455b5760808489031215615e795760008081fd5b615e816151aa565b8435615e8c816155fb565b815284860135615e9b8161561c565b81870152604085810135615eae81615244565b90820152606085810135615ec181615244565b9082015282526080939093019290840190615e60565b600060208284031215615ee957600080fd5b813567ffffffffffffffff811115615f0057600080fd5b820160a08185031215613fea57600080fd5b60008060408385031215615f2557600080fd5b8235615f30816155fb565b91506020830135615cd981615244565b600060208284031215615f5257600080fd5b8135613fea816155fb565b803560ff8116811461527157600080fd5b600060208284031215615f8057600080fd5b610e8882615f5d565b60008151808452602080850194506020840160005b83811015615fd057815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101615f9e565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff60408201511660608401526060810151151560808401526080810151151560a084015250602083015160e060c0840152616037610100840182615f89565b90506040840151601f198483030160e08501526160548282615f89565b95945050505050565b6000806040838503121561607057600080fd5b823561607b816155fb565b946020939093013593505050565b6000806020838503121561609c57600080fd5b823567ffffffffffffffff808211156160b457600080fd5b818501915085601f8301126160c857600080fd5b8135818111156160d757600080fd5b8660208260061b85010111156160ec57600080fd5b60209290920196919550909350505050565b600082601f83011261610f57600080fd5b8135602061611f61567c836155d7565b8083825260208201915060208460051b87010193508684111561614157600080fd5b602086015b8481101561573b57803561615981615244565b8352918301918301616146565b6000602080838503121561617957600080fd5b823567ffffffffffffffff8082111561619157600080fd5b818501915085601f8301126161a557600080fd5b81356161b361567c826155d7565b81815260059190911b830184019084810190888311156161d257600080fd5b8585015b838110156162b9578035858111156161ed57600080fd5b860160e0818c03601f190112156162045760008081fd5b61620c6151cd565b888201358152604061621f818401615f5d565b8a8301526060616230818501615f5d565b828401526080915061624382850161562a565b9083015260a061625484820161562a565b8284015260c09150818401358981111561626e5760008081fd5b61627c8f8d838801016160fe565b82850152505060e0830135888111156162955760008081fd5b6162a38e8c838701016160fe565b91830191909152508452509186019186016161d6565b5098975050505050505050565b6000602082840312156162d857600080fd5b8135613fea81615244565b600080604083850312156162f657600080fd5b823567ffffffffffffffff8082111561630e57600080fd5b61631a868387016157c6565b9350602085013591508082111561633057600080fd5b5061633d85828601615746565b9150509250929050565b60006020828403121561635957600080fd5b5035919050565b61016081016163a98285805167ffffffffffffffff16825260208082015173ffffffffffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b613fea6060830184615d35565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610e8b57610e8b6163e5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061647157616471616427565b92169190910692915050565b8082028115828204841417610e8b57610e8b6163e5565b600067ffffffffffffffff808416806164af576164af616427565b92169190910492915050565b6000602082840312156164cd57600080fd5b8151613fea8161561c565b6000604082840312156164ea57600080fd5b6164f261513a565b82356164fd816155fb565b81526020928301359281019290925250919050565b60008151808452602080850194506020840160005b83811015615fd0578151805173ffffffffffffffffffffffffffffffffffffffff1688526020908101519088015260408701965090820190600101616527565b8051825267ffffffffffffffff60208201511660208301526000604082015160a0604085015261659a60a08501826153d2565b9050606083015184820360608601526165b382826153d2565b915050608083015184820360808601526160548282616512565b602081526000610e886020830184616567565b6080815260006165f36080830187616567565b61ffff95909516602083015250604081019290925273ffffffffffffffffffffffffffffffffffffffff16606090910152919050565b600082601f83011261663a57600080fd5b815161664861567c82615635565b81815284602083860101111561665d57600080fd5b61325b8260208301602087016153ae565b60008060006060848603121561668357600080fd5b835161668e8161561c565b602085015190935067ffffffffffffffff8111156166ab57600080fd5b6166b786828701616629565b925050604084015190509250925092565b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461527157600080fd5b600082601f83011261670557600080fd5b8135602061671561567c836155d7565b82815260069290921b8401810191818101908684111561673457600080fd5b8286015b8481101561573b57604081890312156167515760008081fd5b61675961513a565b8135616764816155fb565b81526167718286016166c8565b81860152835291830191604001616738565b600082601f83011261679457600080fd5b813560206167a461567c836155d7565b82815260079290921b840181019181810190868411156167c357600080fd5b8286015b8481101561573b5780880360808112156167e15760008081fd5b6167e96151f0565b82356167f4816155fb565b81526040601f19830181131561680a5760008081fd5b61681261513a565b925086840135616821816155fb565b835283810135616830816155fb565b83880152818701929092526060830135918101919091528352918301916080016167c7565b6000602080838503121561686857600080fd5b823567ffffffffffffffff8082111561688057600080fd5b8185019150604080838803121561689657600080fd5b61689e61513a565b8335838111156168ad57600080fd5b84016040818a0312156168bf57600080fd5b6168c761513a565b8135858111156168d657600080fd5b8201601f81018b136168e757600080fd5b80356168f561567c826155d7565b81815260069190911b8201890190898101908d83111561691457600080fd5b928a01925b828410156169645787848f0312156169315760008081fd5b61693961513a565b843561694481615244565b8152616951858d016166c8565b818d0152825292870192908a0190616919565b84525050508187013593508484111561697c57600080fd5b6169888a8584016166f4565b81880152825250838501359150828211156169a257600080fd5b6169ae88838601616783565b85820152809550505050505092915050565b805160408084528151848201819052600092602091908201906060870190855b81811015616a39578351805173ffffffffffffffffffffffffffffffffffffffff1684528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168584015292840192918501916001016169e0565b50508583015187820388850152805180835290840192506000918401905b80831015616aa8578351805167ffffffffffffffff1683528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1685830152928401926001929092019190850190616a57565b50979650505050505050565b602081526000610e8860208301846169c0565b67ffffffffffffffff8316815260608101613fea6020830184805167ffffffffffffffff908116835260209182015116910152565b67ffffffffffffffff818116838216019080821115616b1d57616b1d6163e5565b5092915050565b600060208083526060845160408084870152616b4360608701836169c0565b87850151878203601f19016040890152805180835290860193506000918601905b808310156162b957845167ffffffffffffffff815116835287810151616ba389850182805167ffffffffffffffff908116835260209182015116910152565b50840151828701529386019360019290920191608090910190616b64565b80820180821115610e8b57610e8b6163e5565b60ff8181168382160190811115610e8b57610e8b6163e5565b600060ff831680616c0057616c00616427565b8060ff84160491505092915050565b8183823760009101908152919050565b828152606082602083013760800192915050565b600060208284031215616c4557600080fd5b813567ffffffffffffffff811115616c5c57600080fd5b61325b84828501615a5a565b600060208284031215616c7a57600080fd5b8151613fea816155fb565b6020810160058310616c9957616c99615ce4565b91905290565b60ff8181168382160290811690818114616b1d57616b1d6163e5565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b81811015616d2257845473ffffffffffffffffffffffffffffffffffffffff1683526001948501949284019201616cf0565b50508481036060860152616d368188615f89565b935050505060ff831660808301529695505050505050565b600060208284031215616d6057600080fd5b815167ffffffffffffffff80821115616d7857600080fd5b9083019060608286031215616d8c57600080fd5b616d946151f0565b825182811115616da357600080fd5b616daf87828601616629565b825250602083015182811115616dc457600080fd5b616dd087828601616629565b602083015250604083015182811115616de857600080fd5b616df487828601616629565b60408301525095945050505050565b600060208284031215616e1557600080fd5b8151613fea81615244565b6020815260008251610100806020850152616e3f6101208501836153d2565b91506020850151616e5c604086018267ffffffffffffffff169052565b50604085015173ffffffffffffffffffffffffffffffffffffffff8116606086015250606085015160808501526080850151616eb060a086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a0850151601f19808685030160c0870152616ecd84836153d2565b935060c08701519150808685030160e0870152616eea84836153d2565b935060e0870151915080868503018387015250616f0783826153d2565b9695505050505050565b600060208284031215616f2357600080fd5b5051919050565b82815260406020820152600061325b60408301846153d2565b67ffffffffffffffff8481168252831660208201526060810161325b6040830184615d13565b600067ffffffffffffffff808316818103616f8657616f866163e5565b6001019392505050565b616f9a8184615d13565b60406020820152600061325b60408301846153d2565b600060ff821660ff8103616fc657616fc66163e5565b60010192915050565b6020808252825182820181905260009190848201906040850190845b8181101561702b578351805173ffffffffffffffffffffffffffffffffffffffff1684526020908101519084015260408301938501939250600101616feb565b50909695505050505050565b60008282518085526020808601955060208260051b8401016020860160005b8481101561708457601f198684030189526170728383516153d2565b98840198925090830190600101617056565b5090979650505050505050565b602081526000610e886020830184617037565b604081526170bf60408201845167ffffffffffffffff169052565b600060208401516170e8606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c08401516101006171568185018367ffffffffffffffff169052565b60e086015191506101206171818186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a061016081818701526171b16101e08701856153d2565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06101808188870301818901526171f08686616512565b9550828a0151945081888703018489015261720b8686617037565b9550808a01516101c0890152505050505082810360208401526160548185617037565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156172765780818460040360031b1b83161693505b50505091905056fea164736f6c6343000818000a", } var EVM2EVMMultiOffRampABI = EVM2EVMMultiOffRampMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go index c2c6b27ffc..6f5ad8ea92 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go @@ -107,7 +107,7 @@ type RateLimiterTokenBucket struct { var EVM2EVMOffRampMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumOCR2BaseNoChecks.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllRateLimitTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6101a06040523480156200001257600080fd5b50604051620066c9380380620066c98339810160408190526200003591620004ec565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c081620002ca565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508201516001600160a01b031615806200016f575081516001600160a01b0316155b8062000186575060c08201516001600160a01b0316155b15620001a5576040516342bcdf7f60e11b815260040160405180910390fd5b81600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020e9190620005b5565b6001600160401b03166001146200023857604051636fc2a20760e11b815260040160405180910390fd5b81516001600160a01b0390811660a090815260408401516001600160401b0390811660c0908152602086015190911660e05260608501518316610100526080850151831661014052908401518216610160528301511661018052620002bd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000375565b6101205250620005da9050565b336001600160a01b03821603620003245760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e05161010051604051602001620003bf94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b60405160e081016001600160401b03811182821017156200040d57634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200042b57600080fd5b919050565b80516001600160401b03811681146200042b57600080fd5b80516001600160801b03811681146200042b57600080fd5b6000606082840312156200047357600080fd5b604051606081016001600160401b0381118282101715620004a457634e487b7160e01b600052604160045260246000fd5b806040525080915082518015158114620004bd57600080fd5b8152620004cd6020840162000448565b6020820152620004e06040840162000448565b60408201525092915050565b6000808284036101408112156200050257600080fd5b60e08112156200051157600080fd5b506200051c620003dc565b620005278462000413565b8152620005376020850162000430565b60208201526200054a6040850162000430565b60408201526200055d6060850162000413565b6060820152620005706080850162000413565b60808201526200058360a0850162000413565b60a08201526200059660c0850162000413565b60c08201529150620005ac8460e0850162000460565b90509250929050565b600060208284031215620005c857600080fd5b620005d38262000430565b9392505050565b60805160a05160c05160e0516101005161012051610140516101605161018051616000620006c96000396000818161032001528181611c9001526136910152600081816102e401528181611c690152611f1b0152600081816102a801528181610fdd0152818161105f01528181611c42015281816124eb0152612572015260006120c701526000818161026c0152611c1801526000818161020c0152611bc601526000818161023c01528181611bf001528181611ed8015281816130af01526137cf0152600081816101d001528181611b9801526121b4015260008181611e320152611e7e01526160006000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806381ff7048116100d8578063afcb95d71161008c578063f077b59211610066578063f077b592146106bb578063f2fde38b146106d1578063f52121a5146106e457600080fd5b8063afcb95d714610675578063b1dc65a414610695578063c92b2832146106a857600080fd5b8063856c8247116100bd578063856c824714610618578063873504d7146106445780638da5cb5b1461065757600080fd5b806381ff7048146105da57806385572ffb1461060a57600080fd5b8063599f64311161013a578063740f415011610114578063740f4150146104bc5780637437ff9f146104cf57806379ba5097146105d257600080fd5b8063599f643114610455578063666cab8d14610494578063704b6c02146104a957600080fd5b8063181f5a771161016b578063181f5a77146103935780631ef38174146103dc578063546719cd146103f157600080fd5b806306285c6914610187578063142a98fc14610373575b600080fd5b61035d6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b60405161036a91906145e7565b60405180910390f35b61038661038136600461468a565b6106f7565b60405161036a91906146ea565b6103cf6040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b60405161036a9190614748565b6103ef6103ea3660046149c4565b610772565b005b6103f9610b9a565b60405161036a919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161036a565b61049c610c4f565b60405161036a9190614ae3565b6103ef6104b7366004614af6565b610cbe565b6103ef6104ca366004614f56565b610dae565b6105c56040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152506040805160e081018252600a5463ffffffff808216835264010000000082048116602084015261ffff680100000000000000008304169383019390935273ffffffffffffffffffffffffffffffffffffffff6a010000000000000000000090910481166060830152600b549081166080830152740100000000000000000000000000000000000000008104831660a08301527801000000000000000000000000000000000000000000000000900490911660c082015290565b60405161036a9190615011565b6103ef610ea5565b6007546005546040805163ffffffff8085168252640100000000909404909316602084015282015260600161036a565b6103ef61018236600461508c565b61062b610626366004614af6565b610fa2565b60405167ffffffffffffffff909116815260200161036a565b6103ef610652366004615158565b6110d1565b60005473ffffffffffffffffffffffffffffffffffffffff1661046f565b60408051600181526000602082018190529181019190915260600161036a565b6103ef6106a3366004615201565b6112b9565b6103ef6106b6366004615306565b6114d1565b6106c3611556565b60405161036a929190615356565b6103ef6106df366004614af6565b6116a3565b6103ef6106f236600461537b565b6116b4565b600061070560016004615404565b6002610712608085615446565b67ffffffffffffffff16610726919061546d565b60106000610735608087615484565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c16600381111561076c5761076c6146a7565b92915050565b84518460ff16601f8211156107bf5760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016107b691906154ab565b60405180910390fd5b806000036107fc5760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016107b691906154ab565b61080461191b565b61080d8561199e565b60095460005b81811015610891576008600060098381548110610832576108326154c5565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055600101610813565b5050865160005b81811015610a5b5760008982815181106108b4576108b46154c5565b60200260200101519050600060028111156108d1576108d16146a7565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff166002811115610910576109106146a7565b1461094a5760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016107b691906154ab565b73ffffffffffffffffffffffffffffffffffffffff8116610997576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610a4757610a476146a7565b021790555090505050806001019050610898565b508751610a6f9060099060208b0190614551565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908a161717905560078054610af5914691309190600090610ac79063ffffffff166154f4565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168c8c8c8c8c8c611cf0565b6005819055600780544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff841681179094556040519083048216947f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0594610b869487949293918316921691909117908f908f908f908f908f908f90615517565b60405180910390a150505050505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610c4a90611d7d565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610cb457602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610c89575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590610cfe575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15610d35576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b610db6611e2f565b81515181518114610df3576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610e95576000838281518110610e1257610e126154c5565b6020026020010151905080600014158015610e4b57508451805183908110610e3c57610e3c6154c5565b60200260200101516080015181105b15610e8c576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016107b6565b50600101610df6565b50610ea08383611eb0565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016107b6565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600f602052604081205467ffffffffffffffff168015801561101557507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b1561076c576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156110a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ca91906155ad565b9392505050565b6110d961191b565b60005b82518110156111b9576111168382815181106110fa576110fa6154c5565b602002602001015160200151600c6129a590919063ffffffff16565b156111b1577fcbf3cbeaed4ac1d605ed30f4af06c35acaeff2379db7f6146c9cceee83d5878283828151811061114e5761114e6154c5565b60200260200101516000015184838151811061116c5761116c6154c5565b6020026020010151602001516040516111a892919073ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b60405180910390a15b6001016110dc565b5060005b8151811015610ea0576112168282815181106111db576111db6154c5565b6020026020010151602001518383815181106111f9576111f96154c5565b602002602001015160000151600c6129c79092919063ffffffff16565b156112b1577ffc23abf7ddbd3c02b1420dafa2355c56c1a06fbb8723862ac14d6bd74177361a82828151811061124e5761124e6154c5565b60200260200101516000015183838151811061126c5761126c6154c5565b6020026020010151602001516040516112a892919073ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b60405180910390a15b6001016111bd565b6112c387876129f2565b60055488359080821461130c576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016107b6565b611314611e2f565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561139c5761139c6146a7565b60028111156113ad576113ad6146a7565b90525090506002816020015160028111156113ca576113ca6146a7565b14801561141157506009816000015160ff16815481106113ec576113ec6154c5565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611447576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600061145585602061546d565b61146088602061546d565b61146c8b6101446155ca565b61147691906155ca565b61148091906155ca565b90503681146114c4576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016107b6565b5050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611511575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611548576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611553600382612a19565b50565b6060806000611565600c612bfe565b90508067ffffffffffffffff8111156115805761158061475b565b6040519080825280602002602001820160405280156115a9578160200160208202803683370190505b5092508067ffffffffffffffff8111156115c5576115c561475b565b6040519080825280602002602001820160405280156115ee578160200160208202803683370190505b50915060005b8181101561169d5760008061160a600c84612c09565b9150915080868481518110611621576116216154c5565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508185848151811061166e5761166e6154c5565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250506001016115f4565b50509091565b6116ab61191b565b61155381612c27565b3330146116ed576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516000808252602082019092528161172a565b60408051808201909152600080825260208201528152602001906001900390816117035790505b506101408401515190915015611797576117948361014001518460200151604051602001611774919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b604051602081830303815290604052856040015186610160015186612d1c565b90505b610120830151511580156117ad57506080830151155b806117d15750604083015173ffffffffffffffffffffffffffffffffffffffff163b155b8061181e5750604083015161181c9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb00000000000000000000000000000000000000000000000000000000612e5a565b155b1561182857505050565b600a5460009081906a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16633cf979836118638786612e76565b611388886080015189604001516040518563ffffffff1660e01b815260040161188f949392919061562f565b6000604051808303816000875af11580156118ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118d69190810190615746565b50915091508161191457806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107b69190614748565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461199c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107b6565b565b6000818060200190518101906119b491906157bf565b606081015190915073ffffffffffffffffffffffffffffffffffffffff16611a08576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015160408087015160608089015173ffffffffffffffffffffffffffffffffffffffff9081166a0100000000000000000000027fffff0000000000000000000000000000000000000000ffffffffffffffffffff61ffff9094166801000000000000000002939093167fffff00000000000000000000000000000000000000000000ffffffffffffffff63ffffffff968716640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009099169a87169a909a1797909717989098169590951717909455608080870151600b805460a0808b015160c0808d015188167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff9290981674010000000000000000000000000000000000000000027fffffffffffffffff000000000000000000000000000000000000000000000000909416958c16959095179290921791909116949094179055855160e0810187527f00000000000000000000000000000000000000000000000000000000000000008816815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848701527f00000000000000000000000000000000000000000000000000000000000000008716948401949094527f00000000000000000000000000000000000000000000000000000000000000008616908301527f00000000000000000000000000000000000000000000000000000000000000008516908201527f000000000000000000000000000000000000000000000000000000000000000090931690830152517ff02fcc22535d64d92d17b995475893d63edd51da163fed74a6ee9b4bc4895cc491611ce491849061585a565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611d1499989796959493929190615950565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611e0b82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611def9190615404565b85608001516fffffffffffffffffffffffffffffffff16612f26565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b467f00000000000000000000000000000000000000000000000000000000000000001461199c576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016107b6565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060801b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9b91906159e5565b15611fd2576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815151600081900361200f576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826020015151811461204d576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff8111156120685761206861475b565b604051908082528060200260200182016040528015612091578160200160208202803683370190505b50905060005b82811015612169576000856000015182815181106120b7576120b76154c5565b602002602001015190506120eb817f0000000000000000000000000000000000000000000000000000000000000000612f45565b8383815181106120fd576120fd6154c5565b602002602001018181525050806101800151838381518110612121576121216154c5565b602002602001015114612160576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101612097565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016926332048875926121ea92879291600401615a33565b602060405180830381865afa158015612207573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222b9190615a69565b905080600003612267576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b8481101561299c5760008760000151828151811061228e5761228e6154c5565b6020026020010151905060006122a782606001516106f7565b905060028160038111156122bd576122bd6146a7565b0361230457816060015167ffffffffffffffff167fe3dd0bec917c965a133ddb2c84874725ee1e2fd8d763c19efa36d6a11cd82b1f60405160405180910390a25050612994565b6000816003811115612318576123186146a7565b148061233557506003816003811115612333576123336146a7565b145b61237d5760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107b6565b831561243a57600a5460009063ffffffff166123998742615404565b11905080806123b9575060038260038111156123b7576123b76146a7565b145b6123ef576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b888481518110612401576124016154c5565b602002602001015160001461243457888481518110612422576124226154c5565b60200260200101518360800181815250505b50612497565b600081600381111561244e5761244e6146a7565b146124975760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107b6565b60c082015167ffffffffffffffff16156127685760208083015173ffffffffffffffffffffffffffffffffffffffff166000908152600f909152604090205467ffffffffffffffff168015801561252357507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b156126c65760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156125bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125df91906155ad565b60c084015190915067ffffffffffffffff166125fc826001615a82565b67ffffffffffffffff161461266957826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050612994565b60208381015173ffffffffffffffffffffffffffffffffffffffff166000908152600f9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b60008260038111156126da576126da6146a7565b036127665760c083015167ffffffffffffffff166126f9826001615a82565b67ffffffffffffffff161461276657826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050612994565b505b600089602001518481518110612780576127806154c5565b602002602001015190506127ac83606001518460000151856101400151518661012001515185516130ad565b6127bb83606001516001613227565b6000806127c885846132d1565b915091506127da856060015183613227565b8680156127f8575060038260038111156127f6576127f66146a7565b145b1561283157806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107b69190614748565b6003826003811115612845576128456146a7565b1415801561286557506002826003811115612862576128626146a7565b14155b156128a4578460600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016107b6929190615aa3565b60008560c0015167ffffffffffffffff161180156128d3575060008460038111156128d1576128d16146a7565b145b156129405760208086015173ffffffffffffffffffffffffffffffffffffffff166000908152600f90915260408120805467ffffffffffffffff169161291883615ac1565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b846101800151856060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef658484604051612986929190615ade565b60405180910390a350505050505b60010161226e565b50505050505050565b60006110ca8373ffffffffffffffffffffffffffffffffffffffff84166135c4565b60006129ea8473ffffffffffffffffffffffffffffffffffffffff8516846135d0565b949350505050565b612a15612a0182840184615afe565b604080516000815260208101909152611eb0565b5050565b8154600090612a4290700100000000000000000000000000000000900463ffffffff1642615404565b90508015612ae45760018301548354612a8a916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612f26565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612b0a916fffffffffffffffffffffffffffffffff90811691166135f3565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612bf19084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b600061076c82613609565b6000808080612c188686613614565b909450925050505b9250929050565b3373ffffffffffffffffffffffffffffffffffffffff821603612ca6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107b6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b846000805b8751811015612e3f57612d99888281518110612d3f57612d3f6154c5565b6020026020010151602001518888888581518110612d5f57612d5f6154c5565b6020026020010151806020019051810190612d7a9190615b33565b888681518110612d8c57612d8c6154c5565b6020026020010151613623565b838281518110612dab57612dab6154c5565b6020026020010181905250612de7838281518110612dcb57612dcb6154c5565b602002602001015160000151600c613abd90919063ffffffff16565b15612e3757612e2a838281518110612e0157612e016154c5565b6020908102919091010151600b5473ffffffffffffffffffffffffffffffffffffffff16613adf565b612e3490836155ca565b91505b600101612d21565b508015612e4f57612e4f81613c1a565b505b95945050505050565b6000612e6583613c27565b80156110ca57506110ca8383613c8b565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff1681526020018460200151604051602001612efb919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b6000612e5185612f36848661546d565b612f4090876155ca565b6135f3565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001612fe898979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016130219190615be8565b6040516020818303038152906040528051906020012087610160015160405160200161304d9190615c55565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614613126576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016107b6565b600a5468010000000000000000900461ffff1683111561317e576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016107b6565b8083146131c3576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016107b6565b600a54640100000000900463ffffffff1682111561191457600a546040517f8693378900000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff166004820152602481018390526044016107b6565b60006002613236608085615446565b67ffffffffffffffff1661324a919061546d565b9050600060108161325c608087615484565b67ffffffffffffffff16815260208101919091526040016000205490508161328660016004615404565b901b19168183600381111561329d5761329d6146a7565b901b1780601060006132b0608088615484565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a5906133159087908790600401615c68565b600060405180830381600087803b15801561332f57600080fd5b505af1925050508015613340575060015b6135a9573d80801561336e576040519150601f19603f3d011682016040523d82523d6000602084013e613373565b606091505b5061337d81615df2565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c00000000000000000000000000000000000000000000000000000000148061341557506133d081615df2565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b80613469575061342481615df2565b7fffffffff00000000000000000000000000000000000000000000000000000000167f8d666f6000000000000000000000000000000000000000000000000000000000145b806134bd575061347881615df2565b7fffffffff00000000000000000000000000000000000000000000000000000000167f78ef802400000000000000000000000000000000000000000000000000000000145b8061351157506134cc81615df2565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0c3b563c00000000000000000000000000000000000000000000000000000000145b80613565575061352081615df2565b7fffffffff00000000000000000000000000000000000000000000000000000000167fae9b4ce900000000000000000000000000000000000000000000000000000000145b1561357557600392509050612c20565b806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107b69190614748565b50506040805160208101909152600081526002909250929050565b60006110ca8383613d5a565b60006129ea848473ffffffffffffffffffffffffffffffffffffffff8516613d77565b600081831061360257816110ca565b5090919050565b600061076c82613d94565b6000808080612c188686613d9f565b604080518082019091526000808252602082015260006136468460200151613dca565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa1580156136d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fc9190615e42565b905073ffffffffffffffffffffffffffffffffffffffff8116158061375e575061375c73ffffffffffffffffffffffffffffffffffffffff82167faff2afbf00000000000000000000000000000000000000000000000000000000612e5a565b155b156137ad576040517fae9b4ce900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016107b6565b6000806138f0633907753760e01b6040518061010001604052808c81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018d81526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6000015181526020018a604001518152602001898152506040516024016138639190615e5f565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600b54859063ffffffff74010000000000000000000000000000000000000000909104166113886084613e25565b50915091508161392e57806040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107b69190614748565b80516020146139765780516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016107b6565b60008180602001905181019061398c9190615a69565b6040805173ffffffffffffffffffffffffffffffffffffffff8c16602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052600b54919250613a469187907801000000000000000000000000000000000000000000000000900463ffffffff166113886084613e25565b50909350915082613a8557816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107b69190614748565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff9095168552602085015250919250505095945050505050565b60006110ca8373ffffffffffffffffffffffffffffffffffffffff8416613f4b565b81516040517fd02641a000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015260009182919084169063d02641a0906024016040805180830381865afa158015613b52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b769190615f50565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613bec5783516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016107b6565b60208401516129ea907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690613f57565b6115536003826000613f94565b6000613c53827f01ffc9a700000000000000000000000000000000000000000000000000000000613c8b565b801561076c5750613c84827fffffffff00000000000000000000000000000000000000000000000000000000613c8b565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613d43575060208210155b8015613d4f5750600081115b979650505050505050565b600081815260028301602052604081208190556110ca8383614317565b600082815260028401602052604081208290556129ea8484614323565b600061076c8261432f565b60008080613dad8585614339565b600081815260029690960160205260409095205494959350505050565b60008151602014613e0957816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016107b69190614748565b61076c82806020019051810190613e209190615a69565b614345565b6000606060008361ffff1667ffffffffffffffff811115613e4857613e4861475b565b6040519080825280601f01601f191660200182016040528015613e72576020820181803683370190505b509150863b613ea5577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613ed8577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613f11577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613f345750835b808352806000602085013e50955095509592505050565b60006110ca83836143bf565b6000670de0b6b3a7640000613f8a837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff861661546d565b6110ca9190615fb0565b825474010000000000000000000000000000000000000000900460ff161580613fbb575081155b15613fc557505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061400b90700100000000000000000000000000000000900463ffffffff1642615404565b905080156140cb578183111561404d576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546140879083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612f26565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156141825773ffffffffffffffffffffffffffffffffffffffff841661412a576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016107b6565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016107b6565b848310156142955760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906141c69082615404565b6141d0878a615404565b6141da91906155ca565b6141e49190615fb0565b905073ffffffffffffffffffffffffffffffffffffffff861661423d576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016107b6565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016107b6565b61429f8584615404565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60006110ca83836143de565b60006110ca83836144d8565b600061076c825490565b60006110ca8383614527565b600073ffffffffffffffffffffffffffffffffffffffff82118061436a575061040082105b156143bb5760408051602081018490520160408051601f19818403018152908290527f8d666f600000000000000000000000000000000000000000000000000000000082526107b691600401614748565b5090565b60006110ca8383600081815260018301602052604081205415156110ca565b600081815260018301602052604081205480156144c7576000614402600183615404565b855490915060009061441690600190615404565b905081811461447b576000866000018281548110614436576144366154c5565b9060005260206000200154905080876000018481548110614459576144596154c5565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061448c5761448c615fc4565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061076c565b600091505061076c565b5092915050565b600081815260018301602052604081205461451f5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561076c565b50600061076c565b600082600001828154811061453e5761453e6154c5565b9060005260206000200154905092915050565b8280548282559060005260206000209081019282156145cb579160200282015b828111156145cb57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614571565b506143bb9291505b808211156143bb57600081556001016145d3565b60e0810161076c828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b67ffffffffffffffff8116811461155357600080fd5b803561468581614664565b919050565b60006020828403121561469c57600080fd5b81356110ca81614664565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106146e6576146e66146a7565b9052565b6020810161076c82846146d6565b60005b838110156147135781810151838201526020016146fb565b50506000910152565b600081518084526147348160208601602086016146f8565b601f01601f19169290920160200192915050565b6020815260006110ca602083018461471c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156147ad576147ad61475b565b60405290565b6040516101a0810167ffffffffffffffff811182821017156147ad576147ad61475b565b6040516080810167ffffffffffffffff811182821017156147ad576147ad61475b565b6040516060810167ffffffffffffffff811182821017156147ad576147ad61475b565b60405160e0810167ffffffffffffffff811182821017156147ad576147ad61475b565b604051601f8201601f1916810167ffffffffffffffff811182821017156148695761486961475b565b604052919050565b600067ffffffffffffffff82111561488b5761488b61475b565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461155357600080fd5b803561468581614895565b600082601f8301126148d357600080fd5b813560206148e86148e383614871565b614840565b8083825260208201915060208460051b87010193508684111561490a57600080fd5b602086015b8481101561492f57803561492281614895565b835291830191830161490f565b509695505050505050565b803560ff8116811461468557600080fd5b600067ffffffffffffffff8211156149655761496561475b565b50601f01601f191660200190565b600082601f83011261498457600080fd5b81356149926148e38261494b565b8181528460208386010111156149a757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156149dd57600080fd5b863567ffffffffffffffff808211156149f557600080fd5b614a018a838b016148c2565b97506020890135915080821115614a1757600080fd5b614a238a838b016148c2565b9650614a3160408a0161493a565b95506060890135915080821115614a4757600080fd5b614a538a838b01614973565b9450614a6160808a0161467a565b935060a0890135915080821115614a7757600080fd5b50614a8489828a01614973565b9150509295509295509295565b60008151808452602080850194506020840160005b83811015614ad857815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614aa6565b509495945050505050565b6020815260006110ca6020830184614a91565b600060208284031215614b0857600080fd5b81356110ca81614895565b801515811461155357600080fd5b803561468581614b13565b600082601f830112614b3d57600080fd5b81356020614b4d6148e383614871565b82815260069290921b84018101918181019086841115614b6c57600080fd5b8286015b8481101561492f5760408189031215614b895760008081fd5b614b9161478a565b8135614b9c81614895565b81528185013585820152835291830191604001614b70565b600082601f830112614bc557600080fd5b81356020614bd56148e383614871565b82815260059290921b84018101918181019086841115614bf457600080fd5b8286015b8481101561492f57803567ffffffffffffffff811115614c185760008081fd5b614c268986838b0101614973565b845250918301918301614bf8565b60006101a08284031215614c4757600080fd5b614c4f6147b3565b9050614c5a8261467a565b8152614c68602083016148b7565b6020820152614c79604083016148b7565b6040820152614c8a6060830161467a565b606082015260808201356080820152614ca560a08301614b21565b60a0820152614cb660c0830161467a565b60c0820152614cc760e083016148b7565b60e082015261010082810135908201526101208083013567ffffffffffffffff80821115614cf457600080fd5b614d0086838701614973565b83850152610140925082850135915080821115614d1c57600080fd5b614d2886838701614b2c565b83850152610160925082850135915080821115614d4457600080fd5b50614d5185828601614bb4565b82840152505061018080830135818301525092915050565b600082601f830112614d7a57600080fd5b81356020614d8a6148e383614871565b82815260059290921b84018101918181019086841115614da957600080fd5b8286015b8481101561492f57803567ffffffffffffffff811115614dcd5760008081fd5b614ddb8986838b0101614bb4565b845250918301918301614dad565b600082601f830112614dfa57600080fd5b81356020614e0a6148e383614871565b8083825260208201915060208460051b870101935086841115614e2c57600080fd5b602086015b8481101561492f5780358352918301918301614e31565b600060808284031215614e5a57600080fd5b614e626147d7565b9050813567ffffffffffffffff80821115614e7c57600080fd5b818401915084601f830112614e9057600080fd5b81356020614ea06148e383614871565b82815260059290921b84018101918181019088841115614ebf57600080fd5b8286015b84811015614ef757803586811115614edb5760008081fd5b614ee98b86838b0101614c34565b845250918301918301614ec3565b5086525085810135935082841115614f0e57600080fd5b614f1a87858801614d69565b90850152506040840135915080821115614f3357600080fd5b50614f4084828501614de9565b6040830152506060820135606082015292915050565b60008060408385031215614f6957600080fd5b823567ffffffffffffffff80821115614f8157600080fd5b614f8d86838701614e48565b9350602091508185013581811115614fa457600080fd5b85019050601f81018613614fb757600080fd5b8035614fc56148e382614871565b81815260059190911b82018301908381019088831115614fe457600080fd5b928401925b8284101561500257833582529284019290840190614fe9565b80955050505050509250929050565b60e0810161076c828463ffffffff80825116835280602083015116602084015261ffff6040830151166040840152606082015173ffffffffffffffffffffffffffffffffffffffff808216606086015280608085015116608086015250508060a08301511660a08401528060c08301511660c0840152505050565b60006020828403121561509e57600080fd5b813567ffffffffffffffff8111156150b557600080fd5b820160a081850312156110ca57600080fd5b600082601f8301126150d857600080fd5b813560206150e86148e383614871565b82815260069290921b8401810191818101908684111561510757600080fd5b8286015b8481101561492f57604081890312156151245760008081fd5b61512c61478a565b813561513781614895565b81528185013561514681614895565b8186015283529183019160400161510b565b6000806040838503121561516b57600080fd5b823567ffffffffffffffff8082111561518357600080fd5b61518f868387016150c7565b935060208501359150808211156151a557600080fd5b506151b2858286016150c7565b9150509250929050565b60008083601f8401126151ce57600080fd5b50813567ffffffffffffffff8111156151e657600080fd5b6020830191508360208260051b8501011115612c2057600080fd5b60008060008060008060008060e0898b03121561521d57600080fd5b606089018a81111561522e57600080fd5b8998503567ffffffffffffffff8082111561524857600080fd5b818b0191508b601f83011261525c57600080fd5b81358181111561526b57600080fd5b8c602082850101111561527d57600080fd5b6020830199508098505060808b013591508082111561529b57600080fd5b6152a78c838d016151bc565b909750955060a08b01359150808211156152c057600080fd5b506152cd8b828c016151bc565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff8116811461468557600080fd5b60006060828403121561531857600080fd5b6153206147fa565b823561532b81614b13565b8152615339602084016152e6565b602082015261534a604084016152e6565b60408201529392505050565b6040815260006153696040830185614a91565b8281036020840152612e518185614a91565b6000806040838503121561538e57600080fd5b823567ffffffffffffffff808211156153a657600080fd5b6153b286838701614c34565b935060208501359150808211156153c857600080fd5b506151b285828601614bb4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561076c5761076c6153d5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061546157615461615417565b92169190910692915050565b808202811582820484141761076c5761076c6153d5565b600067ffffffffffffffff8084168061549f5761549f615417565b92169190910492915050565b60208101600383106154bf576154bf6146a7565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff80831681810361550d5761550d6153d5565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526155478184018a614a91565b9050828103608084015261555b8189614a91565b905060ff871660a084015282810360c0840152615578818761471c565b905067ffffffffffffffff851660e084015282810361010084015261559d818561471c565b9c9b505050505050505050505050565b6000602082840312156155bf57600080fd5b81516110ca81614664565b8082018082111561076c5761076c6153d5565b60008151808452602080850194506020840160005b83811015614ad8578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016155f2565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c084015261566a61012084018261471c565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e08601526156a6838361471c565b9250608089015191508085840301610100860152506156c582826155dd565b925050506156d9602083018661ffff169052565b836040830152612e51606083018473ffffffffffffffffffffffffffffffffffffffff169052565b600082601f83011261571257600080fd5b81516157206148e38261494b565b81815284602083860101111561573557600080fd5b6129ea8260208301602087016146f8565b60008060006060848603121561575b57600080fd5b835161576681614b13565b602085015190935067ffffffffffffffff81111561578357600080fd5b61578f86828701615701565b925050604084015190509250925092565b805163ffffffff8116811461468557600080fd5b805161468581614895565b600060e082840312156157d157600080fd5b6157d961481d565b6157e2836157a0565b81526157f0602084016157a0565b6020820152604083015161ffff8116811461580a57600080fd5b604082015261581b606084016157b4565b606082015261582c608084016157b4565b608082015261583d60a084016157a0565b60a082015261584e60c084016157a0565b60c08201529392505050565b6101c081016158d8828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b825163ffffffff90811660e084015260208401518116610100840152604084015161ffff16610120840152606084015173ffffffffffffffffffffffffffffffffffffffff90811661014085015260808501511661016084015260a0840151811661018084015260c0840151166101a08301526110ca565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b1660408501528160608501526159978285018b614a91565b915083820360808501526159ab828a614a91565b915060ff881660a085015283820360c08501526159c8828861471c565b90861660e0850152838103610100850152905061559d818561471c565b6000602082840312156159f757600080fd5b81516110ca81614b13565b60008151808452602080850194506020840160005b83811015614ad857815187529582019590820190600101615a17565b606081526000615a466060830186615a02565b8281036020840152615a588186615a02565b915050826040830152949350505050565b600060208284031215615a7b57600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156144d1576144d16153d5565b67ffffffffffffffff83168152604081016110ca60208301846146d6565b600067ffffffffffffffff80831681810361550d5761550d6153d5565b615ae881846146d6565b6040602082015260006129ea604083018461471c565b600060208284031215615b1057600080fd5b813567ffffffffffffffff811115615b2757600080fd5b6129ea84828501614e48565b600060208284031215615b4557600080fd5b815167ffffffffffffffff80821115615b5d57600080fd5b9083019060608286031215615b7157600080fd5b615b796147fa565b825182811115615b8857600080fd5b615b9487828601615701565b825250602083015182811115615ba957600080fd5b615bb587828601615701565b602083015250604083015182811115615bcd57600080fd5b615bd987828601615701565b60408301525095945050505050565b6020815260006110ca60208301846155dd565b60008282518085526020808601955060208260051b8401016020860160005b84811015615c4857601f19868403018952615c3683835161471c565b98840198925090830190600101615c1a565b5090979650505050505050565b6020815260006110ca6020830184615bfb565b60408152615c8360408201845167ffffffffffffffff169052565b60006020840151615cac606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c0840151610100615d1a8185018367ffffffffffffffff169052565b60e08601519150610120615d458186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a06101608181870152615d756101e087018561471c565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0610180818887030181890152615db486866155dd565b9550828a01519450818887030184890152615dcf8686615bfb565b9550808a01516101c089015250505050508281036020840152612e518185615bfb565b6000815160208301517fffffffff0000000000000000000000000000000000000000000000000000000080821693506004831015615e3a5780818460040360031b1b83161693505b505050919050565b600060208284031215615e5457600080fd5b81516110ca81614895565b6020815260008251610100806020850152615e7e61012085018361471c565b91506020850151615e9b604086018267ffffffffffffffff169052565b50604085015173ffffffffffffffffffffffffffffffffffffffff8116606086015250606085015160808501526080850151615eef60a086018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a0850151601f19808685030160c0870152615f0c848361471c565b935060c08701519150808685030160e0870152615f29848361471c565b935060e0870151915080868503018387015250615f46838261471c565b9695505050505050565b600060408284031215615f6257600080fd5b615f6a61478a565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114615f9657600080fd5b8152615fa4602084016157a0565b60208201529392505050565b600082615fbf57615fbf615417565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + Bin: "0x6101a06040523480156200001257600080fd5b5060405162006296380380620062968339810160408190526200003591620004ec565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c081620002ca565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508201516001600160a01b031615806200016f575081516001600160a01b0316155b8062000186575060c08201516001600160a01b0316155b15620001a5576040516342bcdf7f60e11b815260040160405180910390fd5b81600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020e9190620005b5565b6001600160401b03166001146200023857604051636fc2a20760e11b815260040160405180910390fd5b81516001600160a01b0390811660a090815260408401516001600160401b0390811660c0908152602086015190911660e05260608501518316610100526080850151831661014052908401518216610160528301511661018052620002bd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000375565b6101205250620005da9050565b336001600160a01b03821603620003245760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e05161010051604051602001620003bf94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b60405160e081016001600160401b03811182821017156200040d57634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200042b57600080fd5b919050565b80516001600160401b03811681146200042b57600080fd5b80516001600160801b03811681146200042b57600080fd5b6000606082840312156200047357600080fd5b604051606081016001600160401b0381118282101715620004a457634e487b7160e01b600052604160045260246000fd5b806040525080915082518015158114620004bd57600080fd5b8152620004cd6020840162000448565b6020820152620004e06040840162000448565b60408201525092915050565b6000808284036101408112156200050257600080fd5b60e08112156200051157600080fd5b506200051c620003dc565b620005278462000413565b8152620005376020850162000430565b60208201526200054a6040850162000430565b60408201526200055d6060850162000413565b6060820152620005706080850162000413565b60808201526200058360a0850162000413565b60a08201526200059660c0850162000413565b60c08201529150620005ac8460e0850162000460565b90509250929050565b600060208284031215620005c857600080fd5b620005d38262000430565b9392505050565b60805160a05160c05160e0516101005161012051610140516101605161018051615bcd620006c9600039600081816102ec01528181611aaf01526133e40152600081816102bd01528181611a880152611d3a01526000818161028e01528181610ed901528181610f4101528181611a61015281816122e3015261235001526000611ed901526000818161025f0152611a370152600081816101ff01526119e501526000818161022f01528181611a0f01528181611cf701528181612e1c01526134fb0152600081816101d0015281816119b70152611fb9015260008181611c510152611c9d0152615bcd6000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806381ff7048116100d8578063afcb95d71161008c578063f077b59211610066578063f077b59214610646578063f2fde38b1461065c578063f52121a51461066f57600080fd5b8063afcb95d714610600578063b1dc65a414610620578063c92b28321461063357600080fd5b8063856c8247116100bd578063856c8247146105b0578063873504d7146105dc5780638da5cb5b146105ef57600080fd5b806381ff70481461057257806385572ffb146105a257600080fd5b8063599f64311161013a578063740f415011610114578063740f4150146104615780637437ff9f1461047457806379ba50971461056a57600080fd5b8063599f643114610414578063666cab8d14610439578063704b6c021461044e57600080fd5b8063181f5a771161016b578063181f5a77146103525780631ef381741461039b578063546719cd146103b057600080fd5b806306285c6914610187578063142a98fc14610332575b600080fd5b61031c6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b604051610329919061426a565b60405180910390f35b610345610340366004614300565b610682565b6040516103299190614360565b61038e6040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b60405161032991906143be565b6103ae6103a936600461462d565b6106fd565b005b6103b8610af1565b604051610329919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610329565b610441610ba6565b604051610329919061473f565b6103ae61045c366004614752565b610c08565b6103ae61046f366004614bb2565b610cd1565b61055d6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152506040805160e081018252600a5463ffffffff808216835264010000000082048116602084015261ffff68010000000000000000830416938301939093526001600160a01b036a010000000000000000000090910481166060830152600b549081166080830152740100000000000000000000000000000000000000008104831660a08301527801000000000000000000000000000000000000000000000000900490911660c082015290565b6040516103299190614c6d565b6103ae610dc8565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610329565b6103ae610182366004614cdb565b6105c36105be366004614752565b610eab565b60405167ffffffffffffffff9091168152602001610329565b6103ae6105ea366004614da7565b610fb3565b6000546001600160a01b0316610421565b604080516001815260006020820181905291810191909152606001610329565b6103ae61062e366004614e50565b611181565b6103ae610641366004614f55565b61138c565b61064e6113f7565b604051610329929190614fa5565b6103ae61066a366004614752565b61151d565b6103ae61067d366004614fca565b61152e565b600061069060016004615053565b600261069d608085615095565b67ffffffffffffffff166106b191906150bc565b601060006106c06080876150d3565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106f7576106f761431d565b92915050565b84518460ff16601f82111561074a5760016040517f367f56a200000000000000000000000000000000000000000000000000000000815260040161074191906150fa565b60405180910390fd5b806000036107875760006040517f367f56a200000000000000000000000000000000000000000000000000000000815260040161074191906150fa565b61078f611761565b610798856117d7565b60095460005b8181101561080f5760086000600983815481106107bd576107bd615114565b60009182526020808320909101546001600160a01b03168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560010161079e565b5050865160005b818110156109b257600089828151811061083257610832615114565b602002602001015190506000600281111561084f5761084f61431d565b6001600160a01b038216600090815260086020526040902054610100900460ff1660028111156108815761088161431d565b146108bb5760026040517f367f56a200000000000000000000000000000000000000000000000000000000815260040161074191906150fa565b6001600160a01b0381166108fb576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561099e5761099e61431d565b021790555090505050806001019050610816565b5087516109c69060099060208b01906141e1565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908a161717905560078054610a4c914691309190600090610a1e9063ffffffff16615143565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168c8c8c8c8c8c611b0f565b6005819055600780544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff841681179094556040519083048216947f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0594610add9487949293918316921691909117908f908f908f908f908f908f90615166565b60405180910390a150505050505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610ba190611b9c565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610bfe57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610be0575b5050505050905090565b6000546001600160a01b03163314801590610c2e57506002546001600160a01b03163314155b15610c65576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b610cd9611c4e565b81515181518114610d16576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610db8576000838281518110610d3557610d35615114565b6020026020010151905080600014158015610d6e57508451805183908110610d5f57610d5f615114565b60200260200101516080015181105b15610daf576040517f085e39cf0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610741565b50600101610d19565b50610dc38383611ccf565b505050565b6001546001600160a01b03163314610e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610741565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff1680158015610f0457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b156106f7576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fac91906151fc565b9392505050565b610fbb611761565b60005b825181101561108e57610ff8838281518110610fdc57610fdc615114565b602002602001015160200151600c61276d90919063ffffffff16565b15611086577fcbf3cbeaed4ac1d605ed30f4af06c35acaeff2379db7f6146c9cceee83d5878283828151811061103057611030615114565b60200260200101516000015184838151811061104e5761104e615114565b60200260200101516020015160405161107d9291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101610fbe565b5060005b8151811015610dc3576110eb8282815181106110b0576110b0615114565b6020026020010151602001518383815181106110ce576110ce615114565b602002602001015160000151600c6127829092919063ffffffff16565b15611179577ffc23abf7ddbd3c02b1420dafa2355c56c1a06fbb8723862ac14d6bd74177361a82828151811061112357611123615114565b60200260200101516000015183838151811061114157611141615114565b6020026020010151602001516040516111709291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101611092565b61118b87876127a0565b6005548835908082146111d4576040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610741565b6111dc611c4e565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff808216845292939192918401916101009091041660028111156112645761126461431d565b60028111156112755761127561431d565b90525090506002816020015160028111156112925761129261431d565b1480156112cc57506009816000015160ff16815481106112b4576112b4615114565b6000918252602090912001546001600160a01b031633145b611302576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060006113108560206150bc565b61131b8860206150bc565b6113278b610144615219565b6113319190615219565b61133b9190615219565b905036811461137f576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610741565b5050505050505050505050565b6000546001600160a01b031633148015906113b257506002546001600160a01b03163314155b156113e9576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113f46003826127c7565b50565b6060806000611406600c6129ac565b90508067ffffffffffffffff811115611421576114216143d1565b60405190808252806020026020018201604052801561144a578160200160208202803683370190505b5092508067ffffffffffffffff811115611466576114666143d1565b60405190808252806020026020018201604052801561148f578160200160208202803683370190505b50915060005b81811015611517576000806114ab600c846129b7565b91509150808684815181106114c2576114c2615114565b60200260200101906001600160a01b031690816001600160a01b031681525050818584815181106114f5576114f5615114565b6001600160a01b03909216602092830291909101909101525050600101611495565b50509091565b611525611761565b6113f4816129d5565b333014611567576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600080825260208201909252816115a4565b604080518082019091526000808252602082015281526020019060019003908161157d5790505b5061014084015151909150156116045761160183610140015184602001516040516020016115e191906001600160a01b0391909116815260200190565b604051602081830303815290604052856040015186610160015186612ab0565b90505b6101208301515115801561161a57506080830151155b80611631575060408301516001600160a01b03163b155b806116715750604083015161166f906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000612be1565b155b1561167b57505050565b600a5460009081906a010000000000000000000090046001600160a01b0316633cf979836116a98786612bfd565b611388886080015189604001516040518563ffffffff1660e01b81526004016116d59493929190615271565b6000604051808303816000875af11580156116f4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261171c919081019061537b565b50915091508161175a57806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161074191906143be565b5050505050565b6000546001600160a01b031633146117d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610741565b565b6000818060200190518101906117ed91906153f4565b60608101519091506001600160a01b0316611834576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a80546020808501516040808701516060808901516001600160a01b039081166a0100000000000000000000027fffff0000000000000000000000000000000000000000ffffffffffffffffffff61ffff9094166801000000000000000002939093167fffff00000000000000000000000000000000000000000000ffffffffffffffff63ffffffff968716640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009099169a87169a909a1797909717989098169590951717909455608080870151600b805460a0808b015160c0808d015188167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff9290981674010000000000000000000000000000000000000000027fffffffffffffffff000000000000000000000000000000000000000000000000909416958c16959095179290921791909116949094179055855160e0810187527f00000000000000000000000000000000000000000000000000000000000000008816815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848701527f00000000000000000000000000000000000000000000000000000000000000008716948401949094527f00000000000000000000000000000000000000000000000000000000000000008616908301527f00000000000000000000000000000000000000000000000000000000000000008516908201527f000000000000000000000000000000000000000000000000000000000000000090931690830152517ff02fcc22535d64d92d17b995475893d63edd51da163fed74a6ee9b4bc4895cc491611b0391849061548f565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611b339998979695949392919061556b565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611c2a82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611c0e9190615053565b85608001516fffffffffffffffffffffffffffffffff16612ca0565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b467f0000000000000000000000000000000000000000000000000000000000000000146117d5576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610741565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060801b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad91906155f3565b15611de4576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003611e21576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114611e5f576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115611e7a57611e7a6143d1565b604051908082528060200260200182016040528015611ea3578160200160208202803683370190505b50905060005b82811015611f7b57600085600001518281518110611ec957611ec9615114565b60200260200101519050611efd817f0000000000000000000000000000000000000000000000000000000000000000612cbf565b838381518110611f0f57611f0f615114565b602002602001018181525050806101800151838381518110611f3357611f33615114565b602002602001015114611f72576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611ea9565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692633204887592611fef92879291600401615641565b602060405180830381865afa15801561200c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120309190615677565b90508060000361206c576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b848110156127645760008760000151828151811061209357612093615114565b6020026020010151905060006120ac8260600151610682565b905060028160038111156120c2576120c261431d565b0361210957816060015167ffffffffffffffff167fe3dd0bec917c965a133ddb2c84874725ee1e2fd8d763c19efa36d6a11cd82b1f60405160405180910390a2505061275c565b600081600381111561211d5761211d61431d565b148061213a575060038160038111156121385761213861431d565b145b6121825760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610741565b831561223f57600a5460009063ffffffff1661219e8742615053565b11905080806121be575060038260038111156121bc576121bc61431d565b145b6121f4576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061220657612206615114565b60200260200101516000146122395788848151811061222757612227615114565b60200260200101518360800181815250505b5061229c565b60008160038111156122535761225361431d565b1461229c5760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610741565b60c082015167ffffffffffffffff161561251f576020808301516001600160a01b03166000908152600f909152604090205467ffffffffffffffff168015801561230e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b1561248a5760208301516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa158015612399573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bd91906151fc565b60c084015190915067ffffffffffffffff166123da826001615690565b67ffffffffffffffff161461243a5782602001516001600160a01b03168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a350505061275c565b6020838101516001600160a01b03166000908152600f9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b600082600381111561249e5761249e61431d565b0361251d5760c083015167ffffffffffffffff166124bd826001615690565b67ffffffffffffffff161461251d5782602001516001600160a01b03168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a350505061275c565b505b60008960200151848151811061253757612537615114565b602002602001015190506125638360600151846000015185610140015151866101200151518551612e1a565b61257283606001516001612f94565b60008061257f858461303e565b91509150612591856060015183612f94565b8680156125af575060038260038111156125ad576125ad61431d565b145b80156125cd575060008460038111156125ca576125ca61431d565b14155b1561260657806040517fcf19edfd00000000000000000000000000000000000000000000000000000000815260040161074191906143be565b600382600381111561261a5761261a61431d565b1415801561263a575060028260038111156126375761263761431d565b14155b15612679578460600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016107419291906156b1565b60008560c0015167ffffffffffffffff161180156126a8575060008460038111156126a6576126a661431d565b145b15612708576020808601516001600160a01b03166000908152600f90915260408120805467ffffffffffffffff16916126e0836156cf565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b846101800151856060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef65848460405161274e9291906156ec565b60405180910390a350505050505b600101612073565b50505050505050565b6000610fac836001600160a01b038416613331565b6000612798846001600160a01b0385168461333d565b949350505050565b6127c36127af8284018461570c565b604080516000815260208101909152611ccf565b5050565b81546000906127f090700100000000000000000000000000000000900463ffffffff1642615053565b905080156128925760018301548354612838916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612ca0565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546128b8916fffffffffffffffffffffffffffffffff9081169116613353565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199061299f9084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b60006106f782613369565b60008080806129c68686613374565b909450925050505b9250929050565b336001600160a01b03821603612a47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610741565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b846000805b8751811015612bc657612b2d888281518110612ad357612ad3615114565b6020026020010151602001518888888581518110612af357612af3615114565b6020026020010151806020019051810190612b0e9190615741565b888681518110612b2057612b20615114565b6020026020010151613383565b838281518110612b3f57612b3f615114565b6020026020010181905250612b7b838281518110612b5f57612b5f615114565b602002602001015160000151600c6137b590919063ffffffff16565b15612bbe57612bb1838281518110612b9557612b95615114565b6020908102919091010151600b546001600160a01b03166137ca565b612bbb9083615219565b91505b600101612ab5565b508015612bd657612bd6816138eb565b505b95945050505050565b6000612bec836138f8565b8015610fac5750610fac838361395c565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff1681526020018460200151604051602001612c7591906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b6000612bd885612cb084866150bc565b612cba9087615219565b613353565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001612d559897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001612d8e91906157f6565b60405160208183030381529060405280519060200120876101600151604051602001612dba9190615863565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614612e93576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610741565b600a5468010000000000000000900461ffff16831115612eeb576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610741565b808314612f30576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610741565b600a54640100000000900463ffffffff1682111561175a57600a546040517f8693378900000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff16600482015260248101839052604401610741565b60006002612fa3608085615095565b67ffffffffffffffff16612fb791906150bc565b90506000601081612fc96080876150d3565b67ffffffffffffffff168152602081019190915260400160002054905081612ff360016004615053565b901b19168183600381111561300a5761300a61431d565b901b17806010600061301d6080886150d3565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a5906130829087908790600401615876565b600060405180830381600087803b15801561309c57600080fd5b505af19250505080156130ad575060015b613316573d8080156130db576040519150601f19603f3d011682016040523d82523d6000602084013e6130e0565b606091505b506130ea816159d9565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c000000000000000000000000000000000000000000000000000000001480613182575061313d816159d9565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b806131d65750613191816159d9565b7fffffffff00000000000000000000000000000000000000000000000000000000167f8d666f6000000000000000000000000000000000000000000000000000000000145b8061322a57506131e5816159d9565b7fffffffff00000000000000000000000000000000000000000000000000000000167f78ef802400000000000000000000000000000000000000000000000000000000145b8061327e5750613239816159d9565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0c3b563c00000000000000000000000000000000000000000000000000000000145b806132d2575061328d816159d9565b7fffffffff00000000000000000000000000000000000000000000000000000000167fae9b4ce900000000000000000000000000000000000000000000000000000000145b156132e2576003925090506129ce565b806040517fcf19edfd00000000000000000000000000000000000000000000000000000000815260040161074191906143be565b50506040805160208101909152600081526002909250929050565b6000610fac8383613a2b565b600061279884846001600160a01b038516613a48565b60008183106133625781610fac565b5090919050565b60006106f782613a65565b60008080806129c68686613a70565b604080518082019091526000808252602082015260006133a68460200151613a9b565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa15801561342b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344f9190615a29565b90506001600160a01b038116158061349757506134956001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000612be1565b155b156134d9576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610741565b600080613602633907753760e01b6040518061010001604052808c81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020018b6001600160a01b031681526020018d8152602001876001600160a01b031681526020018a6000015181526020018a604001518152602001898152506040516024016135759190615a46565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600b54859063ffffffff74010000000000000000000000000000000000000000909104166113886084613af6565b50915091508161364057806040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161074191906143be565b80516020146136885780516040517f78ef8024000000000000000000000000000000000000000000000000000000008152602060048201526024810191909152604401610741565b60008180602001905181019061369e9190615677565b604080516001600160a01b038c16602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052600b5491925061374b9187907801000000000000000000000000000000000000000000000000900463ffffffff166113886084613af6565b5090935091508261378a57816040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161074191906143be565b604080518082019091526001600160a01b039095168552602085015250919250505095945050505050565b6000610fac836001600160a01b038416613c1c565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa158015613830573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138549190615b1d565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036138bd5783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610741565b6020840151612798907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690613c28565b6113f46003826000613c65565b6000613924827f01ffc9a70000000000000000000000000000000000000000000000000000000061395c565b80156106f75750613955827fffffffff0000000000000000000000000000000000000000000000000000000061395c565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613a14575060208210155b8015613a205750600081115b979650505050505050565b60008181526002830160205260408120819055610fac8383613fb4565b600082815260028401602052604081208290556127988484613fc0565b60006106f782613fcc565b60008080613a7e8585613fd6565b600081815260029690960160205260409095205494959350505050565b60008151602014613ada57816040517f8d666f6000000000000000000000000000000000000000000000000000000000815260040161074191906143be565b6106f782806020019051810190613af19190615677565b613fe2565b6000606060008361ffff1667ffffffffffffffff811115613b1957613b196143d1565b6040519080825280601f01601f191660200182016040528015613b43576020820181803683370190505b509150863b613b76577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613ba9577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613be2577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613c055750835b808352806000602085013e50955095509592505050565b6000610fac838361404f565b6000670de0b6b3a7640000613c5b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166150bc565b610fac9190615b7d565b825474010000000000000000000000000000000000000000900460ff161580613c8c575081155b15613c9657505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090613cdc90700100000000000000000000000000000000900463ffffffff1642615053565b90508015613d9c5781831115613d1e576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613d589083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612ca0565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015613e39576001600160a01b038416613dee576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610741565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610741565b84831015613f325760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613e7d9082615053565b613e87878a615053565b613e919190615219565b613e9b9190615b7d565b90506001600160a01b038616613ee7576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610741565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610741565b613f3c8584615053565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000610fac838361406e565b6000610fac8383614168565b60006106f7825490565b6000610fac83836141b7565b60006001600160a01b03821180613ffa575061040082105b1561404b5760408051602081018490520160408051601f19818403018152908290527f8d666f60000000000000000000000000000000000000000000000000000000008252610741916004016143be565b5090565b6000610fac838360008181526001830160205260408120541515610fac565b60008181526001830160205260408120548015614157576000614092600183615053565b85549091506000906140a690600190615053565b905081811461410b5760008660000182815481106140c6576140c6615114565b90600052602060002001549050808760000184815481106140e9576140e9615114565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061411c5761411c615b91565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106f7565b60009150506106f7565b5092915050565b60008181526001830160205260408120546141af575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106f7565b5060006106f7565b60008260000182815481106141ce576141ce615114565b9060005260206000200154905092915050565b82805482825590600052602060002090810192821561424e579160200282015b8281111561424e57825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190614201565b5061404b9291505b8082111561404b5760008155600101614256565b60e081016106f782846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b67ffffffffffffffff811681146113f457600080fd5b80356142fb816142da565b919050565b60006020828403121561431257600080fd5b8135610fac816142da565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061435c5761435c61431d565b9052565b602081016106f7828461434c565b60005b83811015614389578181015183820152602001614371565b50506000910152565b600081518084526143aa81602086016020860161436e565b601f01601f19169290920160200192915050565b602081526000610fac6020830184614392565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614423576144236143d1565b60405290565b6040516101a0810167ffffffffffffffff81118282101715614423576144236143d1565b6040516080810167ffffffffffffffff81118282101715614423576144236143d1565b6040516060810167ffffffffffffffff81118282101715614423576144236143d1565b60405160e0810167ffffffffffffffff81118282101715614423576144236143d1565b604051601f8201601f1916810167ffffffffffffffff811182821017156144df576144df6143d1565b604052919050565b600067ffffffffffffffff821115614501576145016143d1565b5060051b60200190565b6001600160a01b03811681146113f457600080fd5b80356142fb8161450b565b600082601f83011261453c57600080fd5b8135602061455161454c836144e7565b6144b6565b8083825260208201915060208460051b87010193508684111561457357600080fd5b602086015b8481101561459857803561458b8161450b565b8352918301918301614578565b509695505050505050565b803560ff811681146142fb57600080fd5b600067ffffffffffffffff8211156145ce576145ce6143d1565b50601f01601f191660200190565b600082601f8301126145ed57600080fd5b81356145fb61454c826145b4565b81815284602083860101111561461057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561464657600080fd5b863567ffffffffffffffff8082111561465e57600080fd5b61466a8a838b0161452b565b9750602089013591508082111561468057600080fd5b61468c8a838b0161452b565b965061469a60408a016145a3565b955060608901359150808211156146b057600080fd5b6146bc8a838b016145dc565b94506146ca60808a016142f0565b935060a08901359150808211156146e057600080fd5b506146ed89828a016145dc565b9150509295509295509295565b60008151808452602080850194506020840160005b838110156147345781516001600160a01b03168752958201959082019060010161470f565b509495945050505050565b602081526000610fac60208301846146fa565b60006020828403121561476457600080fd5b8135610fac8161450b565b80151581146113f457600080fd5b80356142fb8161476f565b600082601f83011261479957600080fd5b813560206147a961454c836144e7565b82815260069290921b840181019181810190868411156147c857600080fd5b8286015b8481101561459857604081890312156147e55760008081fd5b6147ed614400565b81356147f88161450b565b815281850135858201528352918301916040016147cc565b600082601f83011261482157600080fd5b8135602061483161454c836144e7565b82815260059290921b8401810191818101908684111561485057600080fd5b8286015b8481101561459857803567ffffffffffffffff8111156148745760008081fd5b6148828986838b01016145dc565b845250918301918301614854565b60006101a082840312156148a357600080fd5b6148ab614429565b90506148b6826142f0565b81526148c460208301614520565b60208201526148d560408301614520565b60408201526148e6606083016142f0565b60608201526080820135608082015261490160a0830161477d565b60a082015261491260c083016142f0565b60c082015261492360e08301614520565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561495057600080fd5b61495c868387016145dc565b8385015261014092508285013591508082111561497857600080fd5b61498486838701614788565b838501526101609250828501359150808211156149a057600080fd5b506149ad85828601614810565b82840152505061018080830135818301525092915050565b600082601f8301126149d657600080fd5b813560206149e661454c836144e7565b82815260059290921b84018101918181019086841115614a0557600080fd5b8286015b8481101561459857803567ffffffffffffffff811115614a295760008081fd5b614a378986838b0101614810565b845250918301918301614a09565b600082601f830112614a5657600080fd5b81356020614a6661454c836144e7565b8083825260208201915060208460051b870101935086841115614a8857600080fd5b602086015b848110156145985780358352918301918301614a8d565b600060808284031215614ab657600080fd5b614abe61444d565b9050813567ffffffffffffffff80821115614ad857600080fd5b818401915084601f830112614aec57600080fd5b81356020614afc61454c836144e7565b82815260059290921b84018101918181019088841115614b1b57600080fd5b8286015b84811015614b5357803586811115614b375760008081fd5b614b458b86838b0101614890565b845250918301918301614b1f565b5086525085810135935082841115614b6a57600080fd5b614b76878588016149c5565b90850152506040840135915080821115614b8f57600080fd5b50614b9c84828501614a45565b6040830152506060820135606082015292915050565b60008060408385031215614bc557600080fd5b823567ffffffffffffffff80821115614bdd57600080fd5b614be986838701614aa4565b9350602091508185013581811115614c0057600080fd5b85019050601f81018613614c1357600080fd5b8035614c2161454c826144e7565b81815260059190911b82018301908381019088831115614c4057600080fd5b928401925b82841015614c5e57833582529284019290840190614c45565b80955050505050509250929050565b60e081016106f7828463ffffffff80825116835280602083015116602084015261ffff604083015116604084015260608201516001600160a01b03808216606086015280608085015116608086015250508060a08301511660a08401528060c08301511660c0840152505050565b600060208284031215614ced57600080fd5b813567ffffffffffffffff811115614d0457600080fd5b820160a08185031215610fac57600080fd5b600082601f830112614d2757600080fd5b81356020614d3761454c836144e7565b82815260069290921b84018101918181019086841115614d5657600080fd5b8286015b848110156145985760408189031215614d735760008081fd5b614d7b614400565b8135614d868161450b565b815281850135614d958161450b565b81860152835291830191604001614d5a565b60008060408385031215614dba57600080fd5b823567ffffffffffffffff80821115614dd257600080fd5b614dde86838701614d16565b93506020850135915080821115614df457600080fd5b50614e0185828601614d16565b9150509250929050565b60008083601f840112614e1d57600080fd5b50813567ffffffffffffffff811115614e3557600080fd5b6020830191508360208260051b85010111156129ce57600080fd5b60008060008060008060008060e0898b031215614e6c57600080fd5b606089018a811115614e7d57600080fd5b8998503567ffffffffffffffff80821115614e9757600080fd5b818b0191508b601f830112614eab57600080fd5b813581811115614eba57600080fd5b8c6020828501011115614ecc57600080fd5b6020830199508098505060808b0135915080821115614eea57600080fd5b614ef68c838d01614e0b565b909750955060a08b0135915080821115614f0f57600080fd5b50614f1c8b828c01614e0b565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff811681146142fb57600080fd5b600060608284031215614f6757600080fd5b614f6f614470565b8235614f7a8161476f565b8152614f8860208401614f35565b6020820152614f9960408401614f35565b60408201529392505050565b604081526000614fb860408301856146fa565b8281036020840152612bd881856146fa565b60008060408385031215614fdd57600080fd5b823567ffffffffffffffff80821115614ff557600080fd5b61500186838701614890565b9350602085013591508082111561501757600080fd5b50614e0185828601614810565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106f7576106f7615024565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff808416806150b0576150b0615066565b92169190910692915050565b80820281158282048414176106f7576106f7615024565b600067ffffffffffffffff808416806150ee576150ee615066565b92169190910492915050565b602081016003831061510e5761510e61431d565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff80831681810361515c5761515c615024565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526151968184018a6146fa565b905082810360808401526151aa81896146fa565b905060ff871660a084015282810360c08401526151c78187614392565b905067ffffffffffffffff851660e08401528281036101008401526151ec8185614392565b9c9b505050505050505050505050565b60006020828403121561520e57600080fd5b8151610fac816142da565b808201808211156106f7576106f7615024565b60008151808452602080850194506020840160005b8381101561473457815180516001600160a01b031688528301518388015260409096019590820190600101615241565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c08401526152ac610120840182614392565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e08601526152e88383614392565b925060808901519150808584030161010086015250615307828261522c565b9250505061531b602083018661ffff169052565b836040830152612bd860608301846001600160a01b03169052565b600082601f83011261534757600080fd5b815161535561454c826145b4565b81815284602083860101111561536a57600080fd5b61279882602083016020870161436e565b60008060006060848603121561539057600080fd5b835161539b8161476f565b602085015190935067ffffffffffffffff8111156153b857600080fd5b6153c486828701615336565b925050604084015190509250925092565b805163ffffffff811681146142fb57600080fd5b80516142fb8161450b565b600060e0828403121561540657600080fd5b61540e614493565b615417836153d5565b8152615425602084016153d5565b6020820152604083015161ffff8116811461543f57600080fd5b6040820152615450606084016153e9565b6060820152615461608084016153e9565b608082015261547260a084016153d5565b60a082015261548360c084016153d5565b60c08201529392505050565b6101c0810161550082856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b825163ffffffff90811660e084015260208401518116610100840152604084015161ffff1661012084015260608401516001600160a01b0390811661014085015260808501511661016084015260a0840151811661018084015260c0840151166101a0830152610fac565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b1660408501528160608501526155a58285018b6146fa565b915083820360808501526155b9828a6146fa565b915060ff881660a085015283820360c08501526155d68288614392565b90861660e085015283810361010085015290506151ec8185614392565b60006020828403121561560557600080fd5b8151610fac8161476f565b60008151808452602080850194506020840160005b8381101561473457815187529582019590820190600101615625565b6060815260006156546060830186615610565b82810360208401526156668186615610565b915050826040830152949350505050565b60006020828403121561568957600080fd5b5051919050565b67ffffffffffffffff81811683821601908082111561416157614161615024565b67ffffffffffffffff8316815260408101610fac602083018461434c565b600067ffffffffffffffff80831681810361515c5761515c615024565b6156f6818461434c565b6040602082015260006127986040830184614392565b60006020828403121561571e57600080fd5b813567ffffffffffffffff81111561573557600080fd5b61279884828501614aa4565b60006020828403121561575357600080fd5b815167ffffffffffffffff8082111561576b57600080fd5b908301906060828603121561577f57600080fd5b615787614470565b82518281111561579657600080fd5b6157a287828601615336565b8252506020830151828111156157b757600080fd5b6157c387828601615336565b6020830152506040830151828111156157db57600080fd5b6157e787828601615336565b60408301525095945050505050565b602081526000610fac602083018461522c565b60008282518085526020808601955060208260051b8401016020860160005b8481101561585657601f19868403018952615844838351614392565b98840198925090830190600101615828565b5090979650505050505050565b602081526000610fac6020830184615809565b6040815261589160408201845167ffffffffffffffff169052565b600060208401516158ad60608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c084015161010061590e8185018367ffffffffffffffff169052565b60e0860151915061012061592c818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a0610160818187015261595c6101e0870185614392565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc061018081888703018189015261599b868661522c565b9550828a015194508188870301848901526159b68686615809565b9550808a01516101c089015250505050508281036020840152612bd88185615809565b6000815160208301517fffffffff0000000000000000000000000000000000000000000000000000000080821693506004831015615a215780818460040360031b1b83161693505b505050919050565b600060208284031215615a3b57600080fd5b8151610fac8161450b565b6020815260008251610100806020850152615a65610120850183614392565b91506020850151615a82604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615abc60a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615ad98483614392565b935060c08701519150808685030160e0870152615af68483614392565b935060e0870151915080868503018387015250615b138382614392565b9695505050505050565b600060408284031215615b2f57600080fd5b615b37614400565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114615b6357600080fd5b8152615b71602084016153d5565b60208201529392505050565b600082615b8c57615b8c615066565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var EVM2EVMOffRampABI = EVM2EVMOffRampMetaData.ABI diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 2d9236452a..adea29d53e 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -9,9 +9,9 @@ commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../ commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin de27d13c4498bafb6655749c2756d916ffd5d595c2c173f78edb67069587ff3c custom_token_pool: ../../../contracts/solc/v0.8.24/CustomTokenPool/CustomTokenPool.abi ../../../contracts/solc/v0.8.24/CustomTokenPool/CustomTokenPool.bin 488bd34d63be7b731f4fbdf0cd353f7e4fbee990cfa4db26be91973297d3f803 ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin f72f9f4562a6f788f9f59197f34bd603476fe8c2555c9eebba72e9d9b445cbcc -evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 51b431ac2cb00e1e8b3f7b97adaed295e8453748a6960a78d33452c0469ef82a +evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 7a139507fcae2f38421808931f0c3a7518c2bfc7cefe42a62db6347ae69182e1 evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin bd00d96f866d0172a248a1d50e9380463474f84bb8fe5e78556514295332b67a -evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin fddfbb935f68418d29fd2942b6357c85b325dd9ec8819f5b74a6b2c88f50a073 +evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin b6132cb22370d62b1b20174bbe832ec87df61f6ab65f7fe2515733bdd10a30f5 evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin 383e9930fbc1b7fbb6554cc8857229d207fd6742e87c7fb1a37002347e8de8e2 lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin c65c226e1e4d38414bd4a1b76fc8aca3cb3dd98df61268424c44564f455d3752 lock_release_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.bin 8b929fab79d1caeea4c57e08cc523eb8ab45ec5c08f46da866b82c15ba94d9ad diff --git a/core/scripts/ccip/revert-reason/handler/reason.go b/core/scripts/ccip/revert-reason/handler/reason.go index 0c20634690..b28248de7b 100644 --- a/core/scripts/ccip/revert-reason/handler/reason.go +++ b/core/scripts/ccip/revert-reason/handler/reason.go @@ -18,10 +18,13 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool_1_2_0" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_multi_onramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool_1_4_0" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" @@ -81,9 +84,9 @@ func DecodeErrorStringFromABI(errorString string) (string, error) { } // If exec error, the actual error is within the revert reason - if errorName == "ExecutionError" || errorName == "TokenRateLimitError" || errorName == "TokenHandlingError" { + if errorName == "ExecutionError" || errorName == "TokenRateLimitError" || errorName == "TokenHandlingError" || errorName == "ReceiverError" { // Get the inner type, which is `bytes` - fmt.Printf("Error is \"%v\" inner error: ", errorName) + fmt.Printf("Error is \"%v\" \ninner error: ", errorName) errorBytes := v.([]interface{})[0].([]byte) if len(errorBytes) < 4 { return "[reverted without error code]", nil @@ -145,6 +148,9 @@ func getAllABIs() []string { evm_2_evm_onramp.EVM2EVMOnRampABI, evm_2_evm_offramp.EVM2EVMOffRampABI, router.RouterABI, + evm_2_evm_multi_onramp.EVM2EVMMultiOnRampABI, + evm_2_evm_multi_offramp.EVM2EVMMultiOffRampABI, + maybe_revert_message_receiver.MaybeRevertMessageReceiverABI, } }