From 811b8ef2692d1507dce048fb7e40b0075b1f85ba Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 20 Dec 2021 13:37:50 +0100 Subject: [PATCH 01/66] Migration part written --- pallets/xcm-transactor/src/lib.rs | 38 +++++++++++---- pallets/xcm-transactor/src/tests.rs | 73 +++++++++++++++++++++++++---- 2 files changed, 95 insertions(+), 16 deletions(-) diff --git a/pallets/xcm-transactor/src/lib.rs b/pallets/xcm-transactor/src/lib.rs index e4267936e6..c7f990141f 100644 --- a/pallets/xcm-transactor/src/lib.rs +++ b/pallets/xcm-transactor/src/lib.rs @@ -55,6 +55,8 @@ pub(crate) mod mock; #[cfg(test)] mod tests; +pub mod migrations; + #[pallet] pub mod pallet { @@ -147,6 +149,24 @@ pub mod pallet { pub fee_per_weight: u128, } + /// Stores the information to be able to issue a transact operation in another chain use an + /// asset as fee payer. + #[derive(Default, Clone, Encode, Decode, RuntimeDebug, PartialEq, scale_info::TypeInfo)] + pub struct RemoteTransactInfoWithMaxWeight { + /// Extra weight that transacting a call in a destination chain adds + pub transact_extra_weight: Weight, + /// Fee per call byte + pub fee_per_byte: u128, + /// Size of the tx metadata of a transaction in the destination chain + pub metadata_size: u64, + /// Minimum weight the destination chain charges for a transaction + pub base_weight: Weight, + /// Fee per weight in the destination chain + pub fee_per_weight: u128, + /// Max destination weight + pub max_weight: Weight, + } + // Since we are using pallet-utility for account derivation (through AsDerivative), // we need to provide an index for the account derivation. This storage item stores the index // assigned for a given local account. These indices are usable as derivative in the relay chain @@ -154,13 +174,13 @@ pub mod pallet { #[pallet::getter(fn index_to_account)] pub type IndexToAccount = StorageMap<_, Blake2_128Concat, u16, T::AccountId>; - // Stores the transact info of a MULTIlOCAITON. This defines how much extra weight we need to + // Stores the transact info of a MultiLocation. This defines how much extra weight we need to // add when we want to transact in the destination chain and how we convert weight to units // in the destination chain #[pallet::storage] #[pallet::getter(fn transact_info)] - pub type TransactInfo = - StorageMap<_, Blake2_128Concat, MultiLocation, RemoteTransactInfo>; + pub type TransactInfoWithWeightLimit = + StorageMap<_, Blake2_128Concat, MultiLocation, RemoteTransactInfoWithMaxWeight>; /// An error that can occur while executing the mapping pallet's logic. #[pallet::error] @@ -194,7 +214,7 @@ pub mod pallet { TransactedSovereign(T::AccountId, MultiLocation, Vec), RegisterdDerivative(T::AccountId, u16), TransactFailed(XcmError), - TransactInfoChanged(MultiLocation, RemoteTransactInfo), + TransactInfoChanged(MultiLocation, RemoteTransactInfoWithMaxWeight), } #[pallet::call] @@ -399,19 +419,21 @@ pub mod pallet { base_weight: Weight, fee_per_weight: u128, metadata_size: u64, + max_weight: u64, ) -> DispatchResult { T::DerivativeAddressRegistrationOrigin::ensure_origin(origin)?; let location = MultiLocation::try_from(location).map_err(|()| Error::::BadVersion)?; - let remote_info = RemoteTransactInfo { + let remote_info = RemoteTransactInfoWithMaxWeight { transact_extra_weight, fee_per_byte, base_weight, fee_per_weight, metadata_size, + max_weight, }; - TransactInfo::::insert(&location, &remote_info); + TransactInfoWithWeightLimit::::insert(&location, &remote_info); Self::deposit_event(Event::TransactInfoChanged(location, remote_info)); Ok(()) @@ -427,8 +449,8 @@ pub mod pallet { call: Vec, ) -> DispatchResult { // Grab transact info for the fee loation provided - let transactor_info = - TransactInfo::::get(&fee_location).ok_or(Error::::TransactorInfoNotSet)?; + let transactor_info = TransactInfoWithWeightLimit::::get(&fee_location) + .ok_or(Error::::TransactorInfoNotSet)?; // Calculate the total weight that the xcm message is going to spend in the // destination chain diff --git a/pallets/xcm-transactor/src/tests.rs b/pallets/xcm-transactor/src/tests.rs index 86d1618fbf..058ec719ef 100644 --- a/pallets/xcm-transactor/src/tests.rs +++ b/pallets/xcm-transactor/src/tests.rs @@ -17,7 +17,9 @@ use crate::mock::*; use crate::*; use frame_support::dispatch::DispatchError; -use frame_support::{assert_noop, assert_ok}; +use frame_support::{ + assert_noop, assert_ok, storage::migration::put_storage_value, Blake2_128Concat, +}; use xcm::latest::{Junction, Junctions, MultiLocation}; use xcm_primitives::{UtilityAvailableCalls, UtilityEncodeCall}; #[test] @@ -75,7 +77,8 @@ fn test_transact_through_derivative_errors() { 0, 0, 1, - 0 + 0, + 1 )); // Not using the same fee asset as the destination chain, so error @@ -145,7 +148,8 @@ fn test_transact_through_derivative_multilocation_success() { 0, 0, 1, - 0 + 0, + 1 )); // fee as destination are the same, this time it should work @@ -161,12 +165,13 @@ fn test_transact_through_derivative_multilocation_success() { crate::Event::RegisterdDerivative(1u64, 1), crate::Event::TransactInfoChanged( MultiLocation::parent(), - RemoteTransactInfo { + RemoteTransactInfoWithMaxWeight { transact_extra_weight: 0, fee_per_byte: 0, base_weight: 0, fee_per_weight: 1, metadata_size: 0, + max_weight: 1, }, ), crate::Event::TransactedDerivative( @@ -198,7 +203,8 @@ fn test_transact_through_derivative_success() { 0, 0, 1, - 0 + 0, + 1 )); // fee as destination are the same, this time it should work @@ -214,12 +220,13 @@ fn test_transact_through_derivative_success() { crate::Event::RegisterdDerivative(1u64, 1), crate::Event::TransactInfoChanged( MultiLocation::parent(), - RemoteTransactInfo { + RemoteTransactInfoWithMaxWeight { transact_extra_weight: 0, fee_per_byte: 0, base_weight: 0, fee_per_weight: 1, metadata_size: 0, + max_weight: 1, }, ), crate::Event::TransactedDerivative( @@ -261,7 +268,8 @@ fn test_root_can_transact_through_sovereign() { 0, 0, 1, - 0 + 0, + 1 )); // fee as destination are the same, this time it should work @@ -277,12 +285,13 @@ fn test_root_can_transact_through_sovereign() { let expected = vec![ crate::Event::TransactInfoChanged( MultiLocation::parent(), - RemoteTransactInfo { + RemoteTransactInfoWithMaxWeight { transact_extra_weight: 0, fee_per_byte: 0, base_weight: 0, fee_per_weight: 1, metadata_size: 0, + max_weight: 1, }, ), crate::Event::TransactedSovereign(1u64, MultiLocation::parent(), vec![1u8]), @@ -310,3 +319,51 @@ fn test_fee_calculation_works() { ); }) } + +#[test] +fn test_max_transact_weight_migration_works() { + ExtBuilder::default() + .with_balances(vec![]) + .build() + .execute_with(|| { + let pallet_prefix: &[u8] = b"XcmTransactor"; + let storage_item_prefix: &[u8] = b"TransactInfo"; + use frame_support::traits::OnRuntimeUpgrade; + use frame_support::StorageHasher; + use parity_scale_codec::Encode; + + // This is the previous struct, which we have moved to migrations + let old_transact_info = migrations::OldRemoteTransactInfo { + transact_extra_weight: 0, + fee_per_byte: 0, + base_weight: 0, + fee_per_weight: 1, + metadata_size: 0, + }; + // This is the new struct + let expected_transacted_info = RemoteTransactInfoWithMaxWeight { + transact_extra_weight: 0, + fee_per_byte: 0, + base_weight: 0, + fee_per_weight: 1, + metadata_size: 0, + max_weight: 12000000000, + }; + + // We populate the previous key with the previous struct + put_storage_value( + pallet_prefix, + storage_item_prefix, + &Blake2_128Concat::hash(&MultiLocation::parent().encode()), + old_transact_info, + ); + // We run the migration + crate::migrations::MaxTransactWeight::::on_runtime_upgrade(); + + // We make sure that the new storage key is populated + assert_eq!( + XcmTransactor::transact_info(MultiLocation::parent()).unwrap(), + expected_transacted_info, + ) + }) +} From 1917a70ce96af19c7db4815dad52a989da28b60e Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 20 Dec 2021 13:38:44 +0100 Subject: [PATCH 02/66] Add log --- pallets/xcm-transactor/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pallets/xcm-transactor/Cargo.toml b/pallets/xcm-transactor/Cargo.toml index 5bf417f46b..c746a4cf56 100644 --- a/pallets/xcm-transactor/Cargo.toml +++ b/pallets/xcm-transactor/Cargo.toml @@ -5,6 +5,7 @@ edition = "2018" version = "0.1.0" [dependencies] +log = { version = "0.4", default-features = false } serde = { version = "1.0.124", optional = true } # Moonbeam From fdfebab83218161617ac896e22fa05c3199d69e5 Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 20 Dec 2021 15:19:33 +0100 Subject: [PATCH 03/66] Pallet works --- Cargo.lock | 1 + pallets/xcm-transactor/src/lib.rs | 33 +++++------------------------ pallets/xcm-transactor/src/mock.rs | 5 ----- pallets/xcm-transactor/src/tests.rs | 33 ++++++++++++++++++----------- primitives/xcm/src/lib.rs | 2 -- 5 files changed, 27 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 94c5d52a5f..65430832fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13760,6 +13760,7 @@ dependencies = [ "cumulus-primitives-core", "frame-support", "frame-system", + "log", "orml-traits", "pallet-balances", "pallet-timestamp", diff --git a/pallets/xcm-transactor/src/lib.rs b/pallets/xcm-transactor/src/lib.rs index c7f990141f..26699c951b 100644 --- a/pallets/xcm-transactor/src/lib.rs +++ b/pallets/xcm-transactor/src/lib.rs @@ -133,22 +133,6 @@ pub mod pallet { type BaseXcmWeight: Get; } - /// Stores the information to be able to issue a transact operation in another chain use an - /// asset as fee payer. - #[derive(Default, Clone, Encode, Decode, RuntimeDebug, PartialEq, scale_info::TypeInfo)] - pub struct RemoteTransactInfo { - /// Extra weight that transacting a call in a destination chain adds - pub transact_extra_weight: Weight, - /// Fee per call byte - pub fee_per_byte: u128, - /// Size of the tx metadata of a transaction in the destination chain - pub metadata_size: u64, - /// Minimum weight the destination chain charges for a transaction - pub base_weight: Weight, - /// Fee per weight in the destination chain - pub fee_per_weight: u128, - } - /// Stores the information to be able to issue a transact operation in another chain use an /// asset as fee payer. #[derive(Default, Clone, Encode, Decode, RuntimeDebug, PartialEq, scale_info::TypeInfo)] @@ -268,12 +252,6 @@ pub mod pallet { ) -> DispatchResult { let who = ensure_signed(origin)?; - // Ensure the specified destination transact_weight is not reached - ensure!( - dest_weight < dest.clone().max_transact_weight(), - Error::::MaxWeightTransactReached - ); - let fee_location = MultiLocation::try_from(fee_location).map_err(|()| Error::::BadVersion)?; // The index exists @@ -330,12 +308,6 @@ pub mod pallet { ) -> DispatchResult { let who = ensure_signed(origin)?; - // Ensure the specified destination transact_weight is not reached - ensure!( - dest_weight < dest.clone().max_transact_weight(), - Error::::MaxWeightTransactReached - ); - let fee_location: MultiLocation = T::CurrencyIdToMultiLocation::convert(currency_id) .ok_or(Error::::NotCrossChainTransferableCurrency)?; @@ -458,6 +430,11 @@ pub mod pallet { .checked_add(transactor_info.transact_extra_weight) .ok_or(Error::::WeightOverflow)?; + ensure!( + total_weight < transactor_info.max_weight, + Error::::MaxWeightTransactReached + ); + // Multiply weight*destination_units_per_second to see how much we should charge for // this weight execution let amount = Self::calculate_fee_per_weight( diff --git a/pallets/xcm-transactor/src/mock.rs b/pallets/xcm-transactor/src/mock.rs index e8f4a31671..1fbedc9583 100644 --- a/pallets/xcm-transactor/src/mock.rs +++ b/pallets/xcm-transactor/src/mock.rs @@ -269,11 +269,6 @@ impl XcmTransact for Transactors { Transactors::Relay => MultiLocation::parent(), } } - fn max_transact_weight(self) -> Weight { - match self { - Transactors::Relay => 20000000000, - } - } } impl UtilityEncodeCall for Transactors { diff --git a/pallets/xcm-transactor/src/tests.rs b/pallets/xcm-transactor/src/tests.rs index 058ec719ef..dfe93f9830 100644 --- a/pallets/xcm-transactor/src/tests.rs +++ b/pallets/xcm-transactor/src/tests.rs @@ -78,7 +78,7 @@ fn test_transact_through_derivative_errors() { 0, 1, 0, - 1 + 10000 )); // Not using the same fee asset as the destination chain, so error @@ -113,17 +113,26 @@ fn test_transact_through_derivative_errors() { Error::::TransactorInfoNotSet ); + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + Origin::root(), + xcm::VersionedMultiLocation::V1(MultiLocation::parent()), + 0, + 0, + 0, + 1, + 0, + 10000 + )); + // Cannot exceed the max weight assert_noop!( XcmTransactor::transact_through_derivative_multilocation( Origin::signed(1u64), Transactors::Relay, 1, - xcm::VersionedMultiLocation::V1(MultiLocation::new( - 1, - Junctions::X1(Junction::PalletInstance(1)) - )), - 21000000000u64, + xcm::VersionedMultiLocation::V1(MultiLocation::parent()), + 10001u64, vec![0u8] ), Error::::MaxWeightTransactReached @@ -149,7 +158,7 @@ fn test_transact_through_derivative_multilocation_success() { 0, 1, 0, - 1 + 10000 )); // fee as destination are the same, this time it should work @@ -171,7 +180,7 @@ fn test_transact_through_derivative_multilocation_success() { base_weight: 0, fee_per_weight: 1, metadata_size: 0, - max_weight: 1, + max_weight: 10000, }, ), crate::Event::TransactedDerivative( @@ -204,7 +213,7 @@ fn test_transact_through_derivative_success() { 0, 1, 0, - 1 + 10000 )); // fee as destination are the same, this time it should work @@ -226,7 +235,7 @@ fn test_transact_through_derivative_success() { base_weight: 0, fee_per_weight: 1, metadata_size: 0, - max_weight: 1, + max_weight: 10000, }, ), crate::Event::TransactedDerivative( @@ -269,7 +278,7 @@ fn test_root_can_transact_through_sovereign() { 0, 1, 0, - 1 + 10000 )); // fee as destination are the same, this time it should work @@ -291,7 +300,7 @@ fn test_root_can_transact_through_sovereign() { base_weight: 0, fee_per_weight: 1, metadata_size: 0, - max_weight: 1, + max_weight: 10000, }, ), crate::Event::TransactedSovereign(1u64, MultiLocation::parent(), vec![1u8]), diff --git a/primitives/xcm/src/lib.rs b/primitives/xcm/src/lib.rs index 63634900ac..dad03c6cf3 100644 --- a/primitives/xcm/src/lib.rs +++ b/primitives/xcm/src/lib.rs @@ -302,8 +302,6 @@ pub trait UtilityEncodeCall { pub trait XcmTransact: UtilityEncodeCall { /// Encode call from the relay. fn destination(self) -> MultiLocation; - /// Maximum weight for the entire Transact operation - fn max_transact_weight(self) -> Weight; } /// This trait ensure we can convert AccountIds to CurrencyIds From 1fadacc34ed741b7e6925ede8f1e5114cf5bd2d9 Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 20 Dec 2021 16:03:34 +0100 Subject: [PATCH 04/66] Adapt all tests to new pallets --- pallets/xcm-transactor/Cargo.toml | 1 + precompiles/xcm_transactor/src/lib.rs | 5 +++-- precompiles/xcm_transactor/src/tests.rs | 10 ++++++--- runtime/moonbase/src/lib.rs | 8 ------- runtime/moonbase/tests/integration_test.rs | 20 ++++++++++++++---- runtime/moonbase/tests/xcm_mock/parachain.rs | 8 ------- runtime/moonbase/tests/xcm_tests.rs | 6 ++++-- runtime/moonriver/src/lib.rs | 9 -------- runtime/moonriver/tests/integration_test.rs | 21 +++++++++++++++---- runtime/moonriver/tests/xcm_mock/parachain.rs | 8 ------- runtime/moonriver/tests/xcm_tests.rs | 6 ++++-- 11 files changed, 52 insertions(+), 50 deletions(-) diff --git a/pallets/xcm-transactor/Cargo.toml b/pallets/xcm-transactor/Cargo.toml index c746a4cf56..86b6147b1f 100644 --- a/pallets/xcm-transactor/Cargo.toml +++ b/pallets/xcm-transactor/Cargo.toml @@ -53,3 +53,4 @@ std = [ "xcm-primitives/std", "xcm/std", ] +try-runtime = [ "frame-support/try-runtime" ] \ No newline at end of file diff --git a/precompiles/xcm_transactor/src/lib.rs b/precompiles/xcm_transactor/src/lib.rs index 78d1ff5fb4..51e86ad5a8 100644 --- a/precompiles/xcm_transactor/src/lib.rs +++ b/precompiles/xcm_transactor/src/lib.rs @@ -33,7 +33,7 @@ use sp_std::{ }; use xcm::latest::MultiLocation; use xcm_primitives::AccountIdToCurrencyId; -use xcm_transactor::RemoteTransactInfo; +use xcm_transactor::RemoteTransactInfoWithMaxWeight; #[cfg(test)] mod mock; #[cfg(test)] @@ -131,7 +131,7 @@ where let multilocation: MultiLocation = input.read::()?; // fetch data from pallet - let remote_transact_info: RemoteTransactInfo = + let remote_transact_info: RemoteTransactInfoWithMaxWeight = xcm_transactor::Pallet::::transact_info(multilocation) .ok_or(error("Transact Info not set"))?; @@ -144,6 +144,7 @@ where .write(remote_transact_info.metadata_size) .write(remote_transact_info.base_weight) .write(remote_transact_info.fee_per_weight) + .write(remote_transact_info.max_weight) .build(), logs: Default::default(), }) diff --git a/precompiles/xcm_transactor/src/tests.rs b/precompiles/xcm_transactor/src/tests.rs index 6cbe85084e..030a2482d9 100644 --- a/precompiles/xcm_transactor/src/tests.rs +++ b/precompiles/xcm_transactor/src/tests.rs @@ -161,7 +161,8 @@ fn take_transact_info() { 0, 0, 1, - 0 + 0, + 10000 )); // Expected result is zero @@ -173,6 +174,7 @@ fn take_transact_info() { .write(0u64) .write(0u64) .write(1u128) + .write(10000u64) .build(), cost: 1, logs: Default::default(), @@ -202,7 +204,8 @@ fn test_transactor_multilocation() { 0, 0, 1, - 0 + 0, + 10000 )); // we pay with our current self reserve. @@ -257,7 +260,8 @@ fn test_transactor() { 0, 0, 1, - 0 + 0, + 10000 )); let bytes: Bytes = vec![1u8, 2u8, 3u8].as_slice().into(); diff --git a/runtime/moonbase/src/lib.rs b/runtime/moonbase/src/lib.rs index 3809fc9058..43bcf92586 100644 --- a/runtime/moonbase/src/lib.rs +++ b/runtime/moonbase/src/lib.rs @@ -1394,14 +1394,6 @@ impl XcmTransact for Transactors { Transactors::Relay => MultiLocation::parent(), } } - fn max_transact_weight(self) -> Weight { - match self { - // Westend is 20,000,000,000 - // This needs to take into account the rest of the message - // We use 12,000,000,000 to be safe - Transactors::Relay => 12_000_000_000, - } - } } impl xcm_transactor::Config for Runtime { diff --git a/runtime/moonbase/tests/integration_test.rs b/runtime/moonbase/tests/integration_test.rs index 3a24159846..449c4d5504 100644 --- a/runtime/moonbase/tests/integration_test.rs +++ b/runtime/moonbase/tests/integration_test.rs @@ -1680,6 +1680,18 @@ fn transactor_cannot_use_more_than_max_weight() { AccountId::from(ALICE), 0, )); + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + root_origin(), + xcm::VersionedMultiLocation::V1(MultiLocation::parent()), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000, + 0, + 0, + 1, + 0, + 20000 + )); assert_noop!( XcmTransactor::transact_through_derivative_multilocation( @@ -1687,8 +1699,8 @@ fn transactor_cannot_use_more_than_max_weight() { moonbase_runtime::Transactors::Relay, 0, xcm::VersionedMultiLocation::V1(MultiLocation::parent()), - // 12000000000 is the max - 13000000000, + // 20000the max + 17000, vec![], ), xcm_transactor::Error::::MaxWeightTransactReached @@ -1699,8 +1711,8 @@ fn transactor_cannot_use_more_than_max_weight() { moonbase_runtime::Transactors::Relay, 0, moonbase_runtime::CurrencyId::OtherReserve(source_id), - // 12000000000 is the max - 13000000000, + // 20000 is the max + 17000, vec![], ), xcm_transactor::Error::::MaxWeightTransactReached diff --git a/runtime/moonbase/tests/xcm_mock/parachain.rs b/runtime/moonbase/tests/xcm_mock/parachain.rs index a1b8c1e78b..9bf97f9ece 100644 --- a/runtime/moonbase/tests/xcm_mock/parachain.rs +++ b/runtime/moonbase/tests/xcm_mock/parachain.rs @@ -713,14 +713,6 @@ impl xcm_primitives::XcmTransact for MockTransactors { MockTransactors::Relay => MultiLocation::parent(), } } - fn max_transact_weight(self) -> Weight { - match self { - // Westend is 20,000,000,000 - // This needs to take into account the rest of the message - // We use 12,000,000,000 to be safe - MockTransactors::Relay => 12_000_000_000, - } - } } impl xcm_primitives::UtilityEncodeCall for MockTransactors { diff --git a/runtime/moonbase/tests/xcm_tests.rs b/runtime/moonbase/tests/xcm_tests.rs index 83391d46d1..ff31c0875e 100644 --- a/runtime/moonbase/tests/xcm_tests.rs +++ b/runtime/moonbase/tests/xcm_tests.rs @@ -807,7 +807,8 @@ fn transact_through_derivative_multilocation() { 0, 0, 1, - 0 + 0, + 20000000000 )); }); @@ -960,7 +961,8 @@ fn transact_through_sovereign() { 0, 0, 1, - 0 + 0, + 20000000000 )); }); diff --git a/runtime/moonriver/src/lib.rs b/runtime/moonriver/src/lib.rs index 026cc47458..8bdda1b388 100644 --- a/runtime/moonriver/src/lib.rs +++ b/runtime/moonriver/src/lib.rs @@ -1357,15 +1357,6 @@ impl XcmTransact for Transactors { Transactors::Relay => MultiLocation::parent(), } } - - fn max_transact_weight(self) -> Weight { - match self { - // Kusama is 20,000,000,000 - // This needs to take into account the rest of the message - // We use 12,000,000,000 to be safe - Transactors::Relay => 12_000_000_000, - } - } } impl xcm_transactor::Config for Runtime { diff --git a/runtime/moonriver/tests/integration_test.rs b/runtime/moonriver/tests/integration_test.rs index 223a6104fa..6eff15f604 100644 --- a/runtime/moonriver/tests/integration_test.rs +++ b/runtime/moonriver/tests/integration_test.rs @@ -1809,14 +1809,27 @@ fn transactor_cannot_use_more_than_max_weight() { 0, )); + // Root can set transact info + assert_ok!(XcmTransactor::set_transact_info( + root_origin(), + xcm::VersionedMultiLocation::V1(MultiLocation::parent()), + // Relay charges 1000 for every instruction, and we have 3, so 3000 + 3000, + 0, + 0, + 1, + 0, + 20000 + )); + assert_noop!( XcmTransactor::transact_through_derivative_multilocation( origin_of(AccountId::from(ALICE)), moonriver_runtime::Transactors::Relay, 0, xcm::VersionedMultiLocation::V1(MultiLocation::parent()), - // 12000000000 is the max - 13000000000, + // 2000 is the max + 17000, vec![], ), xcm_transactor::Error::::MaxWeightTransactReached @@ -1827,8 +1840,8 @@ fn transactor_cannot_use_more_than_max_weight() { moonriver_runtime::Transactors::Relay, 0, moonriver_runtime::CurrencyId::OtherReserve(source_id), - // 12000000000 is the max - 13000000000, + // 20000 is the max + 17000, vec![], ), xcm_transactor::Error::::MaxWeightTransactReached diff --git a/runtime/moonriver/tests/xcm_mock/parachain.rs b/runtime/moonriver/tests/xcm_mock/parachain.rs index f4b0ad70d3..ff66e9e6c6 100644 --- a/runtime/moonriver/tests/xcm_mock/parachain.rs +++ b/runtime/moonriver/tests/xcm_mock/parachain.rs @@ -696,14 +696,6 @@ impl xcm_primitives::XcmTransact for MockTransactors { MockTransactors::Relay => MultiLocation::parent(), } } - fn max_transact_weight(self) -> Weight { - match self { - // Kusama is 20,000,000,000 - // This needs to take into account the rest of the message - // We use 12,000,000,000 to be safe - MockTransactors::Relay => 12_000_000_000, - } - } } impl xcm_primitives::UtilityEncodeCall for MockTransactors { diff --git a/runtime/moonriver/tests/xcm_tests.rs b/runtime/moonriver/tests/xcm_tests.rs index 8186cd0f6a..9299ea7acd 100644 --- a/runtime/moonriver/tests/xcm_tests.rs +++ b/runtime/moonriver/tests/xcm_tests.rs @@ -682,7 +682,8 @@ fn transact_through_derivative_multilocation() { 0, 0, 1, - 0 + 0, + 20000000000 )); }); @@ -824,7 +825,8 @@ fn transact_through_sovereign() { 0, 0, 1, - 0 + 0, + 20000000000 )); }); From 0533b657b60d4f0e6b01d19fdf12359e80871525 Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 20 Dec 2021 18:03:28 +0100 Subject: [PATCH 05/66] wip --- Cargo.lock | 1 + pallets/author-mapping/src/migrations.rs | 8 ++- pallets/migrations/Cargo.toml | 2 +- pallets/parachain-staking/src/migrations.rs | 4 +- runtime/common/Cargo.toml | 5 ++ runtime/common/src/migrations.rs | 59 +++++++++++++++++++++ runtime/moonbase/Cargo.toml | 2 +- runtime/moonriver/Cargo.toml | 2 +- 8 files changed, 73 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 65430832fb..1242255f59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9869,6 +9869,7 @@ dependencies = [ "sp-core", "sp-runtime", "sp-std", + "xcm-transactor", ] [[package]] diff --git a/pallets/author-mapping/src/migrations.rs b/pallets/author-mapping/src/migrations.rs index 36ddd80adb..cbf2dcb87b 100644 --- a/pallets/author-mapping/src/migrations.rs +++ b/pallets/author-mapping/src/migrations.rs @@ -107,7 +107,7 @@ impl OnRuntimeUpgrade for TwoXToBlake { // Read an example pair from old storage and set it aside in temp storage if mapping_count > 0 { let example_pair = storage_key_iter::< - T::AuthorId, + NimbusId, RegistrationInfo>, Twox64Concat, >(pallet_prefix, storage_item_prefix) @@ -132,10 +132,8 @@ impl OnRuntimeUpgrade for TwoXToBlake { // Check that our example pair is still well-mapped after the migration if new_mapping_count > 0 { - let (account, original_info): ( - T::AuthorId, - RegistrationInfo>, - ) = Self::get_temp_storage("example_pair").expect("qed"); + let (account, original_info): (NimbusId, RegistrationInfo>) = + Self::get_temp_storage("example_pair").expect("qed"); let migrated_info = MappingWithDeposit::::get(account).expect("qed"); assert_eq!(original_info, migrated_info); } diff --git a/pallets/migrations/Cargo.toml b/pallets/migrations/Cargo.toml index 0bcd240bf6..137bf44c1f 100644 --- a/pallets/migrations/Cargo.toml +++ b/pallets/migrations/Cargo.toml @@ -33,4 +33,4 @@ std = [ ] try-runtime = [ "frame-support/try-runtime", -] +] \ No newline at end of file diff --git a/pallets/parachain-staking/src/migrations.rs b/pallets/parachain-staking/src/migrations.rs index e065ddadec..b333b9fa03 100644 --- a/pallets/parachain-staking/src/migrations.rs +++ b/pallets/parachain-staking/src/migrations.rs @@ -104,7 +104,7 @@ impl OnRuntimeUpgrade for IncreaseMaxDelegationsPerCandidate { state.top_delegations.len() as u32 + state.bottom_delegations.len() as u32; Self::set_temp_storage( total_delegation_count, - &format!("Candidate{}DelegationCount", account)[..], + &format!("Candidate{:?}DelegationCount", account)[..], ); } Ok(()) @@ -115,7 +115,7 @@ impl OnRuntimeUpgrade for IncreaseMaxDelegationsPerCandidate { // check that top + bottom are the same as the expected (stored in temp) for (account, state) in >::iter() { let expected_count: u32 = - Self::get_temp_storage(&format!("Candidate{}DelegationCount", account)[..]) + Self::get_temp_storage(&format!("Candidate{:?}DelegationCount", account)[..]) .expect("qed"); let actual_count = state.top_delegations.len() as u32 + state.bottom_delegations.len() as u32; diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 23e892d0a6..2d584d90bf 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -15,6 +15,7 @@ pallet-asset-manager = { path = "../../pallets/asset-manager", optional = true, pallet-author-mapping = { path = "../../pallets/author-mapping", default-features = false } pallet-migrations = { path = "../../pallets/migrations", default-features = false } parachain-staking = { path = "../../pallets/parachain-staking", default-features = false } +xcm-transactor = { path = "../../pallets/xcm-transactor", default-features = false, optional=true } # Substrate frame-support = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.12", default-features = false } @@ -38,4 +39,8 @@ std = [ "sp-core/std", "sp-runtime/std", "sp-std/std", + "xcm-transactor/std", +] +xcm-support = [ + "xcm-transactor" ] diff --git a/runtime/common/src/migrations.rs b/runtime/common/src/migrations.rs index 1ac4d9033e..a3df9ddf1b 100644 --- a/runtime/common/src/migrations.rs +++ b/runtime/common/src/migrations.rs @@ -29,6 +29,8 @@ use parachain_staking::{ Config as ParachainStakingConfig, }; use sp_std::{marker::PhantomData, prelude::*}; +#[cfg(feature = "xcm-support")] +use xcm_transactor::{migrations::MaxTransactWeight, Config as XcmTransactorConfig}; /// This module acts as a registry where each migration is defined. Each migration should implement /// the "Migration" trait declared in the pallet-migrations crate. @@ -167,6 +169,31 @@ where } } +#[cfg(feature = "xcm-support")] +pub struct XcmTransactorMaxTransactWeight(PhantomData); +#[cfg(feature = "xcm-support")] +impl Migration for XcmTransactorMaxTransactWeight { + fn friendly_name(&self) -> &str { + "MM_Xcm_Transactor_MaxTransactWeight" + } + + fn migrate(&self, _available_weight: Weight) -> Weight { + MaxTransactWeight::::on_runtime_upgrade() + } + + /// Run a standard pre-runtime test. This works the same way as in a normal runtime upgrade. + #[cfg(feature = "try-runtime")] + fn pre_upgrade(&self) -> Result<(), &'static str> { + MaxTransactWeight::::pre_upgrade() + } + + /// Run a standard post-runtime test. This works the same way as in a normal runtime upgrade. + #[cfg(feature = "try-runtime")] + fn post_upgrade(&self) -> Result<(), &'static str> { + MaxTransactWeight::::post_upgrade() + } +} + pub struct CommonMigrations(PhantomData<(Runtime, Council, Tech)>); impl Get>> @@ -191,6 +218,9 @@ where let migration_parachain_staking_increase_max_delegations_per_candidate = ParachainStakingIncreaseMaxDelegationsPerCandidate::(Default::default()); + #[cfg(feature = "xcm-support")] + let xcm_transactor_max_weight = XcmTransactorMaxTransactWeight::(Default::default()); + // TODO: this is a lot of allocation to do upon every get() call. this *should* be avoided // except when pallet_migrations undergoes a runtime upgrade -- but TODO: review @@ -207,3 +237,32 @@ where ] } } + +#[cfg(feature = "xcm-support")] +pub struct XcmMigrations(PhantomData<(Runtime)>); + +#[cfg(feature = "xcm-support")] +impl Get>> for XcmMigrations +where + Runtime: xcm_transactor::Config, +{ + fn get() -> Vec> { + #[cfg(feature = "xcm-support")] + let xcm_transactor_max_weight = XcmTransactorMaxTransactWeight::(Default::default()); + + // TODO: this is a lot of allocation to do upon every get() call. this *should* be avoided + // except when pallet_migrations undergoes a runtime upgrade -- but TODO: review + + vec![ + // completed in runtime 800 + // Box::new(migration_author_mapping_twox_to_blake), + // completed in runtime 900 + // Box::new(migration_collectives), + // completed in runtime 1000 + // Box::new(migration_parachain_staking_purge_stale_storage), + // completed in runtime 1000 + // Box::new(migration_parachain_staking_manual_exits), + Box::new(xcm_transactor_max_weight), + ] + } +} diff --git a/runtime/moonbase/Cargo.toml b/runtime/moonbase/Cargo.toml index b00c2a135a..8cbf2a9e41 100644 --- a/runtime/moonbase/Cargo.toml +++ b/runtime/moonbase/Cargo.toml @@ -19,7 +19,7 @@ account = { path = "../../primitives/account/", default-features = false } moonbeam-core-primitives = { path = "../../core-primitives", default-features = false } moonbeam-relay-encoder = { path = "../relay-encoder", default-features = false } precompile-utils = { path = "../../precompiles/utils", default-features = false } -runtime-common = { path = "../common", default-features = false } +runtime-common = { path = "../common", default-features = false, features = [ "xcm-support" ] } xcm-primitives = { path = "../../primitives/xcm/", default-features = false } # Moonbeam pallets diff --git a/runtime/moonriver/Cargo.toml b/runtime/moonriver/Cargo.toml index 2a2fe96f1b..e8af3a6b96 100644 --- a/runtime/moonriver/Cargo.toml +++ b/runtime/moonriver/Cargo.toml @@ -19,7 +19,7 @@ account = { path = "../../primitives/account/", default-features = false } moonbeam-core-primitives = { path = "../../core-primitives", default-features = false } moonbeam-relay-encoder = { path = "../relay-encoder", default-features = false } precompile-utils = { path = "../../precompiles/utils", default-features = false } -runtime-common = { path = "../common", default-features = false } +runtime-common = { path = "../common", default-features = false, features = [ "xcm-support" ] } xcm-primitives = { path = "../../primitives/xcm/", default-features = false } # Moonbeam pallets From e39eec119fce356bd4006203c4d4aef2b7e2c9b7 Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 21 Dec 2021 09:22:06 +0100 Subject: [PATCH 06/66] Missing file --- pallets/xcm-transactor/src/migrations.rs | 181 +++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 pallets/xcm-transactor/src/migrations.rs diff --git a/pallets/xcm-transactor/src/migrations.rs b/pallets/xcm-transactor/src/migrations.rs new file mode 100644 index 0000000000..5d82988e7b --- /dev/null +++ b/pallets/xcm-transactor/src/migrations.rs @@ -0,0 +1,181 @@ +// Copyright 2019-2021 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Moonbeam is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Moonbeam. If not, see . + +use crate::{Config, RemoteTransactInfoWithMaxWeight, TransactInfoWithWeightLimit}; +use frame_support::{ + pallet_prelude::PhantomData, + storage::migration::{remove_storage_prefix, storage_key_iter}, + traits::{Get, OnRuntimeUpgrade}, + weights::Weight, + Blake2_128Concat, +}; +use parity_scale_codec::{Decode, Encode}; +use sp_runtime::RuntimeDebug; +use sp_std::convert::TryInto; +use xcm::latest::MultiLocation; +//TODO sometimes this is unused, sometimes its necessary +use sp_std::vec::Vec; + +// This is the old storage, we write it here so that we know how to decode existing data +#[derive(Default, Clone, Encode, Decode, RuntimeDebug, PartialEq, scale_info::TypeInfo)] +pub struct OldRemoteTransactInfo { + /// Extra weight that transacting a call in a destination chain adds + pub transact_extra_weight: Weight, + /// Fee per call byte + pub fee_per_byte: u128, + /// Size of the tx metadata of a transaction in the destination chain + pub metadata_size: u64, + /// Minimum weight the destination chain charges for a transaction + pub base_weight: Weight, + /// Fee per weight in the destination chain + pub fee_per_weight: u128, +} + +pub struct MaxTransactWeight(PhantomData); +impl OnRuntimeUpgrade for MaxTransactWeight { + fn on_runtime_upgrade() -> Weight { + log::info!(target: "MaxTransactWeight", "actually running it"); + let pallet_prefix: &[u8] = b"XcmTransactor"; + let storage_item_prefix: &[u8] = b"TransactInfo"; + + // Read all the data into memory. + // https://crates.parity.io/frame_support/storage/migration/fn.storage_key_iter.html + let stored_data: Vec<_> = storage_key_iter::< + MultiLocation, + OldRemoteTransactInfo, + Blake2_128Concat, + >(pallet_prefix, storage_item_prefix) + .collect(); + + let migrated_count: Weight = stored_data + .len() + .try_into() + .expect("There are between 0 and 2**64 mappings stored."); + + // Now remove the old storage + // https://crates.parity.io/frame_support/storage/migration/fn.remove_storage_prefix.html + remove_storage_prefix(pallet_prefix, storage_item_prefix, &[]); + + // Assert that old storage is empty + assert!( + storage_key_iter::( + pallet_prefix, + storage_item_prefix + ) + .next() + .is_none() + ); + + // Write the mappings back to storage with the new secure hasher + for (location, info) in stored_data { + TransactInfoWithWeightLimit::::insert(location, { + RemoteTransactInfoWithMaxWeight { + transact_extra_weight: info.transact_extra_weight, + /// Fee per call byte + fee_per_byte: info.fee_per_byte, + /// Size of the tx metadata of a transaction in the destination chain + metadata_size: info.metadata_size, + /// Minimum weight the destination chain charges for a transaction + base_weight: info.base_weight, + /// Fee per weight in the destination chain + fee_per_weight: info.fee_per_weight, + /// Max destination weight + max_weight: 12000000000, + } + }); + } + + log::info!(target: "MaxTransactWeight", "almost done"); + + // Return the weight used. For each migrated mapping there is a red to get it into + // memory, a write to clear the old stored value, and a write to re-store it. + let db_weights = T::DbWeight::get(); + migrated_count.saturating_mul(2 * db_weights.write + db_weights.read) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + use frame_support::storage::migration::{storage_iter, storage_key_iter}; + use frame_support::traits::OnRuntimeUpgradeHelpersExt; + + let pallet_prefix: &[u8] = b"XcmTransactor"; + let storage_item_prefix: &[u8] = b"TransactInfo"; + + // We want to test that: + // There are no entries in the new storage beforehand + // The same number of mappings exist before and after + // As long as there are some mappings stored, one representative key maps to the + // same value after the migration. + // There are no entries in the old storage afterward + + // Assert new storage is empty + // Because the pallet and item prefixes are the same, the old storage is still at this + // key. However, the values can't be decoded so the assertion passes. + assert!(TransactInfoWithWeightLimit::::iter().next().is_none()); + + // Check number of entries, and set it aside in temp storage + let stored_data: Vec<_> = storage_key_iter::< + MultiLocation, + OldRemoteTransactInfo, + Blake2_128Concat, + >(pallet_prefix, storage_item_prefix) + .collect(); + let mapping_count = stored_data.len(); + Self::set_temp_storage(mapping_count as u32, "mapping_count"); + + // Read an example pair from old storage and set it aside in temp storage + if mapping_count > 0 { + let example_pair = stored_data + .iter() + .next() + .expect("We already confirmed that there was at least one item stored"); + + Self::set_temp_storage(example_pair, "example_pair"); + } + + Ok(()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + use frame_support::traits::OnRuntimeUpgradeHelpersExt; + + // Check number of entries matches what was set aside in pre_upgrade + let old_mapping_count: u64 = Self::get_temp_storage("mapping_count") + .expect("We stored a mapping count; it should be there; qed"); + let new_mapping_count = TransactInfoWithWeightLimit::::iter().count() as u64; + assert_eq!(old_mapping_count, new_mapping_count); + + // Check that our example pair is still well-mapped after the migration + if new_mapping_count > 0 { + let (account, original_info): (MultiLocation, OldRemoteTransactInfo) = + Self::get_temp_storage("example_pair").expect("qed"); + let migrated_info = TransactInfoWithWeightLimit::::get(account).expect("qed"); + // Check all the other params are equal + assert_eq!( + original_info.transact_extra_weight, + migrated_info.transact_extra_weight + ); + assert_eq!(original_info.fee_per_byte, migrated_info.fee_per_byte); + assert_eq!(original_info.metadata_size, migrated_info.metadata_size); + assert_eq!(original_info.base_weight, migrated_info.base_weight); + assert_eq!(original_info.fee_per_weight, migrated_info.fee_per_weight); + assert_eq!(migrated_info.max_weight, 12000000000) + } + + Ok(()) + } +} From bd5561fa0fad7159b7d712d1428b69c405f2c720 Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 21 Dec 2021 10:13:40 +0100 Subject: [PATCH 07/66] Implement trait for tuples --- Cargo.lock | 2 ++ pallets/migrations/Cargo.toml | 1 + pallets/migrations/src/lib.rs | 27 ++++++++++++++++++++++----- pallets/migrations/src/mock.rs | 4 ++-- runtime/common/Cargo.toml | 1 + runtime/common/src/migrations.rs | 29 +++++++++++------------------ runtime/moonbase/src/lib.rs | 13 ++++++++----- 7 files changed, 47 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1242255f59..8ab40764bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6973,6 +6973,7 @@ dependencies = [ "environmental", "frame-support", "frame-system", + "impl-trait-for-tuples 0.2.1", "log", "parity-scale-codec", "scale-info", @@ -9859,6 +9860,7 @@ version = "0.8.0-dev" dependencies = [ "frame-support", "frame-system", + "impl-trait-for-tuples 0.2.1", "log", "pallet-asset-manager", "pallet-author-mapping", diff --git a/pallets/migrations/Cargo.toml b/pallets/migrations/Cargo.toml index 137bf44c1f..e549cbe60b 100644 --- a/pallets/migrations/Cargo.toml +++ b/pallets/migrations/Cargo.toml @@ -7,6 +7,7 @@ version = "0.1.0" [dependencies] log = "0.4" +impl-trait-for-tuples = "0.2.1" # Substrate frame-support = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.12", default-features = false } diff --git a/pallets/migrations/src/lib.rs b/pallets/migrations/src/lib.rs index ed0173042f..21939eca86 100644 --- a/pallets/migrations/src/lib.rs +++ b/pallets/migrations/src/lib.rs @@ -69,13 +69,30 @@ pub mod pallet { #[pallet::pallet] pub struct Pallet(PhantomData); + // The migration trait + pub trait Migrate { + // Migration list Getter + fn get_migrations() -> Vec>; + } + + #[impl_trait_for_tuples::impl_for_tuples(30)] + impl Migrate for Tuple { + fn get_migrations() -> Vec> { + let mut migrations = Vec::new(); + + for_tuples!( #( migrations.extend(Tuple::get_migrations()); )* ); + + migrations + } + } + /// Configuration trait of this pallet. #[pallet::config] pub trait Config: frame_system::Config { /// Overarching event type type Event: From> + IsType<::Event>; /// The list of migrations that will be performed - type MigrationsList: Get>>; + type MigrationsList: Migrate; } #[pallet::event] @@ -121,7 +138,7 @@ pub mod pallet { use frame_support::traits::OnRuntimeUpgradeHelpersExt; let mut failed = false; - for migration in &T::MigrationsList::get() { + for migration in &T::MigrationsList::get_migrations() { let migration_name = migration.friendly_name(); let migration_name_as_bytes = migration_name.as_bytes(); @@ -164,7 +181,7 @@ pub mod pallet { // TODO: my desire to DRY all the things feels like this code is very repetitive... let mut failed = false; - for migration in &T::MigrationsList::get() { + for migration in &T::MigrationsList::get_migrations() { let migration_name = migration.friendly_name(); // we can't query MigrationState because on_runtime_upgrade() would have @@ -225,7 +242,7 @@ pub mod pallet { fn build(&self) { // When building a new genesis, all listed migrations should be considered as already // applied, they only make sense for networks that had been launched in the past. - for migration_name in T::MigrationsList::get() + for migration_name in T::MigrationsList::get_migrations() .into_iter() .map(|migration| migration.friendly_name().as_bytes().to_vec()) { @@ -237,7 +254,7 @@ pub mod pallet { fn perform_runtime_upgrades(available_weight: Weight) -> Weight { let mut weight: Weight = 0u64.into(); - for migration in &T::MigrationsList::get() { + for migration in &T::MigrationsList::get_migrations() { let migration_name = migration.friendly_name(); let migration_name_as_bytes = migration_name.as_bytes(); log::debug!( target: "pallet-migrations", "evaluating migration {}", migration_name); diff --git a/pallets/migrations/src/mock.rs b/pallets/migrations/src/mock.rs index 749142e6f6..f938d85e89 100644 --- a/pallets/migrations/src/mock.rs +++ b/pallets/migrations/src/mock.rs @@ -235,8 +235,8 @@ impl Migration for MockMigration { /// Implementation of Migrations. Generates a Vec of MockMigrations on the fly based on the current /// contents of MOCK_MIGRATIONS_LIST. pub struct MockMigrations; -impl Get>> for MockMigrations { - fn get() -> Vec> { +impl Migrate for MockMigrations { + fn get_migrations() -> Vec> { let mut migrations: Vec> = Vec::new(); MOCK_MIGRATIONS_LIST::with(|mgr: &mut MockMigrationManager| { migrations = mgr.generate_migrations_list(); diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 2d584d90bf..14dd432c41 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -9,6 +9,7 @@ version = "0.8.0-dev" [dependencies] log = "0.4" +impl-trait-for-tuples = "0.2.1" # Moonbeam pallet-asset-manager = { path = "../../pallets/asset-manager", optional = true, default-features = false } diff --git a/runtime/common/src/migrations.rs b/runtime/common/src/migrations.rs index a3df9ddf1b..7b84397811 100644 --- a/runtime/common/src/migrations.rs +++ b/runtime/common/src/migrations.rs @@ -22,8 +22,9 @@ use frame_support::{ traits::{OnRuntimeUpgrade, PalletInfoAccess}, weights::Weight, }; +use frame_system::pallet; use pallet_author_mapping::{migrations::TwoXToBlake, Config as AuthorMappingConfig}; -use pallet_migrations::Migration; +use pallet_migrations::{Migrate, Migration}; use parachain_staking::{ migrations::{IncreaseMaxDelegationsPerCandidate, PurgeStaleStorage, RemoveExitQueue}, Config as ParachainStakingConfig, @@ -196,21 +197,17 @@ impl Migration for XcmTransactorMaxTransactWeight { pub struct CommonMigrations(PhantomData<(Runtime, Council, Tech)>); -impl Get>> - for CommonMigrations +impl Migrate for CommonMigrations where - Runtime: pallet_author_mapping::Config + parachain_staking::Config, + Runtime: pallet_author_mapping::Config + parachain_staking::Config + pallet_migrations::Config, Council: GetStorageVersion + PalletInfoAccess + 'static, Tech: GetStorageVersion + PalletInfoAccess + 'static, { - fn get() -> Vec> { + fn get_migrations() -> Vec> { // let migration_author_mapping_twox_to_blake = AuthorMappingTwoXToBlake:: { // 0: Default::default(), // }; - // let migration_collectives = - // MigrateCollectivePallets::(Default::default()); - // let migration_parachain_staking_purge_stale_storage = // ParachainStakingPurgeStaleStorage::(Default::default()); // let migration_parachain_staking_manual_exits = @@ -218,9 +215,6 @@ where let migration_parachain_staking_increase_max_delegations_per_candidate = ParachainStakingIncreaseMaxDelegationsPerCandidate::(Default::default()); - #[cfg(feature = "xcm-support")] - let xcm_transactor_max_weight = XcmTransactorMaxTransactWeight::(Default::default()); - // TODO: this is a lot of allocation to do upon every get() call. this *should* be avoided // except when pallet_migrations undergoes a runtime upgrade -- but TODO: review @@ -228,7 +222,6 @@ where // completed in runtime 800 // Box::new(migration_author_mapping_twox_to_blake), // completed in runtime 900 - // Box::new(migration_collectives), // completed in runtime 1000 // Box::new(migration_parachain_staking_purge_stale_storage), // completed in runtime 1000 @@ -239,16 +232,16 @@ where } #[cfg(feature = "xcm-support")] -pub struct XcmMigrations(PhantomData<(Runtime)>); +pub struct XcmMigrations(PhantomData); #[cfg(feature = "xcm-support")] -impl Get>> for XcmMigrations +impl Migrate for XcmMigrations where - Runtime: xcm_transactor::Config, + Runtime: xcm_transactor::Config + pallet_migrations::Config, { - fn get() -> Vec> { - #[cfg(feature = "xcm-support")] - let xcm_transactor_max_weight = XcmTransactorMaxTransactWeight::(Default::default()); + fn get_migrations() -> Vec> { + let xcm_transactor_max_weight = + XcmTransactorMaxTransactWeight::(Default::default()); // TODO: this is a lot of allocation to do upon every get() call. this *should* be avoided // except when pallet_migrations undergoes a runtime upgrade -- but TODO: review diff --git a/runtime/moonbase/src/lib.rs b/runtime/moonbase/src/lib.rs index 43bcf92586..83301e1083 100644 --- a/runtime/moonbase/src/lib.rs +++ b/runtime/moonbase/src/lib.rs @@ -928,11 +928,14 @@ impl pallet_proxy::Config for Runtime { impl pallet_migrations::Config for Runtime { type Event = Event; //TODO wire up our correct list of migrations here. Maybe this shouldn't be in `runtime_common`. - type MigrationsList = runtime_common::migrations::CommonMigrations< - Runtime, - CouncilCollective, - TechCommitteeCollective, - >; + type MigrationsList = ( + runtime_common::migrations::CommonMigrations< + Runtime, + CouncilCollective, + TechCommitteeCollective, + >, + runtime_common::migrations::XcmMigrations, + ); } parameter_types! { From 199f07fd39f134eb46a6fc3e8f6d88f1035c217f Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 21 Dec 2021 12:08:47 +0100 Subject: [PATCH 08/66] Log line --- pallets/xcm-transactor/src/migrations.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pallets/xcm-transactor/src/migrations.rs b/pallets/xcm-transactor/src/migrations.rs index 5d82988e7b..9ef064002d 100644 --- a/pallets/xcm-transactor/src/migrations.rs +++ b/pallets/xcm-transactor/src/migrations.rs @@ -65,6 +65,8 @@ impl OnRuntimeUpgrade for MaxTransactWeight { .try_into() .expect("There are between 0 and 2**64 mappings stored."); + log::info!(target: "MaxTransactWeight", "Migrating {:?} elements", migrated_count); + // Now remove the old storage // https://crates.parity.io/frame_support/storage/migration/fn.remove_storage_prefix.html remove_storage_prefix(pallet_prefix, storage_item_prefix, &[]); From 9f08cf28306d9111f924a67b9af384a101e11d2e Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 21 Dec 2021 12:16:43 +0100 Subject: [PATCH 09/66] Remove trait bound to migrations::config --- pallets/migrations/src/lib.rs | 36 ++++++++++++++++---------------- pallets/migrations/src/mock.rs | 2 +- runtime/common/src/migrations.rs | 10 ++++----- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/pallets/migrations/src/lib.rs b/pallets/migrations/src/lib.rs index 21939eca86..60729783e2 100644 --- a/pallets/migrations/src/lib.rs +++ b/pallets/migrations/src/lib.rs @@ -58,6 +58,23 @@ pub trait Migration { } } +// The migration trait +pub trait GetMigrations { + // Migration list Getter + fn get_migrations() -> Vec>; +} + +#[impl_trait_for_tuples::impl_for_tuples(30)] +impl GetMigrations for Tuple { + fn get_migrations() -> Vec> { + let mut migrations = Vec::new(); + + for_tuples!( #( migrations.extend(Tuple::get_migrations()); )* ); + + migrations + } +} + #[pallet] pub mod pallet { use super::*; @@ -69,30 +86,13 @@ pub mod pallet { #[pallet::pallet] pub struct Pallet(PhantomData); - // The migration trait - pub trait Migrate { - // Migration list Getter - fn get_migrations() -> Vec>; - } - - #[impl_trait_for_tuples::impl_for_tuples(30)] - impl Migrate for Tuple { - fn get_migrations() -> Vec> { - let mut migrations = Vec::new(); - - for_tuples!( #( migrations.extend(Tuple::get_migrations()); )* ); - - migrations - } - } - /// Configuration trait of this pallet. #[pallet::config] pub trait Config: frame_system::Config { /// Overarching event type type Event: From> + IsType<::Event>; /// The list of migrations that will be performed - type MigrationsList: Migrate; + type MigrationsList: GetMigrations; } #[pallet::event] diff --git a/pallets/migrations/src/mock.rs b/pallets/migrations/src/mock.rs index f938d85e89..420ba67584 100644 --- a/pallets/migrations/src/mock.rs +++ b/pallets/migrations/src/mock.rs @@ -235,7 +235,7 @@ impl Migration for MockMigration { /// Implementation of Migrations. Generates a Vec of MockMigrations on the fly based on the current /// contents of MOCK_MIGRATIONS_LIST. pub struct MockMigrations; -impl Migrate for MockMigrations { +impl GetMigrations for MockMigrations { fn get_migrations() -> Vec> { let mut migrations: Vec> = Vec::new(); MOCK_MIGRATIONS_LIST::with(|mgr: &mut MockMigrationManager| { diff --git a/runtime/common/src/migrations.rs b/runtime/common/src/migrations.rs index 7b84397811..c30c471f63 100644 --- a/runtime/common/src/migrations.rs +++ b/runtime/common/src/migrations.rs @@ -18,13 +18,11 @@ use frame_support::{ dispatch::GetStorageVersion, - pallet_prelude::Get, traits::{OnRuntimeUpgrade, PalletInfoAccess}, weights::Weight, }; -use frame_system::pallet; use pallet_author_mapping::{migrations::TwoXToBlake, Config as AuthorMappingConfig}; -use pallet_migrations::{Migrate, Migration}; +use pallet_migrations::{GetMigrations, Migration}; use parachain_staking::{ migrations::{IncreaseMaxDelegationsPerCandidate, PurgeStaleStorage, RemoveExitQueue}, Config as ParachainStakingConfig, @@ -197,9 +195,9 @@ impl Migration for XcmTransactorMaxTransactWeight { pub struct CommonMigrations(PhantomData<(Runtime, Council, Tech)>); -impl Migrate for CommonMigrations +impl GetMigrations for CommonMigrations where - Runtime: pallet_author_mapping::Config + parachain_staking::Config + pallet_migrations::Config, + Runtime: pallet_author_mapping::Config + parachain_staking::Config, Council: GetStorageVersion + PalletInfoAccess + 'static, Tech: GetStorageVersion + PalletInfoAccess + 'static, { @@ -235,7 +233,7 @@ where pub struct XcmMigrations(PhantomData); #[cfg(feature = "xcm-support")] -impl Migrate for XcmMigrations +impl GetMigrations for XcmMigrations where Runtime: xcm_transactor::Config + pallet_migrations::Config, { From c58f1e4d0ee4fedbcb04fbebc7a5e36092a9888e Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 21 Dec 2021 12:21:36 +0100 Subject: [PATCH 10/66] Toml sort --- pallets/migrations/Cargo.toml | 4 ++-- pallets/xcm-transactor/Cargo.toml | 2 +- runtime/common/Cargo.toml | 8 +++----- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/pallets/migrations/Cargo.toml b/pallets/migrations/Cargo.toml index e549cbe60b..bf6a00b7b9 100644 --- a/pallets/migrations/Cargo.toml +++ b/pallets/migrations/Cargo.toml @@ -6,8 +6,8 @@ edition = "2018" version = "0.1.0" [dependencies] -log = "0.4" impl-trait-for-tuples = "0.2.1" +log = "0.4" # Substrate frame-support = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.12", default-features = false } @@ -34,4 +34,4 @@ std = [ ] try-runtime = [ "frame-support/try-runtime", -] \ No newline at end of file +] diff --git a/pallets/xcm-transactor/Cargo.toml b/pallets/xcm-transactor/Cargo.toml index 86b6147b1f..ee1d82f224 100644 --- a/pallets/xcm-transactor/Cargo.toml +++ b/pallets/xcm-transactor/Cargo.toml @@ -53,4 +53,4 @@ std = [ "xcm-primitives/std", "xcm/std", ] -try-runtime = [ "frame-support/try-runtime" ] \ No newline at end of file +try-runtime = [ "frame-support/try-runtime" ] diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 14dd432c41..2b0f7e4e7c 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -8,15 +8,15 @@ license = "GPL-3.0-only" version = "0.8.0-dev" [dependencies] -log = "0.4" impl-trait-for-tuples = "0.2.1" +log = "0.4" # Moonbeam pallet-asset-manager = { path = "../../pallets/asset-manager", optional = true, default-features = false } pallet-author-mapping = { path = "../../pallets/author-mapping", default-features = false } pallet-migrations = { path = "../../pallets/migrations", default-features = false } parachain-staking = { path = "../../pallets/parachain-staking", default-features = false } -xcm-transactor = { path = "../../pallets/xcm-transactor", default-features = false, optional=true } +xcm-transactor = { path = "../../pallets/xcm-transactor", optional = true, default-features = false } # Substrate frame-support = { git = "https://github.com/purestake/substrate", branch = "moonbeam-polkadot-v0.9.12", default-features = false } @@ -42,6 +42,4 @@ std = [ "sp-std/std", "xcm-transactor/std", ] -xcm-support = [ - "xcm-transactor" -] +xcm-support = [ "xcm-transactor" ] From 12ad56a20a8f40ddefd92f85c9f88ece662229da Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 21 Dec 2021 15:25:37 +0100 Subject: [PATCH 11/66] Add pallet-maintenance-mode to try-runtime --- runtime/moonbase/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/runtime/moonbase/Cargo.toml b/runtime/moonbase/Cargo.toml index 8cbf2a9e41..2df237238e 100644 --- a/runtime/moonbase/Cargo.toml +++ b/runtime/moonbase/Cargo.toml @@ -259,4 +259,5 @@ try-runtime = [ "pallet-society/try-runtime", "pallet-timestamp/try-runtime", "parachain-staking/try-runtime", + "pallet-maintenance-mode/try-runtime" ] From 8a23df6834b31dfc53e0f8d138d7c97ef8edb775 Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 21 Dec 2021 16:49:24 +0100 Subject: [PATCH 12/66] Make try-runtime compile --- pallets/author-mapping/src/migrations.rs | 8 +++----- pallets/parachain-staking/src/migrations.rs | 4 ++-- runtime/moonbase/Cargo.toml | 1 + runtime/moonbeam/Cargo.toml | 1 + runtime/moonriver/Cargo.toml | 1 + 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/pallets/author-mapping/src/migrations.rs b/pallets/author-mapping/src/migrations.rs index 36ddd80adb..cbf2dcb87b 100644 --- a/pallets/author-mapping/src/migrations.rs +++ b/pallets/author-mapping/src/migrations.rs @@ -107,7 +107,7 @@ impl OnRuntimeUpgrade for TwoXToBlake { // Read an example pair from old storage and set it aside in temp storage if mapping_count > 0 { let example_pair = storage_key_iter::< - T::AuthorId, + NimbusId, RegistrationInfo>, Twox64Concat, >(pallet_prefix, storage_item_prefix) @@ -132,10 +132,8 @@ impl OnRuntimeUpgrade for TwoXToBlake { // Check that our example pair is still well-mapped after the migration if new_mapping_count > 0 { - let (account, original_info): ( - T::AuthorId, - RegistrationInfo>, - ) = Self::get_temp_storage("example_pair").expect("qed"); + let (account, original_info): (NimbusId, RegistrationInfo>) = + Self::get_temp_storage("example_pair").expect("qed"); let migrated_info = MappingWithDeposit::::get(account).expect("qed"); assert_eq!(original_info, migrated_info); } diff --git a/pallets/parachain-staking/src/migrations.rs b/pallets/parachain-staking/src/migrations.rs index e065ddadec..b333b9fa03 100644 --- a/pallets/parachain-staking/src/migrations.rs +++ b/pallets/parachain-staking/src/migrations.rs @@ -104,7 +104,7 @@ impl OnRuntimeUpgrade for IncreaseMaxDelegationsPerCandidate { state.top_delegations.len() as u32 + state.bottom_delegations.len() as u32; Self::set_temp_storage( total_delegation_count, - &format!("Candidate{}DelegationCount", account)[..], + &format!("Candidate{:?}DelegationCount", account)[..], ); } Ok(()) @@ -115,7 +115,7 @@ impl OnRuntimeUpgrade for IncreaseMaxDelegationsPerCandidate { // check that top + bottom are the same as the expected (stored in temp) for (account, state) in >::iter() { let expected_count: u32 = - Self::get_temp_storage(&format!("Candidate{}DelegationCount", account)[..]) + Self::get_temp_storage(&format!("Candidate{:?}DelegationCount", account)[..]) .expect("qed"); let actual_count = state.top_delegations.len() as u32 + state.bottom_delegations.len() as u32; diff --git a/runtime/moonbase/Cargo.toml b/runtime/moonbase/Cargo.toml index b00c2a135a..df31096a47 100644 --- a/runtime/moonbase/Cargo.toml +++ b/runtime/moonbase/Cargo.toml @@ -259,4 +259,5 @@ try-runtime = [ "pallet-society/try-runtime", "pallet-timestamp/try-runtime", "parachain-staking/try-runtime", + "pallet-maintenance-mode/try-runtime", ] diff --git a/runtime/moonbeam/Cargo.toml b/runtime/moonbeam/Cargo.toml index 460bce2b1b..2a4a673743 100644 --- a/runtime/moonbeam/Cargo.toml +++ b/runtime/moonbeam/Cargo.toml @@ -196,4 +196,5 @@ runtime-benchmarks = [ "pallet-timestamp/runtime-benchmarks", "parachain-staking/runtime-benchmarks", "sp-runtime/runtime-benchmarks", + "pallet-maintenance-mode/try-runtime", ] diff --git a/runtime/moonriver/Cargo.toml b/runtime/moonriver/Cargo.toml index 2a2fe96f1b..50d4fa1e68 100644 --- a/runtime/moonriver/Cargo.toml +++ b/runtime/moonriver/Cargo.toml @@ -252,4 +252,5 @@ try-runtime = [ "pallet-society/try-runtime", "pallet-timestamp/try-runtime", "parachain-staking/try-runtime", + "pallet-maintenance-mode/try-runtime", ] From e5b4cc16f1381d88b83e4a3bd52d9c2a3ad56dd2 Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 21 Dec 2021 16:54:00 +0100 Subject: [PATCH 13/66] Toml sort --- runtime/moonbase/Cargo.toml | 2 +- runtime/moonbeam/Cargo.toml | 2 +- runtime/moonriver/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/runtime/moonbase/Cargo.toml b/runtime/moonbase/Cargo.toml index df31096a47..669c997dda 100644 --- a/runtime/moonbase/Cargo.toml +++ b/runtime/moonbase/Cargo.toml @@ -254,10 +254,10 @@ try-runtime = [ "pallet-author-mapping/try-runtime", "pallet-balances/try-runtime", "pallet-collective/try-runtime", + "pallet-maintenance-mode/try-runtime", #"pallet-crowdloan-rewards/try-runtime", "pallet-migrations/try-runtime", "pallet-society/try-runtime", "pallet-timestamp/try-runtime", "parachain-staking/try-runtime", - "pallet-maintenance-mode/try-runtime", ] diff --git a/runtime/moonbeam/Cargo.toml b/runtime/moonbeam/Cargo.toml index 2a4a673743..7b5c59a710 100644 --- a/runtime/moonbeam/Cargo.toml +++ b/runtime/moonbeam/Cargo.toml @@ -191,10 +191,10 @@ runtime-benchmarks = [ "pallet-collective/runtime-benchmarks", "pallet-crowdloan-rewards/runtime-benchmarks", "pallet-ethereum/runtime-benchmarks", + "pallet-maintenance-mode/try-runtime", "pallet-migrations/try-runtime", "pallet-society/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "parachain-staking/runtime-benchmarks", "sp-runtime/runtime-benchmarks", - "pallet-maintenance-mode/try-runtime", ] diff --git a/runtime/moonriver/Cargo.toml b/runtime/moonriver/Cargo.toml index 50d4fa1e68..f2bd6e8dd9 100644 --- a/runtime/moonriver/Cargo.toml +++ b/runtime/moonriver/Cargo.toml @@ -247,10 +247,10 @@ try-runtime = [ "pallet-author-mapping/try-runtime", "pallet-balances/try-runtime", "pallet-collective/try-runtime", + "pallet-maintenance-mode/try-runtime", #"pallet-crowdloan-rewards/try-runtime", "pallet-migrations/try-runtime", "pallet-society/try-runtime", "pallet-timestamp/try-runtime", "parachain-staking/try-runtime", - "pallet-maintenance-mode/try-runtime", ] From 26df9e138e09f4a0a83e2801a618c6fc5bc72880 Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 21 Dec 2021 17:25:33 +0100 Subject: [PATCH 14/66] Compile --- pallets/migrations/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pallets/migrations/src/lib.rs b/pallets/migrations/src/lib.rs index 60729783e2..d851763da7 100644 --- a/pallets/migrations/src/lib.rs +++ b/pallets/migrations/src/lib.rs @@ -32,6 +32,8 @@ pub use pallet::*; #[macro_use] extern crate environmental; +use sp_std::prelude::*; + /// A Migration that must happen on-chain upon a runtime-upgrade pub trait Migration { /// A human-readable name for this migration. Also used as storage key. @@ -80,7 +82,6 @@ pub mod pallet { use super::*; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - use sp_std::prelude::*; /// Pallet for migrations #[pallet::pallet] From 9733f065584d6716bed5197f708bdc55bf77a7e0 Mon Sep 17 00:00:00 2001 From: gorka Date: Wed, 22 Dec 2021 09:27:52 +0100 Subject: [PATCH 15/66] Adapt to new transact trait --- precompiles/xcm_transactor/src/mock.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/precompiles/xcm_transactor/src/mock.rs b/precompiles/xcm_transactor/src/mock.rs index 1133c23c9a..be03137944 100644 --- a/precompiles/xcm_transactor/src/mock.rs +++ b/precompiles/xcm_transactor/src/mock.rs @@ -462,12 +462,6 @@ impl xcm_primitives::XcmTransact for MockTransactors { match self { MockTransactors::Relay => MultiLocation::parent(), } - } - fn max_transact_weight(self) -> Weight { - match self { - MockTransactors::Relay => 20000000000, - } - } } impl xcm_primitives::UtilityEncodeCall for MockTransactors { From 6cc33ae33e04758628b2e35ac8544e246e758d9f Mon Sep 17 00:00:00 2001 From: gorka Date: Wed, 22 Dec 2021 09:32:24 +0100 Subject: [PATCH 16/66] Toml sort --- runtime/moonbase/Cargo.toml | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/runtime/moonbase/Cargo.toml b/runtime/moonbase/Cargo.toml index 22aa3d06b4..c41c524735 100644 --- a/runtime/moonbase/Cargo.toml +++ b/runtime/moonbase/Cargo.toml @@ -247,18 +247,4 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", ] -try-runtime = [ - "frame-executive/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime", - "pallet-author-mapping/try-runtime", - "pallet-balances/try-runtime", - "pallet-collective/try-runtime", - "pallet-maintenance-mode/try-runtime", - #"pallet-crowdloan-rewards/try-runtime", - "pallet-migrations/try-runtime", - "pallet-society/try-runtime", - "pallet-timestamp/try-runtime", - "parachain-staking/try-runtime", - "pallet-maintenance-mode/try-runtime" -] +try-runtime = [ "frame-executive/try-runtime", "frame-system/try-runtime", "frame-try-runtime", "pallet-author-mapping/try-runtime", "pallet-balances/try-runtime", "pallet-collective/try-runtime", "pallet-maintenance-mode/try-runtime", "pallet-maintenance-mode/try-runtime", #"pallet-crowdloan-rewards/try-runtime", "pallet-migrations/try-runtime", "pallet-society/try-runtime", "pallet-timestamp/try-runtime", "parachain-staking/try-runtime" ] From 12cb7061a907836dd7fd7ee8a3680accd9d8cbea Mon Sep 17 00:00:00 2001 From: gorka Date: Wed, 22 Dec 2021 11:39:40 +0100 Subject: [PATCH 17/66] Remove other components from transact info, as it seems they are not needed --- pallets/xcm-transactor/src/lib.rs | 36 ++--------------- pallets/xcm-transactor/src/migrations.rs | 13 +----- pallets/xcm-transactor/src/tests.rs | 40 ++----------------- precompiles/xcm_transactor/XcmTransactor.sol | 2 +- precompiles/xcm_transactor/src/lib.rs | 3 -- precompiles/xcm_transactor/src/mock.rs | 1 + precompiles/xcm_transactor/src/tests.rs | 16 +------- runtime/moonbase/Cargo.toml | 15 ++++++- runtime/moonbase/tests/integration_test.rs | 3 -- runtime/moonbase/tests/xcm_tests.rs | 6 --- runtime/moonriver/tests/integration_test.rs | 3 -- runtime/moonriver/tests/xcm_tests.rs | 6 --- .../test-precompile-xcm-transactor.ts | 8 +--- 13 files changed, 29 insertions(+), 123 deletions(-) diff --git a/pallets/xcm-transactor/src/lib.rs b/pallets/xcm-transactor/src/lib.rs index 26699c951b..8b745b8ccf 100644 --- a/pallets/xcm-transactor/src/lib.rs +++ b/pallets/xcm-transactor/src/lib.rs @@ -139,12 +139,6 @@ pub mod pallet { pub struct RemoteTransactInfoWithMaxWeight { /// Extra weight that transacting a call in a destination chain adds pub transact_extra_weight: Weight, - /// Fee per call byte - pub fee_per_byte: u128, - /// Size of the tx metadata of a transaction in the destination chain - pub metadata_size: u64, - /// Minimum weight the destination chain charges for a transaction - pub base_weight: Weight, /// Fee per weight in the destination chain pub fee_per_weight: u128, /// Max destination weight @@ -387,10 +381,7 @@ pub mod pallet { origin: OriginFor, location: VersionedMultiLocation, transact_extra_weight: Weight, - fee_per_byte: u128, - base_weight: Weight, fee_per_weight: u128, - metadata_size: u64, max_weight: u64, ) -> DispatchResult { T::DerivativeAddressRegistrationOrigin::ensure_origin(origin)?; @@ -398,10 +389,7 @@ pub mod pallet { MultiLocation::try_from(location).map_err(|()| Error::::BadVersion)?; let remote_info = RemoteTransactInfoWithMaxWeight { transact_extra_weight, - fee_per_byte, - base_weight, fee_per_weight, - metadata_size, max_weight, }; @@ -437,14 +425,8 @@ pub mod pallet { // Multiply weight*destination_units_per_second to see how much we should charge for // this weight execution - let amount = Self::calculate_fee_per_weight( - call.clone(), - total_weight, - transactor_info.fee_per_byte, - transactor_info.base_weight, - transactor_info.fee_per_weight, - transactor_info.metadata_size, - ); + let amount = + Self::calculate_fee_per_weight(total_weight, transactor_info.fee_per_weight); // Construct MultiAsset let fee = MultiAsset { @@ -652,20 +634,10 @@ pub mod pallet { } /// Returns the fee for a given set of parameters - pub fn calculate_fee_per_weight( - call: Vec, - weight: Weight, - fee_per_byte: u128, - base_weight: Weight, - fee_per_weight: u128, - metadata_size: u64, - ) -> u128 { - let tx_byte_fee = ((call.len() as u128).saturating_add(metadata_size as u128)) - .saturating_mul(fee_per_byte); + pub fn calculate_fee_per_weight(weight: Weight, fee_per_weight: u128) -> u128 { let weight_fee = fee_per_weight.saturating_mul(weight as u128); - let base_fee = fee_per_weight.saturating_mul(base_weight as u128); - return base_fee.saturating_add(weight_fee.saturating_add(tx_byte_fee)); + return weight_fee; } } } diff --git a/pallets/xcm-transactor/src/migrations.rs b/pallets/xcm-transactor/src/migrations.rs index 9ef064002d..33500ea71d 100644 --- a/pallets/xcm-transactor/src/migrations.rs +++ b/pallets/xcm-transactor/src/migrations.rs @@ -86,16 +86,10 @@ impl OnRuntimeUpgrade for MaxTransactWeight { TransactInfoWithWeightLimit::::insert(location, { RemoteTransactInfoWithMaxWeight { transact_extra_weight: info.transact_extra_weight, - /// Fee per call byte - fee_per_byte: info.fee_per_byte, - /// Size of the tx metadata of a transaction in the destination chain - metadata_size: info.metadata_size, - /// Minimum weight the destination chain charges for a transaction - base_weight: info.base_weight, /// Fee per weight in the destination chain fee_per_weight: info.fee_per_weight, /// Max destination weight - max_weight: 12000000000, + max_weight: 20000000000, } }); } @@ -171,11 +165,8 @@ impl OnRuntimeUpgrade for MaxTransactWeight { original_info.transact_extra_weight, migrated_info.transact_extra_weight ); - assert_eq!(original_info.fee_per_byte, migrated_info.fee_per_byte); - assert_eq!(original_info.metadata_size, migrated_info.metadata_size); - assert_eq!(original_info.base_weight, migrated_info.base_weight); assert_eq!(original_info.fee_per_weight, migrated_info.fee_per_weight); - assert_eq!(migrated_info.max_weight, 12000000000) + assert_eq!(migrated_info.max_weight, 20000000000) } Ok(()) diff --git a/pallets/xcm-transactor/src/tests.rs b/pallets/xcm-transactor/src/tests.rs index dfe93f9830..acd67f93bd 100644 --- a/pallets/xcm-transactor/src/tests.rs +++ b/pallets/xcm-transactor/src/tests.rs @@ -74,10 +74,7 @@ fn test_transact_through_derivative_errors() { Junctions::X1(Junction::Parachain(1000)) )), 0, - 0, - 0, 1, - 0, 10000 )); @@ -118,10 +115,7 @@ fn test_transact_through_derivative_errors() { Origin::root(), xcm::VersionedMultiLocation::V1(MultiLocation::parent()), 0, - 0, - 0, 1, - 0, 10000 )); @@ -154,10 +148,7 @@ fn test_transact_through_derivative_multilocation_success() { Origin::root(), xcm::VersionedMultiLocation::V1(MultiLocation::parent()), 0, - 0, - 0, 1, - 0, 10000 )); @@ -176,10 +167,7 @@ fn test_transact_through_derivative_multilocation_success() { MultiLocation::parent(), RemoteTransactInfoWithMaxWeight { transact_extra_weight: 0, - fee_per_byte: 0, - base_weight: 0, fee_per_weight: 1, - metadata_size: 0, max_weight: 10000, }, ), @@ -209,10 +197,7 @@ fn test_transact_through_derivative_success() { Origin::root(), xcm::VersionedMultiLocation::V1(MultiLocation::parent()), 0, - 0, - 0, 1, - 0, 10000 )); @@ -231,10 +216,7 @@ fn test_transact_through_derivative_success() { MultiLocation::parent(), RemoteTransactInfoWithMaxWeight { transact_extra_weight: 0, - fee_per_byte: 0, - base_weight: 0, fee_per_weight: 1, - metadata_size: 0, max_weight: 10000, }, ), @@ -274,10 +256,7 @@ fn test_root_can_transact_through_sovereign() { Origin::root(), xcm::VersionedMultiLocation::V1(MultiLocation::parent()), 0, - 0, - 0, 1, - 0, 10000 )); @@ -296,10 +275,7 @@ fn test_root_can_transact_through_sovereign() { MultiLocation::parent(), RemoteTransactInfoWithMaxWeight { transact_extra_weight: 0, - fee_per_byte: 0, - base_weight: 0, fee_per_weight: 1, - metadata_size: 0, max_weight: 10000, }, ), @@ -316,15 +292,8 @@ fn test_fee_calculation_works() { .build() .execute_with(|| { assert_eq!( - XcmTransactor::calculate_fee_per_weight( - [1u8; 7].to_vec(), - 578000, - 100000000, - 125000000, - 8, - 105 - ), - 12204624000 + XcmTransactor::calculate_fee_per_weight(1000000000, 8), + 8000000000 ); }) } @@ -352,11 +321,8 @@ fn test_max_transact_weight_migration_works() { // This is the new struct let expected_transacted_info = RemoteTransactInfoWithMaxWeight { transact_extra_weight: 0, - fee_per_byte: 0, - base_weight: 0, fee_per_weight: 1, - metadata_size: 0, - max_weight: 12000000000, + max_weight: 20000000000, }; // We populate the previous key with the previous struct diff --git a/precompiles/xcm_transactor/XcmTransactor.sol b/precompiles/xcm_transactor/XcmTransactor.sol index abbda87148..b43ea72ef9 100644 --- a/precompiles/xcm_transactor/XcmTransactor.sol +++ b/precompiles/xcm_transactor/XcmTransactor.sol @@ -25,7 +25,7 @@ pragma solidity >=0.8.0; * @param index The index of which we want to retrieve the account */ function transact_info(Multilocation memory multilocation) external view - returns(uint64, uint256, uint64, uint64, uint256); + returns(uint64, uint256, uint64); /** Transact through XCM using fee based on its multilocation * Selector 9f89f03e diff --git a/precompiles/xcm_transactor/src/lib.rs b/precompiles/xcm_transactor/src/lib.rs index 51e86ad5a8..1940d61840 100644 --- a/precompiles/xcm_transactor/src/lib.rs +++ b/precompiles/xcm_transactor/src/lib.rs @@ -140,9 +140,6 @@ where cost: gasometer.used_gas(), output: EvmDataWriter::new() .write(remote_transact_info.transact_extra_weight) - .write(remote_transact_info.fee_per_byte) - .write(remote_transact_info.metadata_size) - .write(remote_transact_info.base_weight) .write(remote_transact_info.fee_per_weight) .write(remote_transact_info.max_weight) .build(), diff --git a/precompiles/xcm_transactor/src/mock.rs b/precompiles/xcm_transactor/src/mock.rs index be03137944..0e338c174e 100644 --- a/precompiles/xcm_transactor/src/mock.rs +++ b/precompiles/xcm_transactor/src/mock.rs @@ -462,6 +462,7 @@ impl xcm_primitives::XcmTransact for MockTransactors { match self { MockTransactors::Relay => MultiLocation::parent(), } + } } impl xcm_primitives::UtilityEncodeCall for MockTransactors { diff --git a/precompiles/xcm_transactor/src/tests.rs b/precompiles/xcm_transactor/src/tests.rs index 030a2482d9..7b29394ffc 100644 --- a/precompiles/xcm_transactor/src/tests.rs +++ b/precompiles/xcm_transactor/src/tests.rs @@ -158,10 +158,7 @@ fn take_transact_info() { Origin::root(), xcm::VersionedMultiLocation::V1(MultiLocation::parent()), 0, - 0, - 0, 1, - 0, 10000 )); @@ -169,9 +166,6 @@ fn take_transact_info() { let expected_result = Some(Ok(PrecompileOutput { exit_status: ExitSucceed::Returned, output: EvmDataWriter::new() - .write(0u64) - .write(0u128) - .write(0u64) .write(0u64) .write(1u128) .write(10000u64) @@ -201,11 +195,8 @@ fn test_transactor_multilocation() { Origin::root(), xcm::VersionedMultiLocation::V1(MultiLocation::parent()), 0, - 0, - 0, 1, - 0, - 10000 + 10000000 )); // we pay with our current self reserve. @@ -257,11 +248,8 @@ fn test_transactor() { Origin::root(), xcm::VersionedMultiLocation::V1(MultiLocation::parent()), 0, - 0, - 0, 1, - 0, - 10000 + 10000000 )); let bytes: Bytes = vec![1u8, 2u8, 3u8].as_slice().into(); diff --git a/runtime/moonbase/Cargo.toml b/runtime/moonbase/Cargo.toml index c41c524735..27f52dc767 100644 --- a/runtime/moonbase/Cargo.toml +++ b/runtime/moonbase/Cargo.toml @@ -247,4 +247,17 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", ] -try-runtime = [ "frame-executive/try-runtime", "frame-system/try-runtime", "frame-try-runtime", "pallet-author-mapping/try-runtime", "pallet-balances/try-runtime", "pallet-collective/try-runtime", "pallet-maintenance-mode/try-runtime", "pallet-maintenance-mode/try-runtime", #"pallet-crowdloan-rewards/try-runtime", "pallet-migrations/try-runtime", "pallet-society/try-runtime", "pallet-timestamp/try-runtime", "parachain-staking/try-runtime" ] +try-runtime = [ + "frame-executive/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime", + "pallet-author-mapping/try-runtime", + "pallet-balances/try-runtime", + "pallet-collective/try-runtime", + #"pallet-crowdloan-rewards/try-runtime", + "pallet-maintenance-mode/try-runtime", + "pallet-migrations/try-runtime", + "pallet-society/try-runtime", + "pallet-timestamp/try-runtime", + "parachain-staking/try-runtime", +] \ No newline at end of file diff --git a/runtime/moonbase/tests/integration_test.rs b/runtime/moonbase/tests/integration_test.rs index 449c4d5504..b729d5ceba 100644 --- a/runtime/moonbase/tests/integration_test.rs +++ b/runtime/moonbase/tests/integration_test.rs @@ -1686,10 +1686,7 @@ fn transactor_cannot_use_more_than_max_weight() { xcm::VersionedMultiLocation::V1(MultiLocation::parent()), // Relay charges 1000 for every instruction, and we have 3, so 3000 3000, - 0, - 0, 1, - 0, 20000 )); diff --git a/runtime/moonbase/tests/xcm_tests.rs b/runtime/moonbase/tests/xcm_tests.rs index ff31c0875e..1769f3d4dd 100644 --- a/runtime/moonbase/tests/xcm_tests.rs +++ b/runtime/moonbase/tests/xcm_tests.rs @@ -804,10 +804,7 @@ fn transact_through_derivative_multilocation() { xcm::VersionedMultiLocation::V1(MultiLocation::parent()), // Relay charges 1000 for every instruction, and we have 3, so 3000 3000, - 0, - 0, 1, - 0, 20000000000 )); }); @@ -958,10 +955,7 @@ fn transact_through_sovereign() { parachain::Origin::root(), xcm::VersionedMultiLocation::V1(MultiLocation::parent()), 3000, - 0, - 0, 1, - 0, 20000000000 )); }); diff --git a/runtime/moonriver/tests/integration_test.rs b/runtime/moonriver/tests/integration_test.rs index 6eff15f604..0be3b9178b 100644 --- a/runtime/moonriver/tests/integration_test.rs +++ b/runtime/moonriver/tests/integration_test.rs @@ -1815,10 +1815,7 @@ fn transactor_cannot_use_more_than_max_weight() { xcm::VersionedMultiLocation::V1(MultiLocation::parent()), // Relay charges 1000 for every instruction, and we have 3, so 3000 3000, - 0, - 0, 1, - 0, 20000 )); diff --git a/runtime/moonriver/tests/xcm_tests.rs b/runtime/moonriver/tests/xcm_tests.rs index 9299ea7acd..c91abfa0f1 100644 --- a/runtime/moonriver/tests/xcm_tests.rs +++ b/runtime/moonriver/tests/xcm_tests.rs @@ -679,10 +679,7 @@ fn transact_through_derivative_multilocation() { xcm::VersionedMultiLocation::V1(MultiLocation::parent()), // Relay charges 1000 for every instruction, and we have 3, so 3000 3000, - 0, - 0, 1, - 0, 20000000000 )); }); @@ -822,10 +819,7 @@ fn transact_through_sovereign() { parachain::Origin::root(), xcm::VersionedMultiLocation::V1(MultiLocation::parent()), 3000, - 0, - 0, 1, - 0, 20000000000 )); }); diff --git a/tests/tests/test-precompile/test-precompile-xcm-transactor.ts b/tests/tests/test-precompile/test-precompile-xcm-transactor.ts index 03fce86cd8..fb496a3a3c 100644 --- a/tests/tests/test-precompile/test-precompile-xcm-transactor.ts +++ b/tests/tests/test-precompile/test-precompile-xcm-transactor.ts @@ -101,10 +101,8 @@ describeDevMoonbeam("Precompiles - xcm transactor", (context) => { context.polkadotApi.tx.xcmTransactor.setTransactInfo( sourceLocationRelayVersioned, new BN(0), - new BN(0), - new BN(0), new BN(1), - new BN(0) + new BN(20000000000) ) ) .signAndSend(sudoAccount); @@ -267,10 +265,8 @@ describeDevMoonbeam("Precompiles - xcm transactor", (context) => { context.polkadotApi.tx.xcmTransactor.setTransactInfo( sourceLocationRelayVersioned, new BN(0), - new BN(0), - new BN(0), new BN(1), - new BN(0) + new BN(20000000000) ) ) .signAndSend(sudoAccount); From 8754001681f80c1055c36375c9015dd898152415 Mon Sep 17 00:00:00 2001 From: gorka Date: Wed, 22 Dec 2021 12:13:11 +0100 Subject: [PATCH 18/66] Rework typescript test to match new transactor --- .../compiled/XcmTransactorInstance.json | 7442 +++++++++-------- tests/contracts/sources.ts | 4 +- .../test-precompile-xcm-transactor.ts | 6 +- 3 files changed, 3808 insertions(+), 3644 deletions(-) diff --git a/tests/contracts/compiled/XcmTransactorInstance.json b/tests/contracts/compiled/XcmTransactorInstance.json index 492f659898..c0557a717e 100644 --- a/tests/contracts/compiled/XcmTransactorInstance.json +++ b/tests/contracts/compiled/XcmTransactorInstance.json @@ -1,5 +1,5 @@ { - "byteCode": "0x60806040526108066000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005257600080fd5b50610e3d806100626000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063267d40621461005c57806361fc548f1461007857806371b0edfa146100965780639f89f03e146100c6578063f87f493f146100e2575b600080fd5b6100766004803603810190610071919061063d565b610113565b005b6100806101ad565b60405161008d9190610733565b60405180910390f35b6100b060048036038101906100ab919061074e565b6101d1565b6040516100bd919061078a565b60405180910390f35b6100e060048036038101906100db9190610901565b610284565b005b6100fc60048036038101906100f791906109b4565b61031e565b60405161010a929190610a25565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663267d406286868686866040518663ffffffff1660e01b8152600401610174959493929190610af4565b600060405180830381600087803b15801561018e57600080fd5b505af11580156101a2573d6000803e3d6000fd5b505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166371b0edfa836040518263ffffffff1660e01b815260040161022d9190610b4e565b60206040518083038186803b15801561024557600080fd5b505afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610b7e565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639f89f03e86868686866040518663ffffffff1660e01b81526004016102e5959493929190610d03565b600060405180830381600087803b1580156102ff57600080fd5b505af1158015610313573d6000803e3d6000fd5b505050505050505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f87f493f846040518263ffffffff1660e01b815260040161037a9190610d64565b604080518083038186803b15801561039157600080fd5b505afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610dc7565b91509150915091565b6000604051905090565b600080fd5b600080fd5b600060ff82169050919050565b6103fc816103e6565b811461040757600080fd5b50565b600081359050610419816103f3565b92915050565b600061ffff82169050919050565b6104368161041f565b811461044157600080fd5b50565b6000813590506104538161042d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061048482610459565b9050919050565b61049481610479565b811461049f57600080fd5b50565b6000813590506104b18161048b565b92915050565b600067ffffffffffffffff82169050919050565b6104d4816104b7565b81146104df57600080fd5b50565b6000813590506104f1816104cb565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61054a82610501565b810181811067ffffffffffffffff8211171561056957610568610512565b5b80604052505050565b600061057c6103d2565b90506105888282610541565b919050565b600067ffffffffffffffff8211156105a8576105a7610512565b5b6105b182610501565b9050602081019050919050565b82818337600083830152505050565b60006105e06105db8461058d565b610572565b9050828152602081018484840111156105fc576105fb6104fc565b5b6106078482856105be565b509392505050565b600082601f830112610624576106236104f7565b5b81356106348482602086016105cd565b91505092915050565b600080600080600060a08688031215610659576106586103dc565b5b60006106678882890161040a565b955050602061067888828901610444565b9450506040610689888289016104a2565b935050606061069a888289016104e2565b925050608086013567ffffffffffffffff8111156106bb576106ba6103e1565b5b6106c78882890161060f565b9150509295509295909350565b6000819050919050565b60006106f96106f46106ef84610459565b6106d4565b610459565b9050919050565b600061070b826106de565b9050919050565b600061071d82610700565b9050919050565b61072d81610712565b82525050565b60006020820190506107486000830184610724565b92915050565b600060208284031215610764576107636103dc565b5b600061077284828501610444565b91505092915050565b61078481610479565b82525050565b600060208201905061079f600083018461077b565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff8211156107ca576107c9610512565b5b602082029050602081019050919050565b600080fd5b60006107f36107ee846107af565b610572565b90508083825260208201905060208402830185811115610816576108156107db565b5b835b8181101561085d57803567ffffffffffffffff81111561083b5761083a6104f7565b5b808601610848898261060f565b85526020850194505050602081019050610818565b5050509392505050565b600082601f83011261087c5761087b6104f7565b5b813561088c8482602086016107e0565b91505092915050565b6000604082840312156108ab576108aa6107a5565b5b6108b56040610572565b905060006108c58482850161040a565b600083015250602082013567ffffffffffffffff8111156108e9576108e86107aa565b5b6108f584828501610867565b60208301525092915050565b600080600080600060a0868803121561091d5761091c6103dc565b5b600061092b8882890161040a565b955050602061093c88828901610444565b945050604086013567ffffffffffffffff81111561095d5761095c6103e1565b5b61096988828901610895565b935050606061097a888289016104e2565b925050608086013567ffffffffffffffff81111561099b5761099a6103e1565b5b6109a78882890161060f565b9150509295509295909350565b6000602082840312156109ca576109c96103dc565b5b600082013567ffffffffffffffff8111156109e8576109e76103e1565b5b6109f484828501610895565b91505092915050565b6000819050919050565b610a10816109fd565b82525050565b610a1f816104b7565b82525050565b6000604082019050610a3a6000830185610a07565b610a476020830184610a16565b9392505050565b610a57816103e6565b82525050565b610a668161041f565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610aa6578082015181840152602081019050610a8b565b83811115610ab5576000848401525b50505050565b6000610ac682610a6c565b610ad08185610a77565b9350610ae0818560208601610a88565b610ae981610501565b840191505092915050565b600060a082019050610b096000830188610a4e565b610b166020830187610a5d565b610b23604083018661077b565b610b306060830185610a16565b8181036080830152610b428184610abb565b90509695505050505050565b6000602082019050610b636000830184610a5d565b92915050565b600081519050610b788161048b565b92915050565b600060208284031215610b9457610b936103dc565b5b6000610ba284828501610b69565b91505092915050565b610bb4816103e6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000610c0282610a6c565b610c0c8185610be6565b9350610c1c818560208601610a88565b610c2581610501565b840191505092915050565b6000610c3c8383610bf7565b905092915050565b6000602082019050919050565b6000610c5c82610bba565b610c668185610bc5565b935083602082028501610c7885610bd6565b8060005b85811015610cb45784840389528151610c958582610c30565b9450610ca083610c44565b925060208a01995050600181019050610c7c565b50829750879550505050505092915050565b6000604083016000830151610cde6000860182610bab565b5060208301518482036020860152610cf68282610c51565b9150508091505092915050565b600060a082019050610d186000830188610a4e565b610d256020830187610a5d565b8181036040830152610d378186610cc6565b9050610d466060830185610a16565b8181036080830152610d588184610abb565b90509695505050505050565b60006020820190508181036000830152610d7e8184610cc6565b905092915050565b610d8f816109fd565b8114610d9a57600080fd5b50565b600081519050610dac81610d86565b92915050565b600081519050610dc1816104cb565b92915050565b60008060408385031215610dde57610ddd6103dc565b5b6000610dec85828601610d9d565b9250506020610dfd85828601610db2565b915050925092905056fea2646970667358221220f4c38984c6cc29dbcc2eaba10fd373f554e43032ce961ef414eb2edc3748591664736f6c63430008090033", + "byteCode": "0x60806040526108066000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005257600080fd5b50610e49806100626000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063267d40621461005c57806361fc548f1461007857806371b0edfa146100965780639f89f03e146100c6578063f87f493f146100e2575b600080fd5b61007660048036038101906100719190610628565b610114565b005b6100806101ae565b60405161008d919061071e565b60405180910390f35b6100b060048036038101906100ab9190610739565b6101d2565b6040516100bd9190610775565b60405180910390f35b6100e060048036038101906100db91906108ec565b610276565b005b6100fc60048036038101906100f7919061099f565b610310565b60405161010b93929190610a10565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663267d406286868686866040518663ffffffff1660e01b8152600401610175959493929190610aed565b600060405180830381600087803b15801561018f57600080fd5b505af11580156101a3573d6000803e3d6000fd5b505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166371b0edfa836040518263ffffffff1660e01b815260040161022e9190610b47565b602060405180830381865afa15801561024b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026f9190610b77565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639f89f03e86868686866040518663ffffffff1660e01b81526004016102d7959493929190610cfc565b600060405180830381600087803b1580156102f157600080fd5b505af1158015610305573d6000803e3d6000fd5b505050505050505050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f87f493f856040518263ffffffff1660e01b815260040161036f9190610d5d565b606060405180830381865afa15801561038c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b09190610dc0565b9250925092509193909250565b6000604051905090565b600080fd5b600080fd5b600060ff82169050919050565b6103e7816103d1565b81146103f257600080fd5b50565b600081359050610404816103de565b92915050565b600061ffff82169050919050565b6104218161040a565b811461042c57600080fd5b50565b60008135905061043e81610418565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061046f82610444565b9050919050565b61047f81610464565b811461048a57600080fd5b50565b60008135905061049c81610476565b92915050565b600067ffffffffffffffff82169050919050565b6104bf816104a2565b81146104ca57600080fd5b50565b6000813590506104dc816104b6565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610535826104ec565b810181811067ffffffffffffffff82111715610554576105536104fd565b5b80604052505050565b60006105676103bd565b9050610573828261052c565b919050565b600067ffffffffffffffff821115610593576105926104fd565b5b61059c826104ec565b9050602081019050919050565b82818337600083830152505050565b60006105cb6105c684610578565b61055d565b9050828152602081018484840111156105e7576105e66104e7565b5b6105f28482856105a9565b509392505050565b600082601f83011261060f5761060e6104e2565b5b813561061f8482602086016105b8565b91505092915050565b600080600080600060a08688031215610644576106436103c7565b5b6000610652888289016103f5565b95505060206106638882890161042f565b94505060406106748882890161048d565b9350506060610685888289016104cd565b925050608086013567ffffffffffffffff8111156106a6576106a56103cc565b5b6106b2888289016105fa565b9150509295509295909350565b6000819050919050565b60006106e46106df6106da84610444565b6106bf565b610444565b9050919050565b60006106f6826106c9565b9050919050565b6000610708826106eb565b9050919050565b610718816106fd565b82525050565b6000602082019050610733600083018461070f565b92915050565b60006020828403121561074f5761074e6103c7565b5b600061075d8482850161042f565b91505092915050565b61076f81610464565b82525050565b600060208201905061078a6000830184610766565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff8211156107b5576107b46104fd565b5b602082029050602081019050919050565b600080fd5b60006107de6107d98461079a565b61055d565b90508083825260208201905060208402830185811115610801576108006107c6565b5b835b8181101561084857803567ffffffffffffffff811115610826576108256104e2565b5b80860161083389826105fa565b85526020850194505050602081019050610803565b5050509392505050565b600082601f830112610867576108666104e2565b5b81356108778482602086016107cb565b91505092915050565b60006040828403121561089657610895610790565b5b6108a0604061055d565b905060006108b0848285016103f5565b600083015250602082013567ffffffffffffffff8111156108d4576108d3610795565b5b6108e084828501610852565b60208301525092915050565b600080600080600060a08688031215610908576109076103c7565b5b6000610916888289016103f5565b95505060206109278882890161042f565b945050604086013567ffffffffffffffff811115610948576109476103cc565b5b61095488828901610880565b9350506060610965888289016104cd565b925050608086013567ffffffffffffffff811115610986576109856103cc565b5b610992888289016105fa565b9150509295509295909350565b6000602082840312156109b5576109b46103c7565b5b600082013567ffffffffffffffff8111156109d3576109d26103cc565b5b6109df84828501610880565b91505092915050565b6109f1816104a2565b82525050565b6000819050919050565b610a0a816109f7565b82525050565b6000606082019050610a2560008301866109e8565b610a326020830185610a01565b610a3f60408301846109e8565b949350505050565b610a50816103d1565b82525050565b610a5f8161040a565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610a9f578082015181840152602081019050610a84565b83811115610aae576000848401525b50505050565b6000610abf82610a65565b610ac98185610a70565b9350610ad9818560208601610a81565b610ae2816104ec565b840191505092915050565b600060a082019050610b026000830188610a47565b610b0f6020830187610a56565b610b1c6040830186610766565b610b2960608301856109e8565b8181036080830152610b3b8184610ab4565b90509695505050505050565b6000602082019050610b5c6000830184610a56565b92915050565b600081519050610b7181610476565b92915050565b600060208284031215610b8d57610b8c6103c7565b5b6000610b9b84828501610b62565b91505092915050565b610bad816103d1565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000610bfb82610a65565b610c058185610bdf565b9350610c15818560208601610a81565b610c1e816104ec565b840191505092915050565b6000610c358383610bf0565b905092915050565b6000602082019050919050565b6000610c5582610bb3565b610c5f8185610bbe565b935083602082028501610c7185610bcf565b8060005b85811015610cad5784840389528151610c8e8582610c29565b9450610c9983610c3d565b925060208a01995050600181019050610c75565b50829750879550505050505092915050565b6000604083016000830151610cd76000860182610ba4565b5060208301518482036020860152610cef8282610c4a565b9150508091505092915050565b600060a082019050610d116000830188610a47565b610d1e6020830187610a56565b8181036040830152610d308186610cbf565b9050610d3f60608301856109e8565b8181036080830152610d518184610ab4565b90509695505050505050565b60006020820190508181036000830152610d778184610cbf565b905092915050565b600081519050610d8e816104b6565b92915050565b610d9d816109f7565b8114610da857600080fd5b50565b600081519050610dba81610d94565b92915050565b600080600060608486031215610dd957610dd86103c7565b5b6000610de786828701610d7f565b9350506020610df886828701610dab565b9250506040610e0986828701610d7f565b915050925092509256fea26469706673582212200c97281bd15caba3cc6efa4a076e6f49a63c3b3c013798a44e77679bfec3fec964736f6c634300080a0033", "contract": { "abi": [ { @@ -31,6 +31,7 @@ ], "name": "transact_info", "outputs": [ + { "internalType": "uint64", "name": "", "type": "uint64" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint64", "name": "", "type": "uint64" } ], @@ -130,493 +131,493 @@ "version": 1 }, "evm": { - "assembly": " /* \"main.sol\":2633:4285 contract XcmTransactorInstance is XcmTransactor {... */\n mstore(0x40, 0x80)\n /* \"main.sol\":2808:2850 0x0000000000000000000000000000000000000806 */\n 0x0806\n /* \"main.sol\":2757:2851 XcmTransactor public xcmtransactor = XcmTransactor(0x0000000000000000000000000000000000000806) */\n 0x00\n dup1\n 0x0100\n exp\n dup2\n sload\n dup2\n 0xffffffffffffffffffffffffffffffffffffffff\n mul\n not\n and\n swap1\n dup4\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n mul\n or\n swap1\n sstore\n pop\n /* \"main.sol\":2633:4285 contract XcmTransactorInstance is XcmTransactor {... */\n callvalue\n dup1\n iszero\n tag_1\n jumpi\n 0x00\n dup1\n revert\ntag_1:\n pop\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x00\n codecopy\n 0x00\n return\nstop\n\nsub_0: assembly {\n /* \"main.sol\":2633:4285 contract XcmTransactorInstance is XcmTransactor {... */\n mstore(0x40, 0x80)\n callvalue\n dup1\n iszero\n tag_1\n jumpi\n 0x00\n dup1\n revert\n tag_1:\n pop\n jumpi(tag_2, lt(calldatasize, 0x04))\n shr(0xe0, calldataload(0x00))\n dup1\n 0x267d4062\n eq\n tag_3\n jumpi\n dup1\n 0x61fc548f\n eq\n tag_4\n jumpi\n dup1\n 0x71b0edfa\n eq\n tag_5\n jumpi\n dup1\n 0x9f89f03e\n eq\n tag_6\n jumpi\n dup1\n 0xf87f493f\n eq\n tag_7\n jumpi\n tag_2:\n 0x00\n dup1\n revert\n /* \"main.sol\":3849:4279 function transact_through_derivative(... */\n tag_3:\n tag_8\n 0x04\n dup1\n calldatasize\n sub\n dup2\n add\n swap1\n tag_9\n swap2\n swap1\n tag_10\n jump\t// in\n tag_9:\n tag_11\n jump\t// in\n tag_8:\n stop\n /* \"main.sol\":2757:2851 XcmTransactor public xcmtransactor = XcmTransactor(0x0000000000000000000000000000000000000806) */\n tag_4:\n tag_12\n tag_13\n jump\t// in\n tag_12:\n mload(0x40)\n tag_14\n swap2\n swap1\n tag_15\n jump\t// in\n tag_14:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"main.sol\":2862:3087 function index_to_account(uint16 index) external view override returns(address) {... */\n tag_5:\n tag_16\n 0x04\n dup1\n calldatasize\n sub\n dup2\n add\n swap1\n tag_17\n swap2\n swap1\n tag_18\n jump\t// in\n tag_17:\n tag_19\n jump\t// in\n tag_16:\n mload(0x40)\n tag_20\n swap2\n swap1\n tag_21\n jump\t// in\n tag_20:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"main.sol\":3364:3831 function transact_through_derivative_multilocation(... */\n tag_6:\n tag_22\n 0x04\n dup1\n calldatasize\n sub\n dup2\n add\n swap1\n tag_23\n swap2\n swap1\n tag_24\n jump\t// in\n tag_23:\n tag_25\n jump\t// in\n tag_22:\n stop\n /* \"main.sol\":3097:3354 function transact_info(Multilocation memory multilocation) external view override returns(uint256, uint64) {... */\n tag_7:\n tag_26\n 0x04\n dup1\n calldatasize\n sub\n dup2\n add\n swap1\n tag_27\n swap2\n swap1\n tag_28\n jump\t// in\n tag_27:\n tag_29\n jump\t// in\n tag_26:\n mload(0x40)\n tag_30\n swap3\n swap2\n swap1\n tag_31\n jump\t// in\n tag_30:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"main.sol\":3849:4279 function transact_through_derivative(... */\n tag_11:\n /* \"main.sol\":4081:4094 xcmtransactor */\n 0x00\n dup1\n sload\n swap1\n 0x0100\n exp\n swap1\n div\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"main.sol\":4081:4122 xcmtransactor.transact_through_derivative */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0x267d4062\n /* \"main.sol\":4140:4150 transactor */\n dup7\n /* \"main.sol\":4168:4173 index */\n dup7\n /* \"main.sol\":4191:4202 currency_id */\n dup7\n /* \"main.sol\":4220:4226 weight */\n dup7\n /* \"main.sol\":4244:4254 inner_call */\n dup7\n /* \"main.sol\":4081:4268 xcmtransactor.transact_through_derivative(... */\n mload(0x40)\n dup7\n 0xffffffff\n and\n 0xe0\n shl\n dup2\n mstore\n 0x04\n add\n tag_33\n swap6\n swap5\n swap4\n swap3\n swap2\n swap1\n tag_34\n jump\t// in\n tag_33:\n 0x00\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n 0x00\n dup8\n dup1\n extcodesize\n iszero\n dup1\n iszero\n tag_35\n jumpi\n 0x00\n dup1\n revert\n tag_35:\n pop\n gas\n call\n iszero\n dup1\n iszero\n tag_37\n jumpi\n returndatasize\n 0x00\n dup1\n returndatacopy\n revert(0x00, returndatasize)\n tag_37:\n pop\n pop\n pop\n pop\n /* \"main.sol\":3849:4279 function transact_through_derivative(... */\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"main.sol\":2757:2851 XcmTransactor public xcmtransactor = XcmTransactor(0x0000000000000000000000000000000000000806) */\n tag_13:\n 0x00\n dup1\n sload\n swap1\n 0x0100\n exp\n swap1\n div\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n dup2\n jump\t// out\n /* \"main.sol\":2862:3087 function index_to_account(uint16 index) external view override returns(address) {... */\n tag_19:\n /* \"main.sol\":2933:2940 address */\n 0x00\n /* \"main.sol\":3039:3052 xcmtransactor */\n dup1\n 0x00\n swap1\n sload\n swap1\n 0x0100\n exp\n swap1\n div\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"main.sol\":3039:3069 xcmtransactor.index_to_account */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0x71b0edfa\n /* \"main.sol\":3070:3075 index */\n dup4\n /* \"main.sol\":3039:3076 xcmtransactor.index_to_account(index) */\n mload(0x40)\n dup3\n 0xffffffff\n and\n 0xe0\n shl\n dup2\n mstore\n 0x04\n add\n tag_39\n swap2\n swap1\n tag_40\n jump\t// in\n tag_39:\n 0x20\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n dup7\n dup1\n extcodesize\n iszero\n dup1\n iszero\n tag_41\n jumpi\n 0x00\n dup1\n revert\n tag_41:\n pop\n gas\n staticcall\n iszero\n dup1\n iszero\n tag_43\n jumpi\n returndatasize\n 0x00\n dup1\n returndatacopy\n revert(0x00, returndatasize)\n tag_43:\n pop\n pop\n pop\n pop\n mload(0x40)\n returndatasize\n not(0x1f)\n 0x1f\n dup3\n add\n and\n dup3\n add\n dup1\n 0x40\n mstore\n pop\n dup2\n add\n swap1\n tag_44\n swap2\n swap1\n tag_45\n jump\t// in\n tag_44:\n /* \"main.sol\":3032:3076 return xcmtransactor.index_to_account(index) */\n swap1\n pop\n /* \"main.sol\":2862:3087 function index_to_account(uint16 index) external view override returns(address) {... */\n swap2\n swap1\n pop\n jump\t// out\n /* \"main.sol\":3364:3831 function transact_through_derivative_multilocation(... */\n tag_25:\n /* \"main.sol\":3621:3634 xcmtransactor */\n 0x00\n dup1\n sload\n swap1\n 0x0100\n exp\n swap1\n div\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"main.sol\":3621:3676 xcmtransactor.transact_through_derivative_multilocation */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0x9f89f03e\n /* \"main.sol\":3694:3704 transactor */\n dup7\n /* \"main.sol\":3722:3727 index */\n dup7\n /* \"main.sol\":3745:3754 fee_asset */\n dup7\n /* \"main.sol\":3772:3778 weight */\n dup7\n /* \"main.sol\":3796:3806 inner_call */\n dup7\n /* \"main.sol\":3621:3820 xcmtransactor.transact_through_derivative_multilocation(... */\n mload(0x40)\n dup7\n 0xffffffff\n and\n 0xe0\n shl\n dup2\n mstore\n 0x04\n add\n tag_47\n swap6\n swap5\n swap4\n swap3\n swap2\n swap1\n tag_48\n jump\t// in\n tag_47:\n 0x00\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n 0x00\n dup8\n dup1\n extcodesize\n iszero\n dup1\n iszero\n tag_49\n jumpi\n 0x00\n dup1\n revert\n tag_49:\n pop\n gas\n call\n iszero\n dup1\n iszero\n tag_51\n jumpi\n returndatasize\n 0x00\n dup1\n returndatacopy\n revert(0x00, returndatasize)\n tag_51:\n pop\n pop\n pop\n pop\n /* \"main.sol\":3364:3831 function transact_through_derivative_multilocation(... */\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"main.sol\":3097:3354 function transact_info(Multilocation memory multilocation) external view override returns(uint256, uint64) {... */\n tag_29:\n /* \"main.sol\":3187:3194 uint256 */\n 0x00\n /* \"main.sol\":3196:3202 uint64 */\n dup1\n /* \"main.sol\":3301:3314 xcmtransactor */\n 0x00\n dup1\n sload\n swap1\n 0x0100\n exp\n swap1\n div\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"main.sol\":3301:3328 xcmtransactor.transact_info */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0xf87f493f\n /* \"main.sol\":3329:3342 multilocation */\n dup5\n /* \"main.sol\":3301:3343 xcmtransactor.transact_info(multilocation) */\n mload(0x40)\n dup3\n 0xffffffff\n and\n 0xe0\n shl\n dup2\n mstore\n 0x04\n add\n tag_53\n swap2\n swap1\n tag_54\n jump\t// in\n tag_53:\n 0x40\n dup1\n mload\n dup1\n dup4\n sub\n dup2\n dup7\n dup1\n extcodesize\n iszero\n dup1\n iszero\n tag_55\n jumpi\n 0x00\n dup1\n revert\n tag_55:\n pop\n gas\n staticcall\n iszero\n dup1\n iszero\n tag_57\n jumpi\n returndatasize\n 0x00\n dup1\n returndatacopy\n revert(0x00, returndatasize)\n tag_57:\n pop\n pop\n pop\n pop\n mload(0x40)\n returndatasize\n not(0x1f)\n 0x1f\n dup3\n add\n and\n dup3\n add\n dup1\n 0x40\n mstore\n pop\n dup2\n add\n swap1\n tag_58\n swap2\n swap1\n tag_59\n jump\t// in\n tag_58:\n /* \"main.sol\":3294:3343 return xcmtransactor.transact_info(multilocation) */\n swap2\n pop\n swap2\n pop\n /* \"main.sol\":3097:3354 function transact_info(Multilocation memory multilocation) external view override returns(uint256, uint64) {... */\n swap2\n pop\n swap2\n jump\t// out\n /* \"#utility.yul\":7:82 */\n tag_60:\n /* \"#utility.yul\":40:46 */\n 0x00\n /* \"#utility.yul\":73:75 */\n 0x40\n /* \"#utility.yul\":67:76 */\n mload\n /* \"#utility.yul\":57:76 */\n swap1\n pop\n /* \"#utility.yul\":7:82 */\n swap1\n jump\t// out\n /* \"#utility.yul\":88:205 */\n tag_61:\n /* \"#utility.yul\":197:198 */\n 0x00\n /* \"#utility.yul\":194:195 */\n dup1\n /* \"#utility.yul\":187:199 */\n revert\n /* \"#utility.yul\":211:328 */\n tag_62:\n /* \"#utility.yul\":320:321 */\n 0x00\n /* \"#utility.yul\":317:318 */\n dup1\n /* \"#utility.yul\":310:322 */\n revert\n /* \"#utility.yul\":334:420 */\n tag_63:\n /* \"#utility.yul\":369:376 */\n 0x00\n /* \"#utility.yul\":409:413 */\n 0xff\n /* \"#utility.yul\":402:407 */\n dup3\n /* \"#utility.yul\":398:414 */\n and\n /* \"#utility.yul\":387:414 */\n swap1\n pop\n /* \"#utility.yul\":334:420 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":426:544 */\n tag_64:\n /* \"#utility.yul\":497:519 */\n tag_128\n /* \"#utility.yul\":513:518 */\n dup2\n /* \"#utility.yul\":497:519 */\n tag_63\n jump\t// in\n tag_128:\n /* \"#utility.yul\":490:495 */\n dup2\n /* \"#utility.yul\":487:520 */\n eq\n /* \"#utility.yul\":477:538 */\n tag_129\n jumpi\n /* \"#utility.yul\":534:535 */\n 0x00\n /* \"#utility.yul\":531:532 */\n dup1\n /* \"#utility.yul\":524:536 */\n revert\n /* \"#utility.yul\":477:538 */\n tag_129:\n /* \"#utility.yul\":426:544 */\n pop\n jump\t// out\n /* \"#utility.yul\":550:685 */\n tag_65:\n /* \"#utility.yul\":594:599 */\n 0x00\n /* \"#utility.yul\":632:638 */\n dup2\n /* \"#utility.yul\":619:639 */\n calldataload\n /* \"#utility.yul\":610:639 */\n swap1\n pop\n /* \"#utility.yul\":648:679 */\n tag_131\n /* \"#utility.yul\":673:678 */\n dup2\n /* \"#utility.yul\":648:679 */\n tag_64\n jump\t// in\n tag_131:\n /* \"#utility.yul\":550:685 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":691:780 */\n tag_66:\n /* \"#utility.yul\":727:734 */\n 0x00\n /* \"#utility.yul\":767:773 */\n 0xffff\n /* \"#utility.yul\":760:765 */\n dup3\n /* \"#utility.yul\":756:774 */\n and\n /* \"#utility.yul\":745:774 */\n swap1\n pop\n /* \"#utility.yul\":691:780 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":786:906 */\n tag_67:\n /* \"#utility.yul\":858:881 */\n tag_134\n /* \"#utility.yul\":875:880 */\n dup2\n /* \"#utility.yul\":858:881 */\n tag_66\n jump\t// in\n tag_134:\n /* \"#utility.yul\":851:856 */\n dup2\n /* \"#utility.yul\":848:882 */\n eq\n /* \"#utility.yul\":838:900 */\n tag_135\n jumpi\n /* \"#utility.yul\":896:897 */\n 0x00\n /* \"#utility.yul\":893:894 */\n dup1\n /* \"#utility.yul\":886:898 */\n revert\n /* \"#utility.yul\":838:900 */\n tag_135:\n /* \"#utility.yul\":786:906 */\n pop\n jump\t// out\n /* \"#utility.yul\":912:1049 */\n tag_68:\n /* \"#utility.yul\":957:962 */\n 0x00\n /* \"#utility.yul\":995:1001 */\n dup2\n /* \"#utility.yul\":982:1002 */\n calldataload\n /* \"#utility.yul\":973:1002 */\n swap1\n pop\n /* \"#utility.yul\":1011:1043 */\n tag_137\n /* \"#utility.yul\":1037:1042 */\n dup2\n /* \"#utility.yul\":1011:1043 */\n tag_67\n jump\t// in\n tag_137:\n /* \"#utility.yul\":912:1049 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":1055:1181 */\n tag_69:\n /* \"#utility.yul\":1092:1099 */\n 0x00\n /* \"#utility.yul\":1132:1174 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"#utility.yul\":1125:1130 */\n dup3\n /* \"#utility.yul\":1121:1175 */\n and\n /* \"#utility.yul\":1110:1175 */\n swap1\n pop\n /* \"#utility.yul\":1055:1181 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":1187:1283 */\n tag_70:\n /* \"#utility.yul\":1224:1231 */\n 0x00\n /* \"#utility.yul\":1253:1277 */\n tag_140\n /* \"#utility.yul\":1271:1276 */\n dup3\n /* \"#utility.yul\":1253:1277 */\n tag_69\n jump\t// in\n tag_140:\n /* \"#utility.yul\":1242:1277 */\n swap1\n pop\n /* \"#utility.yul\":1187:1283 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":1289:1411 */\n tag_71:\n /* \"#utility.yul\":1362:1386 */\n tag_142\n /* \"#utility.yul\":1380:1385 */\n dup2\n /* \"#utility.yul\":1362:1386 */\n tag_70\n jump\t// in\n tag_142:\n /* \"#utility.yul\":1355:1360 */\n dup2\n /* \"#utility.yul\":1352:1387 */\n eq\n /* \"#utility.yul\":1342:1405 */\n tag_143\n jumpi\n /* \"#utility.yul\":1401:1402 */\n 0x00\n /* \"#utility.yul\":1398:1399 */\n dup1\n /* \"#utility.yul\":1391:1403 */\n revert\n /* \"#utility.yul\":1342:1405 */\n tag_143:\n /* \"#utility.yul\":1289:1411 */\n pop\n jump\t// out\n /* \"#utility.yul\":1417:1556 */\n tag_72:\n /* \"#utility.yul\":1463:1468 */\n 0x00\n /* \"#utility.yul\":1501:1507 */\n dup2\n /* \"#utility.yul\":1488:1508 */\n calldataload\n /* \"#utility.yul\":1479:1508 */\n swap1\n pop\n /* \"#utility.yul\":1517:1550 */\n tag_145\n /* \"#utility.yul\":1544:1549 */\n dup2\n /* \"#utility.yul\":1517:1550 */\n tag_71\n jump\t// in\n tag_145:\n /* \"#utility.yul\":1417:1556 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":1562:1663 */\n tag_73:\n /* \"#utility.yul\":1598:1605 */\n 0x00\n /* \"#utility.yul\":1638:1656 */\n 0xffffffffffffffff\n /* \"#utility.yul\":1631:1636 */\n dup3\n /* \"#utility.yul\":1627:1657 */\n and\n /* \"#utility.yul\":1616:1657 */\n swap1\n pop\n /* \"#utility.yul\":1562:1663 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":1669:1789 */\n tag_74:\n /* \"#utility.yul\":1741:1764 */\n tag_148\n /* \"#utility.yul\":1758:1763 */\n dup2\n /* \"#utility.yul\":1741:1764 */\n tag_73\n jump\t// in\n tag_148:\n /* \"#utility.yul\":1734:1739 */\n dup2\n /* \"#utility.yul\":1731:1765 */\n eq\n /* \"#utility.yul\":1721:1783 */\n tag_149\n jumpi\n /* \"#utility.yul\":1779:1780 */\n 0x00\n /* \"#utility.yul\":1776:1777 */\n dup1\n /* \"#utility.yul\":1769:1781 */\n revert\n /* \"#utility.yul\":1721:1783 */\n tag_149:\n /* \"#utility.yul\":1669:1789 */\n pop\n jump\t// out\n /* \"#utility.yul\":1795:1932 */\n tag_75:\n /* \"#utility.yul\":1840:1845 */\n 0x00\n /* \"#utility.yul\":1878:1884 */\n dup2\n /* \"#utility.yul\":1865:1885 */\n calldataload\n /* \"#utility.yul\":1856:1885 */\n swap1\n pop\n /* \"#utility.yul\":1894:1926 */\n tag_151\n /* \"#utility.yul\":1920:1925 */\n dup2\n /* \"#utility.yul\":1894:1926 */\n tag_74\n jump\t// in\n tag_151:\n /* \"#utility.yul\":1795:1932 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":1938:2055 */\n tag_76:\n /* \"#utility.yul\":2047:2048 */\n 0x00\n /* \"#utility.yul\":2044:2045 */\n dup1\n /* \"#utility.yul\":2037:2049 */\n revert\n /* \"#utility.yul\":2061:2178 */\n tag_77:\n /* \"#utility.yul\":2170:2171 */\n 0x00\n /* \"#utility.yul\":2167:2168 */\n dup1\n /* \"#utility.yul\":2160:2172 */\n revert\n /* \"#utility.yul\":2184:2286 */\n tag_78:\n /* \"#utility.yul\":2225:2231 */\n 0x00\n /* \"#utility.yul\":2276:2278 */\n 0x1f\n /* \"#utility.yul\":2272:2279 */\n not\n /* \"#utility.yul\":2267:2269 */\n 0x1f\n /* \"#utility.yul\":2260:2265 */\n dup4\n /* \"#utility.yul\":2256:2270 */\n add\n /* \"#utility.yul\":2252:2280 */\n and\n /* \"#utility.yul\":2242:2280 */\n swap1\n pop\n /* \"#utility.yul\":2184:2286 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":2292:2472 */\n tag_79:\n /* \"#utility.yul\":2340:2417 */\n 0x4e487b7100000000000000000000000000000000000000000000000000000000\n /* \"#utility.yul\":2337:2338 */\n 0x00\n /* \"#utility.yul\":2330:2418 */\n mstore\n /* \"#utility.yul\":2437:2441 */\n 0x41\n /* \"#utility.yul\":2434:2435 */\n 0x04\n /* \"#utility.yul\":2427:2442 */\n mstore\n /* \"#utility.yul\":2461:2465 */\n 0x24\n /* \"#utility.yul\":2458:2459 */\n 0x00\n /* \"#utility.yul\":2451:2466 */\n revert\n /* \"#utility.yul\":2478:2759 */\n tag_80:\n /* \"#utility.yul\":2561:2588 */\n tag_157\n /* \"#utility.yul\":2583:2587 */\n dup3\n /* \"#utility.yul\":2561:2588 */\n tag_78\n jump\t// in\n tag_157:\n /* \"#utility.yul\":2553:2559 */\n dup2\n /* \"#utility.yul\":2549:2589 */\n add\n /* \"#utility.yul\":2691:2697 */\n dup2\n /* \"#utility.yul\":2679:2689 */\n dup2\n /* \"#utility.yul\":2676:2698 */\n lt\n /* \"#utility.yul\":2655:2673 */\n 0xffffffffffffffff\n /* \"#utility.yul\":2643:2653 */\n dup3\n /* \"#utility.yul\":2640:2674 */\n gt\n /* \"#utility.yul\":2637:2699 */\n or\n /* \"#utility.yul\":2634:2722 */\n iszero\n tag_158\n jumpi\n /* \"#utility.yul\":2702:2720 */\n tag_159\n tag_79\n jump\t// in\n tag_159:\n /* \"#utility.yul\":2634:2722 */\n tag_158:\n /* \"#utility.yul\":2742:2752 */\n dup1\n /* \"#utility.yul\":2738:2740 */\n 0x40\n /* \"#utility.yul\":2731:2753 */\n mstore\n /* \"#utility.yul\":2521:2759 */\n pop\n /* \"#utility.yul\":2478:2759 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":2765:2894 */\n tag_81:\n /* \"#utility.yul\":2799:2805 */\n 0x00\n /* \"#utility.yul\":2826:2846 */\n tag_161\n tag_60\n jump\t// in\n tag_161:\n /* \"#utility.yul\":2816:2846 */\n swap1\n pop\n /* \"#utility.yul\":2855:2888 */\n tag_162\n /* \"#utility.yul\":2883:2887 */\n dup3\n /* \"#utility.yul\":2875:2881 */\n dup3\n /* \"#utility.yul\":2855:2888 */\n tag_80\n jump\t// in\n tag_162:\n /* \"#utility.yul\":2765:2894 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":2900:3207 */\n tag_82:\n /* \"#utility.yul\":2961:2965 */\n 0x00\n /* \"#utility.yul\":3051:3069 */\n 0xffffffffffffffff\n /* \"#utility.yul\":3043:3049 */\n dup3\n /* \"#utility.yul\":3040:3070 */\n gt\n /* \"#utility.yul\":3037:3093 */\n iszero\n tag_164\n jumpi\n /* \"#utility.yul\":3073:3091 */\n tag_165\n tag_79\n jump\t// in\n tag_165:\n /* \"#utility.yul\":3037:3093 */\n tag_164:\n /* \"#utility.yul\":3111:3140 */\n tag_166\n /* \"#utility.yul\":3133:3139 */\n dup3\n /* \"#utility.yul\":3111:3140 */\n tag_78\n jump\t// in\n tag_166:\n /* \"#utility.yul\":3103:3140 */\n swap1\n pop\n /* \"#utility.yul\":3195:3199 */\n 0x20\n /* \"#utility.yul\":3189:3193 */\n dup2\n /* \"#utility.yul\":3185:3200 */\n add\n /* \"#utility.yul\":3177:3200 */\n swap1\n pop\n /* \"#utility.yul\":2900:3207 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":3213:3367 */\n tag_83:\n /* \"#utility.yul\":3297:3303 */\n dup3\n /* \"#utility.yul\":3292:3295 */\n dup2\n /* \"#utility.yul\":3287:3290 */\n dup4\n /* \"#utility.yul\":3274:3304 */\n calldatacopy\n /* \"#utility.yul\":3359:3360 */\n 0x00\n /* \"#utility.yul\":3350:3356 */\n dup4\n /* \"#utility.yul\":3345:3348 */\n dup4\n /* \"#utility.yul\":3341:3357 */\n add\n /* \"#utility.yul\":3334:3361 */\n mstore\n /* \"#utility.yul\":3213:3367 */\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":3373:3783 */\n tag_84:\n /* \"#utility.yul\":3450:3455 */\n 0x00\n /* \"#utility.yul\":3475:3540 */\n tag_169\n /* \"#utility.yul\":3491:3539 */\n tag_170\n /* \"#utility.yul\":3532:3538 */\n dup5\n /* \"#utility.yul\":3491:3539 */\n tag_82\n jump\t// in\n tag_170:\n /* \"#utility.yul\":3475:3540 */\n tag_81\n jump\t// in\n tag_169:\n /* \"#utility.yul\":3466:3540 */\n swap1\n pop\n /* \"#utility.yul\":3563:3569 */\n dup3\n /* \"#utility.yul\":3556:3561 */\n dup2\n /* \"#utility.yul\":3549:3570 */\n mstore\n /* \"#utility.yul\":3601:3605 */\n 0x20\n /* \"#utility.yul\":3594:3599 */\n dup2\n /* \"#utility.yul\":3590:3606 */\n add\n /* \"#utility.yul\":3639:3642 */\n dup5\n /* \"#utility.yul\":3630:3636 */\n dup5\n /* \"#utility.yul\":3625:3628 */\n dup5\n /* \"#utility.yul\":3621:3637 */\n add\n /* \"#utility.yul\":3618:3643 */\n gt\n /* \"#utility.yul\":3615:3727 */\n iszero\n tag_171\n jumpi\n /* \"#utility.yul\":3646:3725 */\n tag_172\n tag_77\n jump\t// in\n tag_172:\n /* \"#utility.yul\":3615:3727 */\n tag_171:\n /* \"#utility.yul\":3736:3777 */\n tag_173\n /* \"#utility.yul\":3770:3776 */\n dup5\n /* \"#utility.yul\":3765:3768 */\n dup3\n /* \"#utility.yul\":3760:3763 */\n dup6\n /* \"#utility.yul\":3736:3777 */\n tag_83\n jump\t// in\n tag_173:\n /* \"#utility.yul\":3456:3783 */\n pop\n /* \"#utility.yul\":3373:3783 */\n swap4\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":3802:4140 */\n tag_85:\n /* \"#utility.yul\":3857:3862 */\n 0x00\n /* \"#utility.yul\":3906:3909 */\n dup3\n /* \"#utility.yul\":3899:3903 */\n 0x1f\n /* \"#utility.yul\":3891:3897 */\n dup4\n /* \"#utility.yul\":3887:3904 */\n add\n /* \"#utility.yul\":3883:3910 */\n slt\n /* \"#utility.yul\":3873:3995 */\n tag_175\n jumpi\n /* \"#utility.yul\":3914:3993 */\n tag_176\n tag_76\n jump\t// in\n tag_176:\n /* \"#utility.yul\":3873:3995 */\n tag_175:\n /* \"#utility.yul\":4031:4037 */\n dup2\n /* \"#utility.yul\":4018:4038 */\n calldataload\n /* \"#utility.yul\":4056:4134 */\n tag_177\n /* \"#utility.yul\":4130:4133 */\n dup5\n /* \"#utility.yul\":4122:4128 */\n dup3\n /* \"#utility.yul\":4115:4119 */\n 0x20\n /* \"#utility.yul\":4107:4113 */\n dup7\n /* \"#utility.yul\":4103:4120 */\n add\n /* \"#utility.yul\":4056:4134 */\n tag_84\n jump\t// in\n tag_177:\n /* \"#utility.yul\":4047:4134 */\n swap2\n pop\n /* \"#utility.yul\":3863:4140 */\n pop\n /* \"#utility.yul\":3802:4140 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":4146:5227 */\n tag_10:\n /* \"#utility.yul\":4246:4252 */\n 0x00\n /* \"#utility.yul\":4254:4260 */\n dup1\n /* \"#utility.yul\":4262:4268 */\n 0x00\n /* \"#utility.yul\":4270:4276 */\n dup1\n /* \"#utility.yul\":4278:4284 */\n 0x00\n /* \"#utility.yul\":4327:4330 */\n 0xa0\n /* \"#utility.yul\":4315:4324 */\n dup7\n /* \"#utility.yul\":4306:4313 */\n dup9\n /* \"#utility.yul\":4302:4325 */\n sub\n /* \"#utility.yul\":4298:4331 */\n slt\n /* \"#utility.yul\":4295:4415 */\n iszero\n tag_179\n jumpi\n /* \"#utility.yul\":4334:4413 */\n tag_180\n tag_61\n jump\t// in\n tag_180:\n /* \"#utility.yul\":4295:4415 */\n tag_179:\n /* \"#utility.yul\":4454:4455 */\n 0x00\n /* \"#utility.yul\":4479:4530 */\n tag_181\n /* \"#utility.yul\":4522:4529 */\n dup9\n /* \"#utility.yul\":4513:4519 */\n dup3\n /* \"#utility.yul\":4502:4511 */\n dup10\n /* \"#utility.yul\":4498:4520 */\n add\n /* \"#utility.yul\":4479:4530 */\n tag_65\n jump\t// in\n tag_181:\n /* \"#utility.yul\":4469:4530 */\n swap6\n pop\n /* \"#utility.yul\":4425:4540 */\n pop\n /* \"#utility.yul\":4579:4581 */\n 0x20\n /* \"#utility.yul\":4605:4657 */\n tag_182\n /* \"#utility.yul\":4649:4656 */\n dup9\n /* \"#utility.yul\":4640:4646 */\n dup3\n /* \"#utility.yul\":4629:4638 */\n dup10\n /* \"#utility.yul\":4625:4647 */\n add\n /* \"#utility.yul\":4605:4657 */\n tag_68\n jump\t// in\n tag_182:\n /* \"#utility.yul\":4595:4657 */\n swap5\n pop\n /* \"#utility.yul\":4550:4667 */\n pop\n /* \"#utility.yul\":4706:4708 */\n 0x40\n /* \"#utility.yul\":4732:4785 */\n tag_183\n /* \"#utility.yul\":4777:4784 */\n dup9\n /* \"#utility.yul\":4768:4774 */\n dup3\n /* \"#utility.yul\":4757:4766 */\n dup10\n /* \"#utility.yul\":4753:4775 */\n add\n /* \"#utility.yul\":4732:4785 */\n tag_72\n jump\t// in\n tag_183:\n /* \"#utility.yul\":4722:4785 */\n swap4\n pop\n /* \"#utility.yul\":4677:4795 */\n pop\n /* \"#utility.yul\":4834:4836 */\n 0x60\n /* \"#utility.yul\":4860:4912 */\n tag_184\n /* \"#utility.yul\":4904:4911 */\n dup9\n /* \"#utility.yul\":4895:4901 */\n dup3\n /* \"#utility.yul\":4884:4893 */\n dup10\n /* \"#utility.yul\":4880:4902 */\n add\n /* \"#utility.yul\":4860:4912 */\n tag_75\n jump\t// in\n tag_184:\n /* \"#utility.yul\":4850:4912 */\n swap3\n pop\n /* \"#utility.yul\":4805:4922 */\n pop\n /* \"#utility.yul\":4989:4992 */\n 0x80\n /* \"#utility.yul\":4978:4987 */\n dup7\n /* \"#utility.yul\":4974:4993 */\n add\n /* \"#utility.yul\":4961:4994 */\n calldataload\n /* \"#utility.yul\":5021:5039 */\n 0xffffffffffffffff\n /* \"#utility.yul\":5013:5019 */\n dup2\n /* \"#utility.yul\":5010:5040 */\n gt\n /* \"#utility.yul\":5007:5124 */\n iszero\n tag_185\n jumpi\n /* \"#utility.yul\":5043:5122 */\n tag_186\n tag_62\n jump\t// in\n tag_186:\n /* \"#utility.yul\":5007:5124 */\n tag_185:\n /* \"#utility.yul\":5148:5210 */\n tag_187\n /* \"#utility.yul\":5202:5209 */\n dup9\n /* \"#utility.yul\":5193:5199 */\n dup3\n /* \"#utility.yul\":5182:5191 */\n dup10\n /* \"#utility.yul\":5178:5200 */\n add\n /* \"#utility.yul\":5148:5210 */\n tag_85\n jump\t// in\n tag_187:\n /* \"#utility.yul\":5138:5210 */\n swap2\n pop\n /* \"#utility.yul\":4932:5220 */\n pop\n /* \"#utility.yul\":4146:5227 */\n swap3\n swap6\n pop\n swap3\n swap6\n swap1\n swap4\n pop\n jump\t// out\n /* \"#utility.yul\":5233:5293 */\n tag_86:\n /* \"#utility.yul\":5261:5264 */\n 0x00\n /* \"#utility.yul\":5282:5287 */\n dup2\n /* \"#utility.yul\":5275:5287 */\n swap1\n pop\n /* \"#utility.yul\":5233:5293 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":5299:5441 */\n tag_87:\n /* \"#utility.yul\":5349:5358 */\n 0x00\n /* \"#utility.yul\":5382:5435 */\n tag_190\n /* \"#utility.yul\":5400:5434 */\n tag_191\n /* \"#utility.yul\":5409:5433 */\n tag_192\n /* \"#utility.yul\":5427:5432 */\n dup5\n /* \"#utility.yul\":5409:5433 */\n tag_69\n jump\t// in\n tag_192:\n /* \"#utility.yul\":5400:5434 */\n tag_86\n jump\t// in\n tag_191:\n /* \"#utility.yul\":5382:5435 */\n tag_69\n jump\t// in\n tag_190:\n /* \"#utility.yul\":5369:5435 */\n swap1\n pop\n /* \"#utility.yul\":5299:5441 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":5447:5573 */\n tag_88:\n /* \"#utility.yul\":5497:5506 */\n 0x00\n /* \"#utility.yul\":5530:5567 */\n tag_194\n /* \"#utility.yul\":5561:5566 */\n dup3\n /* \"#utility.yul\":5530:5567 */\n tag_87\n jump\t// in\n tag_194:\n /* \"#utility.yul\":5517:5567 */\n swap1\n pop\n /* \"#utility.yul\":5447:5573 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":5579:5725 */\n tag_89:\n /* \"#utility.yul\":5649:5658 */\n 0x00\n /* \"#utility.yul\":5682:5719 */\n tag_196\n /* \"#utility.yul\":5713:5718 */\n dup3\n /* \"#utility.yul\":5682:5719 */\n tag_88\n jump\t// in\n tag_196:\n /* \"#utility.yul\":5669:5719 */\n swap1\n pop\n /* \"#utility.yul\":5579:5725 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":5731:5902 */\n tag_90:\n /* \"#utility.yul\":5838:5895 */\n tag_198\n /* \"#utility.yul\":5889:5894 */\n dup2\n /* \"#utility.yul\":5838:5895 */\n tag_89\n jump\t// in\n tag_198:\n /* \"#utility.yul\":5833:5836 */\n dup3\n /* \"#utility.yul\":5826:5896 */\n mstore\n /* \"#utility.yul\":5731:5902 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":5908:6170 */\n tag_15:\n /* \"#utility.yul\":6021:6025 */\n 0x00\n /* \"#utility.yul\":6059:6061 */\n 0x20\n /* \"#utility.yul\":6048:6057 */\n dup3\n /* \"#utility.yul\":6044:6062 */\n add\n /* \"#utility.yul\":6036:6062 */\n swap1\n pop\n /* \"#utility.yul\":6072:6163 */\n tag_200\n /* \"#utility.yul\":6160:6161 */\n 0x00\n /* \"#utility.yul\":6149:6158 */\n dup4\n /* \"#utility.yul\":6145:6162 */\n add\n /* \"#utility.yul\":6136:6142 */\n dup5\n /* \"#utility.yul\":6072:6163 */\n tag_90\n jump\t// in\n tag_200:\n /* \"#utility.yul\":5908:6170 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":6176:6503 */\n tag_18:\n /* \"#utility.yul\":6234:6240 */\n 0x00\n /* \"#utility.yul\":6283:6285 */\n 0x20\n /* \"#utility.yul\":6271:6280 */\n dup3\n /* \"#utility.yul\":6262:6269 */\n dup5\n /* \"#utility.yul\":6258:6281 */\n sub\n /* \"#utility.yul\":6254:6286 */\n slt\n /* \"#utility.yul\":6251:6370 */\n iszero\n tag_202\n jumpi\n /* \"#utility.yul\":6289:6368 */\n tag_203\n tag_61\n jump\t// in\n tag_203:\n /* \"#utility.yul\":6251:6370 */\n tag_202:\n /* \"#utility.yul\":6409:6410 */\n 0x00\n /* \"#utility.yul\":6434:6486 */\n tag_204\n /* \"#utility.yul\":6478:6485 */\n dup5\n /* \"#utility.yul\":6469:6475 */\n dup3\n /* \"#utility.yul\":6458:6467 */\n dup6\n /* \"#utility.yul\":6454:6476 */\n add\n /* \"#utility.yul\":6434:6486 */\n tag_68\n jump\t// in\n tag_204:\n /* \"#utility.yul\":6424:6486 */\n swap2\n pop\n /* \"#utility.yul\":6380:6496 */\n pop\n /* \"#utility.yul\":6176:6503 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":6509:6627 */\n tag_91:\n /* \"#utility.yul\":6596:6620 */\n tag_206\n /* \"#utility.yul\":6614:6619 */\n dup2\n /* \"#utility.yul\":6596:6620 */\n tag_70\n jump\t// in\n tag_206:\n /* \"#utility.yul\":6591:6594 */\n dup3\n /* \"#utility.yul\":6584:6621 */\n mstore\n /* \"#utility.yul\":6509:6627 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":6633:6855 */\n tag_21:\n /* \"#utility.yul\":6726:6730 */\n 0x00\n /* \"#utility.yul\":6764:6766 */\n 0x20\n /* \"#utility.yul\":6753:6762 */\n dup3\n /* \"#utility.yul\":6749:6767 */\n add\n /* \"#utility.yul\":6741:6767 */\n swap1\n pop\n /* \"#utility.yul\":6777:6848 */\n tag_208\n /* \"#utility.yul\":6845:6846 */\n 0x00\n /* \"#utility.yul\":6834:6843 */\n dup4\n /* \"#utility.yul\":6830:6847 */\n add\n /* \"#utility.yul\":6821:6827 */\n dup5\n /* \"#utility.yul\":6777:6848 */\n tag_91\n jump\t// in\n tag_208:\n /* \"#utility.yul\":6633:6855 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":6861:6978 */\n tag_92:\n /* \"#utility.yul\":6970:6971 */\n 0x00\n /* \"#utility.yul\":6967:6968 */\n dup1\n /* \"#utility.yul\":6960:6972 */\n revert\n /* \"#utility.yul\":6984:7101 */\n tag_93:\n /* \"#utility.yul\":7093:7094 */\n 0x00\n /* \"#utility.yul\":7090:7091 */\n dup1\n /* \"#utility.yul\":7083:7095 */\n revert\n /* \"#utility.yul\":7107:7427 */\n tag_94:\n /* \"#utility.yul\":7193:7197 */\n 0x00\n /* \"#utility.yul\":7283:7301 */\n 0xffffffffffffffff\n /* \"#utility.yul\":7275:7281 */\n dup3\n /* \"#utility.yul\":7272:7302 */\n gt\n /* \"#utility.yul\":7269:7325 */\n iszero\n tag_212\n jumpi\n /* \"#utility.yul\":7305:7323 */\n tag_213\n tag_79\n jump\t// in\n tag_213:\n /* \"#utility.yul\":7269:7325 */\n tag_212:\n /* \"#utility.yul\":7355:7359 */\n 0x20\n /* \"#utility.yul\":7347:7353 */\n dup3\n /* \"#utility.yul\":7343:7360 */\n mul\n /* \"#utility.yul\":7335:7360 */\n swap1\n pop\n /* \"#utility.yul\":7415:7419 */\n 0x20\n /* \"#utility.yul\":7409:7413 */\n dup2\n /* \"#utility.yul\":7405:7420 */\n add\n /* \"#utility.yul\":7397:7420 */\n swap1\n pop\n /* \"#utility.yul\":7107:7427 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":7433:7550 */\n tag_95:\n /* \"#utility.yul\":7542:7543 */\n 0x00\n /* \"#utility.yul\":7539:7540 */\n dup1\n /* \"#utility.yul\":7532:7544 */\n revert\n /* \"#utility.yul\":7571:8513 */\n tag_96:\n /* \"#utility.yul\":7676:7681 */\n 0x00\n /* \"#utility.yul\":7701:7791 */\n tag_216\n /* \"#utility.yul\":7717:7790 */\n tag_217\n /* \"#utility.yul\":7783:7789 */\n dup5\n /* \"#utility.yul\":7717:7790 */\n tag_94\n jump\t// in\n tag_217:\n /* \"#utility.yul\":7701:7791 */\n tag_81\n jump\t// in\n tag_216:\n /* \"#utility.yul\":7692:7791 */\n swap1\n pop\n /* \"#utility.yul\":7811:7816 */\n dup1\n /* \"#utility.yul\":7840:7846 */\n dup4\n /* \"#utility.yul\":7833:7838 */\n dup3\n /* \"#utility.yul\":7826:7847 */\n mstore\n /* \"#utility.yul\":7874:7878 */\n 0x20\n /* \"#utility.yul\":7867:7872 */\n dup3\n /* \"#utility.yul\":7863:7879 */\n add\n /* \"#utility.yul\":7856:7879 */\n swap1\n pop\n /* \"#utility.yul\":7927:7931 */\n 0x20\n /* \"#utility.yul\":7919:7925 */\n dup5\n /* \"#utility.yul\":7915:7932 */\n mul\n /* \"#utility.yul\":7907:7913 */\n dup4\n /* \"#utility.yul\":7903:7933 */\n add\n /* \"#utility.yul\":7956:7959 */\n dup6\n /* \"#utility.yul\":7948:7954 */\n dup2\n /* \"#utility.yul\":7945:7960 */\n gt\n /* \"#utility.yul\":7942:8064 */\n iszero\n tag_218\n jumpi\n /* \"#utility.yul\":7975:8054 */\n tag_219\n tag_95\n jump\t// in\n tag_219:\n /* \"#utility.yul\":7942:8064 */\n tag_218:\n /* \"#utility.yul\":8090:8096 */\n dup4\n /* \"#utility.yul\":8073:8507 */\n tag_220:\n /* \"#utility.yul\":8107:8113 */\n dup2\n /* \"#utility.yul\":8102:8105 */\n dup2\n /* \"#utility.yul\":8099:8114 */\n lt\n /* \"#utility.yul\":8073:8507 */\n iszero\n tag_222\n jumpi\n /* \"#utility.yul\":8196:8199 */\n dup1\n /* \"#utility.yul\":8183:8200 */\n calldataload\n /* \"#utility.yul\":8232:8250 */\n 0xffffffffffffffff\n /* \"#utility.yul\":8219:8230 */\n dup2\n /* \"#utility.yul\":8216:8251 */\n gt\n /* \"#utility.yul\":8213:8335 */\n iszero\n tag_223\n jumpi\n /* \"#utility.yul\":8254:8333 */\n tag_224\n tag_76\n jump\t// in\n tag_224:\n /* \"#utility.yul\":8213:8335 */\n tag_223:\n /* \"#utility.yul\":8378:8389 */\n dup1\n /* \"#utility.yul\":8370:8376 */\n dup7\n /* \"#utility.yul\":8366:8390 */\n add\n /* \"#utility.yul\":8416:8462 */\n tag_225\n /* \"#utility.yul\":8458:8461 */\n dup10\n /* \"#utility.yul\":8446:8456 */\n dup3\n /* \"#utility.yul\":8416:8462 */\n tag_85\n jump\t// in\n tag_225:\n /* \"#utility.yul\":8411:8414 */\n dup6\n /* \"#utility.yul\":8404:8463 */\n mstore\n /* \"#utility.yul\":8492:8496 */\n 0x20\n /* \"#utility.yul\":8487:8490 */\n dup6\n /* \"#utility.yul\":8483:8497 */\n add\n /* \"#utility.yul\":8476:8497 */\n swap5\n pop\n /* \"#utility.yul\":8149:8507 */\n pop\n pop\n /* \"#utility.yul\":8133:8137 */\n 0x20\n /* \"#utility.yul\":8128:8131 */\n dup2\n /* \"#utility.yul\":8124:8138 */\n add\n /* \"#utility.yul\":8117:8138 */\n swap1\n pop\n /* \"#utility.yul\":8073:8507 */\n jump(tag_220)\n tag_222:\n /* \"#utility.yul\":8077:8098 */\n pop\n /* \"#utility.yul\":7682:8513 */\n pop\n pop\n /* \"#utility.yul\":7571:8513 */\n swap4\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":8534:8922 */\n tag_97:\n /* \"#utility.yul\":8614:8619 */\n 0x00\n /* \"#utility.yul\":8663:8666 */\n dup3\n /* \"#utility.yul\":8656:8660 */\n 0x1f\n /* \"#utility.yul\":8648:8654 */\n dup4\n /* \"#utility.yul\":8644:8661 */\n add\n /* \"#utility.yul\":8640:8667 */\n slt\n /* \"#utility.yul\":8630:8752 */\n tag_227\n jumpi\n /* \"#utility.yul\":8671:8750 */\n tag_228\n tag_76\n jump\t// in\n tag_228:\n /* \"#utility.yul\":8630:8752 */\n tag_227:\n /* \"#utility.yul\":8788:8794 */\n dup2\n /* \"#utility.yul\":8775:8795 */\n calldataload\n /* \"#utility.yul\":8813:8916 */\n tag_229\n /* \"#utility.yul\":8912:8915 */\n dup5\n /* \"#utility.yul\":8904:8910 */\n dup3\n /* \"#utility.yul\":8897:8901 */\n 0x20\n /* \"#utility.yul\":8889:8895 */\n dup7\n /* \"#utility.yul\":8885:8902 */\n add\n /* \"#utility.yul\":8813:8916 */\n tag_96\n jump\t// in\n tag_229:\n /* \"#utility.yul\":8804:8916 */\n swap2\n pop\n /* \"#utility.yul\":8620:8922 */\n pop\n /* \"#utility.yul\":8534:8922 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":8970:9746 */\n tag_98:\n /* \"#utility.yul\":9047:9052 */\n 0x00\n /* \"#utility.yul\":9091:9095 */\n 0x40\n /* \"#utility.yul\":9079:9088 */\n dup3\n /* \"#utility.yul\":9074:9077 */\n dup5\n /* \"#utility.yul\":9070:9089 */\n sub\n /* \"#utility.yul\":9066:9096 */\n slt\n /* \"#utility.yul\":9063:9180 */\n iszero\n tag_231\n jumpi\n /* \"#utility.yul\":9099:9178 */\n tag_232\n tag_92\n jump\t// in\n tag_232:\n /* \"#utility.yul\":9063:9180 */\n tag_231:\n /* \"#utility.yul\":9198:9219 */\n tag_233\n /* \"#utility.yul\":9214:9218 */\n 0x40\n /* \"#utility.yul\":9198:9219 */\n tag_81\n jump\t// in\n tag_233:\n /* \"#utility.yul\":9189:9219 */\n swap1\n pop\n /* \"#utility.yul\":9281:9282 */\n 0x00\n /* \"#utility.yul\":9321:9368 */\n tag_234\n /* \"#utility.yul\":9364:9367 */\n dup5\n /* \"#utility.yul\":9355:9361 */\n dup3\n /* \"#utility.yul\":9344:9353 */\n dup6\n /* \"#utility.yul\":9340:9362 */\n add\n /* \"#utility.yul\":9321:9368 */\n tag_65\n jump\t// in\n tag_234:\n /* \"#utility.yul\":9314:9318 */\n 0x00\n /* \"#utility.yul\":9307:9312 */\n dup4\n /* \"#utility.yul\":9303:9319 */\n add\n /* \"#utility.yul\":9296:9369 */\n mstore\n /* \"#utility.yul\":9229:9380 */\n pop\n /* \"#utility.yul\":9471:9473 */\n 0x20\n /* \"#utility.yul\":9460:9469 */\n dup3\n /* \"#utility.yul\":9456:9474 */\n add\n /* \"#utility.yul\":9443:9475 */\n calldataload\n /* \"#utility.yul\":9502:9520 */\n 0xffffffffffffffff\n /* \"#utility.yul\":9494:9500 */\n dup2\n /* \"#utility.yul\":9491:9521 */\n gt\n /* \"#utility.yul\":9488:9605 */\n iszero\n tag_235\n jumpi\n /* \"#utility.yul\":9524:9603 */\n tag_236\n tag_93\n jump\t// in\n tag_236:\n /* \"#utility.yul\":9488:9605 */\n tag_235:\n /* \"#utility.yul\":9644:9727 */\n tag_237\n /* \"#utility.yul\":9723:9726 */\n dup5\n /* \"#utility.yul\":9714:9720 */\n dup3\n /* \"#utility.yul\":9703:9712 */\n dup6\n /* \"#utility.yul\":9699:9721 */\n add\n /* \"#utility.yul\":9644:9727 */\n tag_97\n jump\t// in\n tag_237:\n /* \"#utility.yul\":9637:9641 */\n 0x20\n /* \"#utility.yul\":9630:9635 */\n dup4\n /* \"#utility.yul\":9626:9642 */\n add\n /* \"#utility.yul\":9619:9728 */\n mstore\n /* \"#utility.yul\":9390:9739 */\n pop\n /* \"#utility.yul\":8970:9746 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":9752:11049 */\n tag_24:\n /* \"#utility.yul\":9880:9886 */\n 0x00\n /* \"#utility.yul\":9888:9894 */\n dup1\n /* \"#utility.yul\":9896:9902 */\n 0x00\n /* \"#utility.yul\":9904:9910 */\n dup1\n /* \"#utility.yul\":9912:9918 */\n 0x00\n /* \"#utility.yul\":9961:9964 */\n 0xa0\n /* \"#utility.yul\":9949:9958 */\n dup7\n /* \"#utility.yul\":9940:9947 */\n dup9\n /* \"#utility.yul\":9936:9959 */\n sub\n /* \"#utility.yul\":9932:9965 */\n slt\n /* \"#utility.yul\":9929:10049 */\n iszero\n tag_239\n jumpi\n /* \"#utility.yul\":9968:10047 */\n tag_240\n tag_61\n jump\t// in\n tag_240:\n /* \"#utility.yul\":9929:10049 */\n tag_239:\n /* \"#utility.yul\":10088:10089 */\n 0x00\n /* \"#utility.yul\":10113:10164 */\n tag_241\n /* \"#utility.yul\":10156:10163 */\n dup9\n /* \"#utility.yul\":10147:10153 */\n dup3\n /* \"#utility.yul\":10136:10145 */\n dup10\n /* \"#utility.yul\":10132:10154 */\n add\n /* \"#utility.yul\":10113:10164 */\n tag_65\n jump\t// in\n tag_241:\n /* \"#utility.yul\":10103:10164 */\n swap6\n pop\n /* \"#utility.yul\":10059:10174 */\n pop\n /* \"#utility.yul\":10213:10215 */\n 0x20\n /* \"#utility.yul\":10239:10291 */\n tag_242\n /* \"#utility.yul\":10283:10290 */\n dup9\n /* \"#utility.yul\":10274:10280 */\n dup3\n /* \"#utility.yul\":10263:10272 */\n dup10\n /* \"#utility.yul\":10259:10281 */\n add\n /* \"#utility.yul\":10239:10291 */\n tag_68\n jump\t// in\n tag_242:\n /* \"#utility.yul\":10229:10291 */\n swap5\n pop\n /* \"#utility.yul\":10184:10301 */\n pop\n /* \"#utility.yul\":10368:10370 */\n 0x40\n /* \"#utility.yul\":10357:10366 */\n dup7\n /* \"#utility.yul\":10353:10371 */\n add\n /* \"#utility.yul\":10340:10372 */\n calldataload\n /* \"#utility.yul\":10399:10417 */\n 0xffffffffffffffff\n /* \"#utility.yul\":10391:10397 */\n dup2\n /* \"#utility.yul\":10388:10418 */\n gt\n /* \"#utility.yul\":10385:10502 */\n iszero\n tag_243\n jumpi\n /* \"#utility.yul\":10421:10500 */\n tag_244\n tag_62\n jump\t// in\n tag_244:\n /* \"#utility.yul\":10385:10502 */\n tag_243:\n /* \"#utility.yul\":10526:10607 */\n tag_245\n /* \"#utility.yul\":10599:10606 */\n dup9\n /* \"#utility.yul\":10590:10596 */\n dup3\n /* \"#utility.yul\":10579:10588 */\n dup10\n /* \"#utility.yul\":10575:10597 */\n add\n /* \"#utility.yul\":10526:10607 */\n tag_98\n jump\t// in\n tag_245:\n /* \"#utility.yul\":10516:10607 */\n swap4\n pop\n /* \"#utility.yul\":10311:10617 */\n pop\n /* \"#utility.yul\":10656:10658 */\n 0x60\n /* \"#utility.yul\":10682:10734 */\n tag_246\n /* \"#utility.yul\":10726:10733 */\n dup9\n /* \"#utility.yul\":10717:10723 */\n dup3\n /* \"#utility.yul\":10706:10715 */\n dup10\n /* \"#utility.yul\":10702:10724 */\n add\n /* \"#utility.yul\":10682:10734 */\n tag_75\n jump\t// in\n tag_246:\n /* \"#utility.yul\":10672:10734 */\n swap3\n pop\n /* \"#utility.yul\":10627:10744 */\n pop\n /* \"#utility.yul\":10811:10814 */\n 0x80\n /* \"#utility.yul\":10800:10809 */\n dup7\n /* \"#utility.yul\":10796:10815 */\n add\n /* \"#utility.yul\":10783:10816 */\n calldataload\n /* \"#utility.yul\":10843:10861 */\n 0xffffffffffffffff\n /* \"#utility.yul\":10835:10841 */\n dup2\n /* \"#utility.yul\":10832:10862 */\n gt\n /* \"#utility.yul\":10829:10946 */\n iszero\n tag_247\n jumpi\n /* \"#utility.yul\":10865:10944 */\n tag_248\n tag_62\n jump\t// in\n tag_248:\n /* \"#utility.yul\":10829:10946 */\n tag_247:\n /* \"#utility.yul\":10970:11032 */\n tag_249\n /* \"#utility.yul\":11024:11031 */\n dup9\n /* \"#utility.yul\":11015:11021 */\n dup3\n /* \"#utility.yul\":11004:11013 */\n dup10\n /* \"#utility.yul\":11000:11022 */\n add\n /* \"#utility.yul\":10970:11032 */\n tag_85\n jump\t// in\n tag_249:\n /* \"#utility.yul\":10960:11032 */\n swap2\n pop\n /* \"#utility.yul\":10754:11042 */\n pop\n /* \"#utility.yul\":9752:11049 */\n swap3\n swap6\n pop\n swap3\n swap6\n swap1\n swap4\n pop\n jump\t// out\n /* \"#utility.yul\":11055:11600 */\n tag_28:\n /* \"#utility.yul\":11142:11148 */\n 0x00\n /* \"#utility.yul\":11191:11193 */\n 0x20\n /* \"#utility.yul\":11179:11188 */\n dup3\n /* \"#utility.yul\":11170:11177 */\n dup5\n /* \"#utility.yul\":11166:11189 */\n sub\n /* \"#utility.yul\":11162:11194 */\n slt\n /* \"#utility.yul\":11159:11278 */\n iszero\n tag_251\n jumpi\n /* \"#utility.yul\":11197:11276 */\n tag_252\n tag_61\n jump\t// in\n tag_252:\n /* \"#utility.yul\":11159:11278 */\n tag_251:\n /* \"#utility.yul\":11345:11346 */\n 0x00\n /* \"#utility.yul\":11334:11343 */\n dup3\n /* \"#utility.yul\":11330:11347 */\n add\n /* \"#utility.yul\":11317:11348 */\n calldataload\n /* \"#utility.yul\":11375:11393 */\n 0xffffffffffffffff\n /* \"#utility.yul\":11367:11373 */\n dup2\n /* \"#utility.yul\":11364:11394 */\n gt\n /* \"#utility.yul\":11361:11478 */\n iszero\n tag_253\n jumpi\n /* \"#utility.yul\":11397:11476 */\n tag_254\n tag_62\n jump\t// in\n tag_254:\n /* \"#utility.yul\":11361:11478 */\n tag_253:\n /* \"#utility.yul\":11502:11583 */\n tag_255\n /* \"#utility.yul\":11575:11582 */\n dup5\n /* \"#utility.yul\":11566:11572 */\n dup3\n /* \"#utility.yul\":11555:11564 */\n dup6\n /* \"#utility.yul\":11551:11573 */\n add\n /* \"#utility.yul\":11502:11583 */\n tag_98\n jump\t// in\n tag_255:\n /* \"#utility.yul\":11492:11583 */\n swap2\n pop\n /* \"#utility.yul\":11288:11593 */\n pop\n /* \"#utility.yul\":11055:11600 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":11606:11683 */\n tag_99:\n /* \"#utility.yul\":11643:11650 */\n 0x00\n /* \"#utility.yul\":11672:11677 */\n dup2\n /* \"#utility.yul\":11661:11677 */\n swap1\n pop\n /* \"#utility.yul\":11606:11683 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":11689:11807 */\n tag_100:\n /* \"#utility.yul\":11776:11800 */\n tag_258\n /* \"#utility.yul\":11794:11799 */\n dup2\n /* \"#utility.yul\":11776:11800 */\n tag_99\n jump\t// in\n tag_258:\n /* \"#utility.yul\":11771:11774 */\n dup3\n /* \"#utility.yul\":11764:11801 */\n mstore\n /* \"#utility.yul\":11689:11807 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":11813:11928 */\n tag_101:\n /* \"#utility.yul\":11898:11921 */\n tag_260\n /* \"#utility.yul\":11915:11920 */\n dup2\n /* \"#utility.yul\":11898:11921 */\n tag_73\n jump\t// in\n tag_260:\n /* \"#utility.yul\":11893:11896 */\n dup3\n /* \"#utility.yul\":11886:11922 */\n mstore\n /* \"#utility.yul\":11813:11928 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":11934:12262 */\n tag_31:\n /* \"#utility.yul\":12053:12057 */\n 0x00\n /* \"#utility.yul\":12091:12093 */\n 0x40\n /* \"#utility.yul\":12080:12089 */\n dup3\n /* \"#utility.yul\":12076:12094 */\n add\n /* \"#utility.yul\":12068:12094 */\n swap1\n pop\n /* \"#utility.yul\":12104:12175 */\n tag_262\n /* \"#utility.yul\":12172:12173 */\n 0x00\n /* \"#utility.yul\":12161:12170 */\n dup4\n /* \"#utility.yul\":12157:12174 */\n add\n /* \"#utility.yul\":12148:12154 */\n dup6\n /* \"#utility.yul\":12104:12175 */\n tag_100\n jump\t// in\n tag_262:\n /* \"#utility.yul\":12185:12255 */\n tag_263\n /* \"#utility.yul\":12251:12253 */\n 0x20\n /* \"#utility.yul\":12240:12249 */\n dup4\n /* \"#utility.yul\":12236:12254 */\n add\n /* \"#utility.yul\":12227:12233 */\n dup5\n /* \"#utility.yul\":12185:12255 */\n tag_101\n jump\t// in\n tag_263:\n /* \"#utility.yul\":11934:12262 */\n swap4\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":12268:12380 */\n tag_102:\n /* \"#utility.yul\":12351:12373 */\n tag_265\n /* \"#utility.yul\":12367:12372 */\n dup2\n /* \"#utility.yul\":12351:12373 */\n tag_63\n jump\t// in\n tag_265:\n /* \"#utility.yul\":12346:12349 */\n dup3\n /* \"#utility.yul\":12339:12374 */\n mstore\n /* \"#utility.yul\":12268:12380 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":12386:12501 */\n tag_103:\n /* \"#utility.yul\":12471:12494 */\n tag_267\n /* \"#utility.yul\":12488:12493 */\n dup2\n /* \"#utility.yul\":12471:12494 */\n tag_66\n jump\t// in\n tag_267:\n /* \"#utility.yul\":12466:12469 */\n dup3\n /* \"#utility.yul\":12459:12495 */\n mstore\n /* \"#utility.yul\":12386:12501 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":12507:12605 */\n tag_104:\n /* \"#utility.yul\":12558:12564 */\n 0x00\n /* \"#utility.yul\":12592:12597 */\n dup2\n /* \"#utility.yul\":12586:12598 */\n mload\n /* \"#utility.yul\":12576:12598 */\n swap1\n pop\n /* \"#utility.yul\":12507:12605 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":12611:12779 */\n tag_105:\n /* \"#utility.yul\":12694:12705 */\n 0x00\n /* \"#utility.yul\":12728:12734 */\n dup3\n /* \"#utility.yul\":12723:12726 */\n dup3\n /* \"#utility.yul\":12716:12735 */\n mstore\n /* \"#utility.yul\":12768:12772 */\n 0x20\n /* \"#utility.yul\":12763:12766 */\n dup3\n /* \"#utility.yul\":12759:12773 */\n add\n /* \"#utility.yul\":12744:12773 */\n swap1\n pop\n /* \"#utility.yul\":12611:12779 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":12785:13092 */\n tag_106:\n /* \"#utility.yul\":12853:12854 */\n 0x00\n /* \"#utility.yul\":12863:12976 */\n tag_271:\n /* \"#utility.yul\":12877:12883 */\n dup4\n /* \"#utility.yul\":12874:12875 */\n dup2\n /* \"#utility.yul\":12871:12884 */\n lt\n /* \"#utility.yul\":12863:12976 */\n iszero\n tag_273\n jumpi\n /* \"#utility.yul\":12962:12963 */\n dup1\n /* \"#utility.yul\":12957:12960 */\n dup3\n /* \"#utility.yul\":12953:12964 */\n add\n /* \"#utility.yul\":12947:12965 */\n mload\n /* \"#utility.yul\":12943:12944 */\n dup2\n /* \"#utility.yul\":12938:12941 */\n dup5\n /* \"#utility.yul\":12934:12945 */\n add\n /* \"#utility.yul\":12927:12966 */\n mstore\n /* \"#utility.yul\":12899:12901 */\n 0x20\n /* \"#utility.yul\":12896:12897 */\n dup2\n /* \"#utility.yul\":12892:12902 */\n add\n /* \"#utility.yul\":12887:12902 */\n swap1\n pop\n /* \"#utility.yul\":12863:12976 */\n jump(tag_271)\n tag_273:\n /* \"#utility.yul\":12994:13000 */\n dup4\n /* \"#utility.yul\":12991:12992 */\n dup2\n /* \"#utility.yul\":12988:13001 */\n gt\n /* \"#utility.yul\":12985:13086 */\n iszero\n tag_274\n jumpi\n /* \"#utility.yul\":13074:13075 */\n 0x00\n /* \"#utility.yul\":13065:13071 */\n dup5\n /* \"#utility.yul\":13060:13063 */\n dup5\n /* \"#utility.yul\":13056:13072 */\n add\n /* \"#utility.yul\":13049:13076 */\n mstore\n /* \"#utility.yul\":12985:13086 */\n tag_274:\n /* \"#utility.yul\":12834:13092 */\n pop\n /* \"#utility.yul\":12785:13092 */\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":13098:13458 */\n tag_107:\n /* \"#utility.yul\":13184:13187 */\n 0x00\n /* \"#utility.yul\":13212:13250 */\n tag_276\n /* \"#utility.yul\":13244:13249 */\n dup3\n /* \"#utility.yul\":13212:13250 */\n tag_104\n jump\t// in\n tag_276:\n /* \"#utility.yul\":13266:13336 */\n tag_277\n /* \"#utility.yul\":13329:13335 */\n dup2\n /* \"#utility.yul\":13324:13327 */\n dup6\n /* \"#utility.yul\":13266:13336 */\n tag_105\n jump\t// in\n tag_277:\n /* \"#utility.yul\":13259:13336 */\n swap4\n pop\n /* \"#utility.yul\":13345:13397 */\n tag_278\n /* \"#utility.yul\":13390:13396 */\n dup2\n /* \"#utility.yul\":13385:13388 */\n dup6\n /* \"#utility.yul\":13378:13382 */\n 0x20\n /* \"#utility.yul\":13371:13376 */\n dup7\n /* \"#utility.yul\":13367:13383 */\n add\n /* \"#utility.yul\":13345:13397 */\n tag_106\n jump\t// in\n tag_278:\n /* \"#utility.yul\":13422:13451 */\n tag_279\n /* \"#utility.yul\":13444:13450 */\n dup2\n /* \"#utility.yul\":13422:13451 */\n tag_78\n jump\t// in\n tag_279:\n /* \"#utility.yul\":13417:13420 */\n dup5\n /* \"#utility.yul\":13413:13452 */\n add\n /* \"#utility.yul\":13406:13452 */\n swap2\n pop\n /* \"#utility.yul\":13188:13458 */\n pop\n /* \"#utility.yul\":13098:13458 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":13464:14199 */\n tag_34:\n /* \"#utility.yul\":13679:13683 */\n 0x00\n /* \"#utility.yul\":13717:13720 */\n 0xa0\n /* \"#utility.yul\":13706:13715 */\n dup3\n /* \"#utility.yul\":13702:13721 */\n add\n /* \"#utility.yul\":13694:13721 */\n swap1\n pop\n /* \"#utility.yul\":13731:13798 */\n tag_281\n /* \"#utility.yul\":13795:13796 */\n 0x00\n /* \"#utility.yul\":13784:13793 */\n dup4\n /* \"#utility.yul\":13780:13797 */\n add\n /* \"#utility.yul\":13771:13777 */\n dup9\n /* \"#utility.yul\":13731:13798 */\n tag_102\n jump\t// in\n tag_281:\n /* \"#utility.yul\":13808:13878 */\n tag_282\n /* \"#utility.yul\":13874:13876 */\n 0x20\n /* \"#utility.yul\":13863:13872 */\n dup4\n /* \"#utility.yul\":13859:13877 */\n add\n /* \"#utility.yul\":13850:13856 */\n dup8\n /* \"#utility.yul\":13808:13878 */\n tag_103\n jump\t// in\n tag_282:\n /* \"#utility.yul\":13888:13960 */\n tag_283\n /* \"#utility.yul\":13956:13958 */\n 0x40\n /* \"#utility.yul\":13945:13954 */\n dup4\n /* \"#utility.yul\":13941:13959 */\n add\n /* \"#utility.yul\":13932:13938 */\n dup7\n /* \"#utility.yul\":13888:13960 */\n tag_91\n jump\t// in\n tag_283:\n /* \"#utility.yul\":13970:14040 */\n tag_284\n /* \"#utility.yul\":14036:14038 */\n 0x60\n /* \"#utility.yul\":14025:14034 */\n dup4\n /* \"#utility.yul\":14021:14039 */\n add\n /* \"#utility.yul\":14012:14018 */\n dup6\n /* \"#utility.yul\":13970:14040 */\n tag_101\n jump\t// in\n tag_284:\n /* \"#utility.yul\":14088:14097 */\n dup2\n /* \"#utility.yul\":14082:14086 */\n dup2\n /* \"#utility.yul\":14078:14098 */\n sub\n /* \"#utility.yul\":14072:14075 */\n 0x80\n /* \"#utility.yul\":14061:14070 */\n dup4\n /* \"#utility.yul\":14057:14076 */\n add\n /* \"#utility.yul\":14050:14099 */\n mstore\n /* \"#utility.yul\":14116:14192 */\n tag_285\n /* \"#utility.yul\":14187:14191 */\n dup2\n /* \"#utility.yul\":14178:14184 */\n dup5\n /* \"#utility.yul\":14116:14192 */\n tag_107\n jump\t// in\n tag_285:\n /* \"#utility.yul\":14108:14192 */\n swap1\n pop\n /* \"#utility.yul\":13464:14199 */\n swap7\n swap6\n pop\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":14205:14423 */\n tag_40:\n /* \"#utility.yul\":14296:14300 */\n 0x00\n /* \"#utility.yul\":14334:14336 */\n 0x20\n /* \"#utility.yul\":14323:14332 */\n dup3\n /* \"#utility.yul\":14319:14337 */\n add\n /* \"#utility.yul\":14311:14337 */\n swap1\n pop\n /* \"#utility.yul\":14347:14416 */\n tag_287\n /* \"#utility.yul\":14413:14414 */\n 0x00\n /* \"#utility.yul\":14402:14411 */\n dup4\n /* \"#utility.yul\":14398:14415 */\n add\n /* \"#utility.yul\":14389:14395 */\n dup5\n /* \"#utility.yul\":14347:14416 */\n tag_103\n jump\t// in\n tag_287:\n /* \"#utility.yul\":14205:14423 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":14429:14572 */\n tag_108:\n /* \"#utility.yul\":14486:14491 */\n 0x00\n /* \"#utility.yul\":14517:14523 */\n dup2\n /* \"#utility.yul\":14511:14524 */\n mload\n /* \"#utility.yul\":14502:14524 */\n swap1\n pop\n /* \"#utility.yul\":14533:14566 */\n tag_289\n /* \"#utility.yul\":14560:14565 */\n dup2\n /* \"#utility.yul\":14533:14566 */\n tag_71\n jump\t// in\n tag_289:\n /* \"#utility.yul\":14429:14572 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":14578:14929 */\n tag_45:\n /* \"#utility.yul\":14648:14654 */\n 0x00\n /* \"#utility.yul\":14697:14699 */\n 0x20\n /* \"#utility.yul\":14685:14694 */\n dup3\n /* \"#utility.yul\":14676:14683 */\n dup5\n /* \"#utility.yul\":14672:14695 */\n sub\n /* \"#utility.yul\":14668:14700 */\n slt\n /* \"#utility.yul\":14665:14784 */\n iszero\n tag_291\n jumpi\n /* \"#utility.yul\":14703:14782 */\n tag_292\n tag_61\n jump\t// in\n tag_292:\n /* \"#utility.yul\":14665:14784 */\n tag_291:\n /* \"#utility.yul\":14823:14824 */\n 0x00\n /* \"#utility.yul\":14848:14912 */\n tag_293\n /* \"#utility.yul\":14904:14911 */\n dup5\n /* \"#utility.yul\":14895:14901 */\n dup3\n /* \"#utility.yul\":14884:14893 */\n dup6\n /* \"#utility.yul\":14880:14902 */\n add\n /* \"#utility.yul\":14848:14912 */\n tag_108\n jump\t// in\n tag_293:\n /* \"#utility.yul\":14838:14912 */\n swap2\n pop\n /* \"#utility.yul\":14794:14922 */\n pop\n /* \"#utility.yul\":14578:14929 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":14935:15037 */\n tag_109:\n /* \"#utility.yul\":15008:15030 */\n tag_295\n /* \"#utility.yul\":15024:15029 */\n dup2\n /* \"#utility.yul\":15008:15030 */\n tag_63\n jump\t// in\n tag_295:\n /* \"#utility.yul\":15003:15006 */\n dup3\n /* \"#utility.yul\":14996:15031 */\n mstore\n /* \"#utility.yul\":14935:15037 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":15043:15166 */\n tag_110:\n /* \"#utility.yul\":15119:15125 */\n 0x00\n /* \"#utility.yul\":15153:15158 */\n dup2\n /* \"#utility.yul\":15147:15159 */\n mload\n /* \"#utility.yul\":15137:15159 */\n swap1\n pop\n /* \"#utility.yul\":15043:15166 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":15172:15355 */\n tag_111:\n /* \"#utility.yul\":15270:15281 */\n 0x00\n /* \"#utility.yul\":15304:15310 */\n dup3\n /* \"#utility.yul\":15299:15302 */\n dup3\n /* \"#utility.yul\":15292:15311 */\n mstore\n /* \"#utility.yul\":15344:15348 */\n 0x20\n /* \"#utility.yul\":15339:15342 */\n dup3\n /* \"#utility.yul\":15335:15349 */\n add\n /* \"#utility.yul\":15320:15349 */\n swap1\n pop\n /* \"#utility.yul\":15172:15355 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":15361:15502 */\n tag_112:\n /* \"#utility.yul\":15437:15441 */\n 0x00\n /* \"#utility.yul\":15460:15463 */\n dup2\n /* \"#utility.yul\":15452:15463 */\n swap1\n pop\n /* \"#utility.yul\":15490:15494 */\n 0x20\n /* \"#utility.yul\":15485:15488 */\n dup3\n /* \"#utility.yul\":15481:15495 */\n add\n /* \"#utility.yul\":15473:15495 */\n swap1\n pop\n /* \"#utility.yul\":15361:15502 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":15508:15666 */\n tag_113:\n /* \"#utility.yul\":15581:15592 */\n 0x00\n /* \"#utility.yul\":15615:15621 */\n dup3\n /* \"#utility.yul\":15610:15613 */\n dup3\n /* \"#utility.yul\":15603:15622 */\n mstore\n /* \"#utility.yul\":15655:15659 */\n 0x20\n /* \"#utility.yul\":15650:15653 */\n dup3\n /* \"#utility.yul\":15646:15660 */\n add\n /* \"#utility.yul\":15631:15660 */\n swap1\n pop\n /* \"#utility.yul\":15508:15666 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":15672:16012 */\n tag_114:\n /* \"#utility.yul\":15748:15751 */\n 0x00\n /* \"#utility.yul\":15776:15814 */\n tag_301\n /* \"#utility.yul\":15808:15813 */\n dup3\n /* \"#utility.yul\":15776:15814 */\n tag_104\n jump\t// in\n tag_301:\n /* \"#utility.yul\":15830:15890 */\n tag_302\n /* \"#utility.yul\":15883:15889 */\n dup2\n /* \"#utility.yul\":15878:15881 */\n dup6\n /* \"#utility.yul\":15830:15890 */\n tag_113\n jump\t// in\n tag_302:\n /* \"#utility.yul\":15823:15890 */\n swap4\n pop\n /* \"#utility.yul\":15899:15951 */\n tag_303\n /* \"#utility.yul\":15944:15950 */\n dup2\n /* \"#utility.yul\":15939:15942 */\n dup6\n /* \"#utility.yul\":15932:15936 */\n 0x20\n /* \"#utility.yul\":15925:15930 */\n dup7\n /* \"#utility.yul\":15921:15937 */\n add\n /* \"#utility.yul\":15899:15951 */\n tag_106\n jump\t// in\n tag_303:\n /* \"#utility.yul\":15976:16005 */\n tag_304\n /* \"#utility.yul\":15998:16004 */\n dup2\n /* \"#utility.yul\":15976:16005 */\n tag_78\n jump\t// in\n tag_304:\n /* \"#utility.yul\":15971:15974 */\n dup5\n /* \"#utility.yul\":15967:16006 */\n add\n /* \"#utility.yul\":15960:16006 */\n swap2\n pop\n /* \"#utility.yul\":15752:16012 */\n pop\n /* \"#utility.yul\":15672:16012 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":16018:16210 */\n tag_115:\n /* \"#utility.yul\":16105:16115 */\n 0x00\n /* \"#utility.yul\":16140:16204 */\n tag_306\n /* \"#utility.yul\":16200:16203 */\n dup4\n /* \"#utility.yul\":16192:16198 */\n dup4\n /* \"#utility.yul\":16140:16204 */\n tag_114\n jump\t// in\n tag_306:\n /* \"#utility.yul\":16126:16204 */\n swap1\n pop\n /* \"#utility.yul\":16018:16210 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":16216:16338 */\n tag_116:\n /* \"#utility.yul\":16295:16299 */\n 0x00\n /* \"#utility.yul\":16327:16331 */\n 0x20\n /* \"#utility.yul\":16322:16325 */\n dup3\n /* \"#utility.yul\":16318:16332 */\n add\n /* \"#utility.yul\":16310:16332 */\n swap1\n pop\n /* \"#utility.yul\":16216:16338 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":16370:17333 */\n tag_117:\n /* \"#utility.yul\":16497:16500 */\n 0x00\n /* \"#utility.yul\":16526:16589 */\n tag_309\n /* \"#utility.yul\":16583:16588 */\n dup3\n /* \"#utility.yul\":16526:16589 */\n tag_110\n jump\t// in\n tag_309:\n /* \"#utility.yul\":16605:16690 */\n tag_310\n /* \"#utility.yul\":16683:16689 */\n dup2\n /* \"#utility.yul\":16678:16681 */\n dup6\n /* \"#utility.yul\":16605:16690 */\n tag_111\n jump\t// in\n tag_310:\n /* \"#utility.yul\":16598:16690 */\n swap4\n pop\n /* \"#utility.yul\":16716:16719 */\n dup4\n /* \"#utility.yul\":16761:16765 */\n 0x20\n /* \"#utility.yul\":16753:16759 */\n dup3\n /* \"#utility.yul\":16749:16766 */\n mul\n /* \"#utility.yul\":16744:16747 */\n dup6\n /* \"#utility.yul\":16740:16767 */\n add\n /* \"#utility.yul\":16791:16856 */\n tag_311\n /* \"#utility.yul\":16850:16855 */\n dup6\n /* \"#utility.yul\":16791:16856 */\n tag_112\n jump\t// in\n tag_311:\n /* \"#utility.yul\":16879:16886 */\n dup1\n /* \"#utility.yul\":16910:16911 */\n 0x00\n /* \"#utility.yul\":16895:17288 */\n tag_312:\n /* \"#utility.yul\":16920:16926 */\n dup6\n /* \"#utility.yul\":16917:16918 */\n dup2\n /* \"#utility.yul\":16914:16927 */\n lt\n /* \"#utility.yul\":16895:17288 */\n iszero\n tag_314\n jumpi\n /* \"#utility.yul\":16991:17000 */\n dup5\n /* \"#utility.yul\":16985:16989 */\n dup5\n /* \"#utility.yul\":16981:17001 */\n sub\n /* \"#utility.yul\":16976:16979 */\n dup10\n /* \"#utility.yul\":16969:17002 */\n mstore\n /* \"#utility.yul\":17042:17048 */\n dup2\n /* \"#utility.yul\":17036:17049 */\n mload\n /* \"#utility.yul\":17070:17152 */\n tag_315\n /* \"#utility.yul\":17147:17151 */\n dup6\n /* \"#utility.yul\":17132:17145 */\n dup3\n /* \"#utility.yul\":17070:17152 */\n tag_115\n jump\t// in\n tag_315:\n /* \"#utility.yul\":17062:17152 */\n swap5\n pop\n /* \"#utility.yul\":17175:17244 */\n tag_316\n /* \"#utility.yul\":17237:17243 */\n dup4\n /* \"#utility.yul\":17175:17244 */\n tag_116\n jump\t// in\n tag_316:\n /* \"#utility.yul\":17165:17244 */\n swap3\n pop\n /* \"#utility.yul\":17273:17277 */\n 0x20\n /* \"#utility.yul\":17268:17271 */\n dup11\n /* \"#utility.yul\":17264:17278 */\n add\n /* \"#utility.yul\":17257:17278 */\n swap10\n pop\n /* \"#utility.yul\":16955:17288 */\n pop\n /* \"#utility.yul\":16942:16943 */\n 0x01\n /* \"#utility.yul\":16939:16940 */\n dup2\n /* \"#utility.yul\":16935:16944 */\n add\n /* \"#utility.yul\":16930:16944 */\n swap1\n pop\n /* \"#utility.yul\":16895:17288 */\n jump(tag_312)\n tag_314:\n /* \"#utility.yul\":16899:16913 */\n pop\n /* \"#utility.yul\":17304:17308 */\n dup3\n /* \"#utility.yul\":17297:17308 */\n swap8\n pop\n /* \"#utility.yul\":17324:17327 */\n dup8\n /* \"#utility.yul\":17317:17327 */\n swap6\n pop\n /* \"#utility.yul\":16502:17333 */\n pop\n pop\n pop\n pop\n pop\n /* \"#utility.yul\":16370:17333 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":17419:18082 */\n tag_118:\n /* \"#utility.yul\":17544:17547 */\n 0x00\n /* \"#utility.yul\":17580:17584 */\n 0x40\n /* \"#utility.yul\":17575:17578 */\n dup4\n /* \"#utility.yul\":17571:17585 */\n add\n /* \"#utility.yul\":17670:17674 */\n 0x00\n /* \"#utility.yul\":17663:17668 */\n dup4\n /* \"#utility.yul\":17659:17675 */\n add\n /* \"#utility.yul\":17653:17676 */\n mload\n /* \"#utility.yul\":17689:17748 */\n tag_318\n /* \"#utility.yul\":17742:17746 */\n 0x00\n /* \"#utility.yul\":17737:17740 */\n dup7\n /* \"#utility.yul\":17733:17747 */\n add\n /* \"#utility.yul\":17719:17731 */\n dup3\n /* \"#utility.yul\":17689:17748 */\n tag_109\n jump\t// in\n tag_318:\n /* \"#utility.yul\":17595:17758 */\n pop\n /* \"#utility.yul\":17844:17848 */\n 0x20\n /* \"#utility.yul\":17837:17842 */\n dup4\n /* \"#utility.yul\":17833:17849 */\n add\n /* \"#utility.yul\":17827:17850 */\n mload\n /* \"#utility.yul\":17897:17900 */\n dup5\n /* \"#utility.yul\":17891:17895 */\n dup3\n /* \"#utility.yul\":17887:17901 */\n sub\n /* \"#utility.yul\":17880:17884 */\n 0x20\n /* \"#utility.yul\":17875:17878 */\n dup7\n /* \"#utility.yul\":17871:17885 */\n add\n /* \"#utility.yul\":17864:17902 */\n mstore\n /* \"#utility.yul\":17923:18044 */\n tag_319\n /* \"#utility.yul\":18039:18043 */\n dup3\n /* \"#utility.yul\":18025:18037 */\n dup3\n /* \"#utility.yul\":17923:18044 */\n tag_117\n jump\t// in\n tag_319:\n /* \"#utility.yul\":17915:18044 */\n swap2\n pop\n /* \"#utility.yul\":17768:18055 */\n pop\n /* \"#utility.yul\":18072:18076 */\n dup1\n /* \"#utility.yul\":18065:18076 */\n swap2\n pop\n /* \"#utility.yul\":17549:18082 */\n pop\n /* \"#utility.yul\":17419:18082 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":18088:18986 */\n tag_48:\n /* \"#utility.yul\":18359:18363 */\n 0x00\n /* \"#utility.yul\":18397:18400 */\n 0xa0\n /* \"#utility.yul\":18386:18395 */\n dup3\n /* \"#utility.yul\":18382:18401 */\n add\n /* \"#utility.yul\":18374:18401 */\n swap1\n pop\n /* \"#utility.yul\":18411:18478 */\n tag_321\n /* \"#utility.yul\":18475:18476 */\n 0x00\n /* \"#utility.yul\":18464:18473 */\n dup4\n /* \"#utility.yul\":18460:18477 */\n add\n /* \"#utility.yul\":18451:18457 */\n dup9\n /* \"#utility.yul\":18411:18478 */\n tag_102\n jump\t// in\n tag_321:\n /* \"#utility.yul\":18488:18558 */\n tag_322\n /* \"#utility.yul\":18554:18556 */\n 0x20\n /* \"#utility.yul\":18543:18552 */\n dup4\n /* \"#utility.yul\":18539:18557 */\n add\n /* \"#utility.yul\":18530:18536 */\n dup8\n /* \"#utility.yul\":18488:18558 */\n tag_103\n jump\t// in\n tag_322:\n /* \"#utility.yul\":18605:18614 */\n dup2\n /* \"#utility.yul\":18599:18603 */\n dup2\n /* \"#utility.yul\":18595:18615 */\n sub\n /* \"#utility.yul\":18590:18592 */\n 0x40\n /* \"#utility.yul\":18579:18588 */\n dup4\n /* \"#utility.yul\":18575:18593 */\n add\n /* \"#utility.yul\":18568:18616 */\n mstore\n /* \"#utility.yul\":18633:18747 */\n tag_323\n /* \"#utility.yul\":18742:18746 */\n dup2\n /* \"#utility.yul\":18733:18739 */\n dup7\n /* \"#utility.yul\":18633:18747 */\n tag_118\n jump\t// in\n tag_323:\n /* \"#utility.yul\":18625:18747 */\n swap1\n pop\n /* \"#utility.yul\":18757:18827 */\n tag_324\n /* \"#utility.yul\":18823:18825 */\n 0x60\n /* \"#utility.yul\":18812:18821 */\n dup4\n /* \"#utility.yul\":18808:18826 */\n add\n /* \"#utility.yul\":18799:18805 */\n dup6\n /* \"#utility.yul\":18757:18827 */\n tag_101\n jump\t// in\n tag_324:\n /* \"#utility.yul\":18875:18884 */\n dup2\n /* \"#utility.yul\":18869:18873 */\n dup2\n /* \"#utility.yul\":18865:18885 */\n sub\n /* \"#utility.yul\":18859:18862 */\n 0x80\n /* \"#utility.yul\":18848:18857 */\n dup4\n /* \"#utility.yul\":18844:18863 */\n add\n /* \"#utility.yul\":18837:18886 */\n mstore\n /* \"#utility.yul\":18903:18979 */\n tag_325\n /* \"#utility.yul\":18974:18978 */\n dup2\n /* \"#utility.yul\":18965:18971 */\n dup5\n /* \"#utility.yul\":18903:18979 */\n tag_107\n jump\t// in\n tag_325:\n /* \"#utility.yul\":18895:18979 */\n swap1\n pop\n /* \"#utility.yul\":18088:18986 */\n swap7\n swap6\n pop\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":18992:19377 */\n tag_54:\n /* \"#utility.yul\":19141:19145 */\n 0x00\n /* \"#utility.yul\":19179:19181 */\n 0x20\n /* \"#utility.yul\":19168:19177 */\n dup3\n /* \"#utility.yul\":19164:19182 */\n add\n /* \"#utility.yul\":19156:19182 */\n swap1\n pop\n /* \"#utility.yul\":19228:19237 */\n dup2\n /* \"#utility.yul\":19222:19226 */\n dup2\n /* \"#utility.yul\":19218:19238 */\n sub\n /* \"#utility.yul\":19214:19215 */\n 0x00\n /* \"#utility.yul\":19203:19212 */\n dup4\n /* \"#utility.yul\":19199:19216 */\n add\n /* \"#utility.yul\":19192:19239 */\n mstore\n /* \"#utility.yul\":19256:19370 */\n tag_327\n /* \"#utility.yul\":19365:19369 */\n dup2\n /* \"#utility.yul\":19356:19362 */\n dup5\n /* \"#utility.yul\":19256:19370 */\n tag_118\n jump\t// in\n tag_327:\n /* \"#utility.yul\":19248:19370 */\n swap1\n pop\n /* \"#utility.yul\":18992:19377 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":19383:19505 */\n tag_119:\n /* \"#utility.yul\":19456:19480 */\n tag_329\n /* \"#utility.yul\":19474:19479 */\n dup2\n /* \"#utility.yul\":19456:19480 */\n tag_99\n jump\t// in\n tag_329:\n /* \"#utility.yul\":19449:19454 */\n dup2\n /* \"#utility.yul\":19446:19481 */\n eq\n /* \"#utility.yul\":19436:19499 */\n tag_330\n jumpi\n /* \"#utility.yul\":19495:19496 */\n 0x00\n /* \"#utility.yul\":19492:19493 */\n dup1\n /* \"#utility.yul\":19485:19497 */\n revert\n /* \"#utility.yul\":19436:19499 */\n tag_330:\n /* \"#utility.yul\":19383:19505 */\n pop\n jump\t// out\n /* \"#utility.yul\":19511:19654 */\n tag_120:\n /* \"#utility.yul\":19568:19573 */\n 0x00\n /* \"#utility.yul\":19599:19605 */\n dup2\n /* \"#utility.yul\":19593:19606 */\n mload\n /* \"#utility.yul\":19584:19606 */\n swap1\n pop\n /* \"#utility.yul\":19615:19648 */\n tag_332\n /* \"#utility.yul\":19642:19647 */\n dup2\n /* \"#utility.yul\":19615:19648 */\n tag_119\n jump\t// in\n tag_332:\n /* \"#utility.yul\":19511:19654 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":19660:19801 */\n tag_121:\n /* \"#utility.yul\":19716:19721 */\n 0x00\n /* \"#utility.yul\":19747:19753 */\n dup2\n /* \"#utility.yul\":19741:19754 */\n mload\n /* \"#utility.yul\":19732:19754 */\n swap1\n pop\n /* \"#utility.yul\":19763:19795 */\n tag_334\n /* \"#utility.yul\":19789:19794 */\n dup2\n /* \"#utility.yul\":19763:19795 */\n tag_74\n jump\t// in\n tag_334:\n /* \"#utility.yul\":19660:19801 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":19807:20312 */\n tag_59:\n /* \"#utility.yul\":19885:19891 */\n 0x00\n /* \"#utility.yul\":19893:19899 */\n dup1\n /* \"#utility.yul\":19942:19944 */\n 0x40\n /* \"#utility.yul\":19930:19939 */\n dup4\n /* \"#utility.yul\":19921:19928 */\n dup6\n /* \"#utility.yul\":19917:19940 */\n sub\n /* \"#utility.yul\":19913:19945 */\n slt\n /* \"#utility.yul\":19910:20029 */\n iszero\n tag_336\n jumpi\n /* \"#utility.yul\":19948:20027 */\n tag_337\n tag_61\n jump\t// in\n tag_337:\n /* \"#utility.yul\":19910:20029 */\n tag_336:\n /* \"#utility.yul\":20068:20069 */\n 0x00\n /* \"#utility.yul\":20093:20157 */\n tag_338\n /* \"#utility.yul\":20149:20156 */\n dup6\n /* \"#utility.yul\":20140:20146 */\n dup3\n /* \"#utility.yul\":20129:20138 */\n dup7\n /* \"#utility.yul\":20125:20147 */\n add\n /* \"#utility.yul\":20093:20157 */\n tag_120\n jump\t// in\n tag_338:\n /* \"#utility.yul\":20083:20157 */\n swap3\n pop\n /* \"#utility.yul\":20039:20167 */\n pop\n /* \"#utility.yul\":20206:20208 */\n 0x20\n /* \"#utility.yul\":20232:20295 */\n tag_339\n /* \"#utility.yul\":20287:20294 */\n dup6\n /* \"#utility.yul\":20278:20284 */\n dup3\n /* \"#utility.yul\":20267:20276 */\n dup7\n /* \"#utility.yul\":20263:20285 */\n add\n /* \"#utility.yul\":20232:20295 */\n tag_121\n jump\t// in\n tag_339:\n /* \"#utility.yul\":20222:20295 */\n swap2\n pop\n /* \"#utility.yul\":20177:20305 */\n pop\n /* \"#utility.yul\":19807:20312 */\n swap3\n pop\n swap3\n swap1\n pop\n jump\t// out\n\n auxdata: 0xa2646970667358221220f4c38984c6cc29dbcc2eaba10fd373f554e43032ce961ef414eb2edc3748591664736f6c63430008090033\n}\n", + "assembly": " /* \"main.sol\":2664:4346 contract XcmTransactorInstance is XcmTransactor {... */\n mstore(0x40, 0x80)\n /* \"main.sol\":2839:2881 0x0000000000000000000000000000000000000806 */\n 0x0806\n /* \"main.sol\":2788:2882 XcmTransactor public xcmtransactor = XcmTransactor(0x0000000000000000000000000000000000000806) */\n 0x00\n dup1\n 0x0100\n exp\n dup2\n sload\n dup2\n 0xffffffffffffffffffffffffffffffffffffffff\n mul\n not\n and\n swap1\n dup4\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n mul\n or\n swap1\n sstore\n pop\n /* \"main.sol\":2664:4346 contract XcmTransactorInstance is XcmTransactor {... */\n callvalue\n dup1\n iszero\n tag_1\n jumpi\n 0x00\n dup1\n revert\ntag_1:\n pop\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x00\n codecopy\n 0x00\n return\nstop\n\nsub_0: assembly {\n /* \"main.sol\":2664:4346 contract XcmTransactorInstance is XcmTransactor {... */\n mstore(0x40, 0x80)\n callvalue\n dup1\n iszero\n tag_1\n jumpi\n 0x00\n dup1\n revert\n tag_1:\n pop\n jumpi(tag_2, lt(calldatasize, 0x04))\n shr(0xe0, calldataload(0x00))\n dup1\n 0x267d4062\n eq\n tag_3\n jumpi\n dup1\n 0x61fc548f\n eq\n tag_4\n jumpi\n dup1\n 0x71b0edfa\n eq\n tag_5\n jumpi\n dup1\n 0x9f89f03e\n eq\n tag_6\n jumpi\n dup1\n 0xf87f493f\n eq\n tag_7\n jumpi\n tag_2:\n 0x00\n dup1\n revert\n /* \"main.sol\":3910:4340 function transact_through_derivative(... */\n tag_3:\n tag_8\n 0x04\n dup1\n calldatasize\n sub\n dup2\n add\n swap1\n tag_9\n swap2\n swap1\n tag_10\n jump\t// in\n tag_9:\n tag_11\n jump\t// in\n tag_8:\n stop\n /* \"main.sol\":2788:2882 XcmTransactor public xcmtransactor = XcmTransactor(0x0000000000000000000000000000000000000806) */\n tag_4:\n tag_12\n tag_13\n jump\t// in\n tag_12:\n mload(0x40)\n tag_14\n swap2\n swap1\n tag_15\n jump\t// in\n tag_14:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"main.sol\":2893:3118 function index_to_account(uint16 index) external view override returns(address) {... */\n tag_5:\n tag_16\n 0x04\n dup1\n calldatasize\n sub\n dup2\n add\n swap1\n tag_17\n swap2\n swap1\n tag_18\n jump\t// in\n tag_17:\n tag_19\n jump\t// in\n tag_16:\n mload(0x40)\n tag_20\n swap2\n swap1\n tag_21\n jump\t// in\n tag_20:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"main.sol\":3425:3892 function transact_through_derivative_multilocation(... */\n tag_6:\n tag_22\n 0x04\n dup1\n calldatasize\n sub\n dup2\n add\n swap1\n tag_23\n swap2\n swap1\n tag_24\n jump\t// in\n tag_23:\n tag_25\n jump\t// in\n tag_22:\n stop\n /* \"main.sol\":3128:3415 function transact_info(... */\n tag_7:\n tag_26\n 0x04\n dup1\n calldatasize\n sub\n dup2\n add\n swap1\n tag_27\n swap2\n swap1\n tag_28\n jump\t// in\n tag_27:\n tag_29\n jump\t// in\n tag_26:\n mload(0x40)\n tag_30\n swap4\n swap3\n swap2\n swap1\n tag_31\n jump\t// in\n tag_30:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"main.sol\":3910:4340 function transact_through_derivative(... */\n tag_11:\n /* \"main.sol\":4142:4155 xcmtransactor */\n 0x00\n dup1\n sload\n swap1\n 0x0100\n exp\n swap1\n div\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"main.sol\":4142:4183 xcmtransactor.transact_through_derivative */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0x267d4062\n /* \"main.sol\":4201:4211 transactor */\n dup7\n /* \"main.sol\":4229:4234 index */\n dup7\n /* \"main.sol\":4252:4263 currency_id */\n dup7\n /* \"main.sol\":4281:4287 weight */\n dup7\n /* \"main.sol\":4305:4315 inner_call */\n dup7\n /* \"main.sol\":4142:4329 xcmtransactor.transact_through_derivative(... */\n mload(0x40)\n dup7\n 0xffffffff\n and\n 0xe0\n shl\n dup2\n mstore\n 0x04\n add\n tag_33\n swap6\n swap5\n swap4\n swap3\n swap2\n swap1\n tag_34\n jump\t// in\n tag_33:\n 0x00\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n 0x00\n dup8\n dup1\n extcodesize\n iszero\n dup1\n iszero\n tag_35\n jumpi\n 0x00\n dup1\n revert\n tag_35:\n pop\n gas\n call\n iszero\n dup1\n iszero\n tag_37\n jumpi\n returndatasize\n 0x00\n dup1\n returndatacopy\n revert(0x00, returndatasize)\n tag_37:\n pop\n pop\n pop\n pop\n /* \"main.sol\":3910:4340 function transact_through_derivative(... */\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"main.sol\":2788:2882 XcmTransactor public xcmtransactor = XcmTransactor(0x0000000000000000000000000000000000000806) */\n tag_13:\n 0x00\n dup1\n sload\n swap1\n 0x0100\n exp\n swap1\n div\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n dup2\n jump\t// out\n /* \"main.sol\":2893:3118 function index_to_account(uint16 index) external view override returns(address) {... */\n tag_19:\n /* \"main.sol\":2964:2971 address */\n 0x00\n /* \"main.sol\":3070:3083 xcmtransactor */\n dup1\n 0x00\n swap1\n sload\n swap1\n 0x0100\n exp\n swap1\n div\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"main.sol\":3070:3100 xcmtransactor.index_to_account */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0x71b0edfa\n /* \"main.sol\":3101:3106 index */\n dup4\n /* \"main.sol\":3070:3107 xcmtransactor.index_to_account(index) */\n mload(0x40)\n dup3\n 0xffffffff\n and\n 0xe0\n shl\n dup2\n mstore\n 0x04\n add\n tag_39\n swap2\n swap1\n tag_40\n jump\t// in\n tag_39:\n 0x20\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n dup7\n gas\n staticcall\n iszero\n dup1\n iszero\n tag_42\n jumpi\n returndatasize\n 0x00\n dup1\n returndatacopy\n revert(0x00, returndatasize)\n tag_42:\n pop\n pop\n pop\n pop\n mload(0x40)\n returndatasize\n not(0x1f)\n 0x1f\n dup3\n add\n and\n dup3\n add\n dup1\n 0x40\n mstore\n pop\n dup2\n add\n swap1\n tag_43\n swap2\n swap1\n tag_44\n jump\t// in\n tag_43:\n /* \"main.sol\":3063:3107 return xcmtransactor.index_to_account(index) */\n swap1\n pop\n /* \"main.sol\":2893:3118 function index_to_account(uint16 index) external view override returns(address) {... */\n swap2\n swap1\n pop\n jump\t// out\n /* \"main.sol\":3425:3892 function transact_through_derivative_multilocation(... */\n tag_25:\n /* \"main.sol\":3682:3695 xcmtransactor */\n 0x00\n dup1\n sload\n swap1\n 0x0100\n exp\n swap1\n div\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"main.sol\":3682:3737 xcmtransactor.transact_through_derivative_multilocation */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0x9f89f03e\n /* \"main.sol\":3755:3765 transactor */\n dup7\n /* \"main.sol\":3783:3788 index */\n dup7\n /* \"main.sol\":3806:3815 fee_asset */\n dup7\n /* \"main.sol\":3833:3839 weight */\n dup7\n /* \"main.sol\":3857:3867 inner_call */\n dup7\n /* \"main.sol\":3682:3881 xcmtransactor.transact_through_derivative_multilocation(... */\n mload(0x40)\n dup7\n 0xffffffff\n and\n 0xe0\n shl\n dup2\n mstore\n 0x04\n add\n tag_46\n swap6\n swap5\n swap4\n swap3\n swap2\n swap1\n tag_47\n jump\t// in\n tag_46:\n 0x00\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n 0x00\n dup8\n dup1\n extcodesize\n iszero\n dup1\n iszero\n tag_48\n jumpi\n 0x00\n dup1\n revert\n tag_48:\n pop\n gas\n call\n iszero\n dup1\n iszero\n tag_50\n jumpi\n returndatasize\n 0x00\n dup1\n returndatacopy\n revert(0x00, returndatasize)\n tag_50:\n pop\n pop\n pop\n pop\n /* \"main.sol\":3425:3892 function transact_through_derivative_multilocation(... */\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"main.sol\":3128:3415 function transact_info(... */\n tag_29:\n /* \"main.sol\":3240:3246 uint64 */\n 0x00\n /* \"main.sol\":3248:3255 uint256 */\n dup1\n /* \"main.sol\":3257:3263 uint64 */\n 0x00\n /* \"main.sol\":3362:3375 xcmtransactor */\n dup1\n 0x00\n swap1\n sload\n swap1\n 0x0100\n exp\n swap1\n div\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"main.sol\":3362:3389 xcmtransactor.transact_info */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0xf87f493f\n /* \"main.sol\":3390:3403 multilocation */\n dup6\n /* \"main.sol\":3362:3404 xcmtransactor.transact_info(multilocation) */\n mload(0x40)\n dup3\n 0xffffffff\n and\n 0xe0\n shl\n dup2\n mstore\n 0x04\n add\n tag_52\n swap2\n swap1\n tag_53\n jump\t// in\n tag_52:\n 0x60\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n dup7\n gas\n staticcall\n iszero\n dup1\n iszero\n tag_55\n jumpi\n returndatasize\n 0x00\n dup1\n returndatacopy\n revert(0x00, returndatasize)\n tag_55:\n pop\n pop\n pop\n pop\n mload(0x40)\n returndatasize\n not(0x1f)\n 0x1f\n dup3\n add\n and\n dup3\n add\n dup1\n 0x40\n mstore\n pop\n dup2\n add\n swap1\n tag_56\n swap2\n swap1\n tag_57\n jump\t// in\n tag_56:\n /* \"main.sol\":3355:3404 return xcmtransactor.transact_info(multilocation) */\n swap3\n pop\n swap3\n pop\n swap3\n pop\n /* \"main.sol\":3128:3415 function transact_info(... */\n swap2\n swap4\n swap1\n swap3\n pop\n jump\t// out\n /* \"#utility.yul\":7:82 */\n tag_58:\n /* \"#utility.yul\":40:46 */\n 0x00\n /* \"#utility.yul\":73:75 */\n 0x40\n /* \"#utility.yul\":67:76 */\n mload\n /* \"#utility.yul\":57:76 */\n swap1\n pop\n /* \"#utility.yul\":7:82 */\n swap1\n jump\t// out\n /* \"#utility.yul\":88:205 */\n tag_59:\n /* \"#utility.yul\":197:198 */\n 0x00\n /* \"#utility.yul\":194:195 */\n dup1\n /* \"#utility.yul\":187:199 */\n revert\n /* \"#utility.yul\":211:328 */\n tag_60:\n /* \"#utility.yul\":320:321 */\n 0x00\n /* \"#utility.yul\":317:318 */\n dup1\n /* \"#utility.yul\":310:322 */\n revert\n /* \"#utility.yul\":334:420 */\n tag_61:\n /* \"#utility.yul\":369:376 */\n 0x00\n /* \"#utility.yul\":409:413 */\n 0xff\n /* \"#utility.yul\":402:407 */\n dup3\n /* \"#utility.yul\":398:414 */\n and\n /* \"#utility.yul\":387:414 */\n swap1\n pop\n /* \"#utility.yul\":334:420 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":426:544 */\n tag_62:\n /* \"#utility.yul\":497:519 */\n tag_126\n /* \"#utility.yul\":513:518 */\n dup2\n /* \"#utility.yul\":497:519 */\n tag_61\n jump\t// in\n tag_126:\n /* \"#utility.yul\":490:495 */\n dup2\n /* \"#utility.yul\":487:520 */\n eq\n /* \"#utility.yul\":477:538 */\n tag_127\n jumpi\n /* \"#utility.yul\":534:535 */\n 0x00\n /* \"#utility.yul\":531:532 */\n dup1\n /* \"#utility.yul\":524:536 */\n revert\n /* \"#utility.yul\":477:538 */\n tag_127:\n /* \"#utility.yul\":426:544 */\n pop\n jump\t// out\n /* \"#utility.yul\":550:685 */\n tag_63:\n /* \"#utility.yul\":594:599 */\n 0x00\n /* \"#utility.yul\":632:638 */\n dup2\n /* \"#utility.yul\":619:639 */\n calldataload\n /* \"#utility.yul\":610:639 */\n swap1\n pop\n /* \"#utility.yul\":648:679 */\n tag_129\n /* \"#utility.yul\":673:678 */\n dup2\n /* \"#utility.yul\":648:679 */\n tag_62\n jump\t// in\n tag_129:\n /* \"#utility.yul\":550:685 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":691:780 */\n tag_64:\n /* \"#utility.yul\":727:734 */\n 0x00\n /* \"#utility.yul\":767:773 */\n 0xffff\n /* \"#utility.yul\":760:765 */\n dup3\n /* \"#utility.yul\":756:774 */\n and\n /* \"#utility.yul\":745:774 */\n swap1\n pop\n /* \"#utility.yul\":691:780 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":786:906 */\n tag_65:\n /* \"#utility.yul\":858:881 */\n tag_132\n /* \"#utility.yul\":875:880 */\n dup2\n /* \"#utility.yul\":858:881 */\n tag_64\n jump\t// in\n tag_132:\n /* \"#utility.yul\":851:856 */\n dup2\n /* \"#utility.yul\":848:882 */\n eq\n /* \"#utility.yul\":838:900 */\n tag_133\n jumpi\n /* \"#utility.yul\":896:897 */\n 0x00\n /* \"#utility.yul\":893:894 */\n dup1\n /* \"#utility.yul\":886:898 */\n revert\n /* \"#utility.yul\":838:900 */\n tag_133:\n /* \"#utility.yul\":786:906 */\n pop\n jump\t// out\n /* \"#utility.yul\":912:1049 */\n tag_66:\n /* \"#utility.yul\":957:962 */\n 0x00\n /* \"#utility.yul\":995:1001 */\n dup2\n /* \"#utility.yul\":982:1002 */\n calldataload\n /* \"#utility.yul\":973:1002 */\n swap1\n pop\n /* \"#utility.yul\":1011:1043 */\n tag_135\n /* \"#utility.yul\":1037:1042 */\n dup2\n /* \"#utility.yul\":1011:1043 */\n tag_65\n jump\t// in\n tag_135:\n /* \"#utility.yul\":912:1049 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":1055:1181 */\n tag_67:\n /* \"#utility.yul\":1092:1099 */\n 0x00\n /* \"#utility.yul\":1132:1174 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"#utility.yul\":1125:1130 */\n dup3\n /* \"#utility.yul\":1121:1175 */\n and\n /* \"#utility.yul\":1110:1175 */\n swap1\n pop\n /* \"#utility.yul\":1055:1181 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":1187:1283 */\n tag_68:\n /* \"#utility.yul\":1224:1231 */\n 0x00\n /* \"#utility.yul\":1253:1277 */\n tag_138\n /* \"#utility.yul\":1271:1276 */\n dup3\n /* \"#utility.yul\":1253:1277 */\n tag_67\n jump\t// in\n tag_138:\n /* \"#utility.yul\":1242:1277 */\n swap1\n pop\n /* \"#utility.yul\":1187:1283 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":1289:1411 */\n tag_69:\n /* \"#utility.yul\":1362:1386 */\n tag_140\n /* \"#utility.yul\":1380:1385 */\n dup2\n /* \"#utility.yul\":1362:1386 */\n tag_68\n jump\t// in\n tag_140:\n /* \"#utility.yul\":1355:1360 */\n dup2\n /* \"#utility.yul\":1352:1387 */\n eq\n /* \"#utility.yul\":1342:1405 */\n tag_141\n jumpi\n /* \"#utility.yul\":1401:1402 */\n 0x00\n /* \"#utility.yul\":1398:1399 */\n dup1\n /* \"#utility.yul\":1391:1403 */\n revert\n /* \"#utility.yul\":1342:1405 */\n tag_141:\n /* \"#utility.yul\":1289:1411 */\n pop\n jump\t// out\n /* \"#utility.yul\":1417:1556 */\n tag_70:\n /* \"#utility.yul\":1463:1468 */\n 0x00\n /* \"#utility.yul\":1501:1507 */\n dup2\n /* \"#utility.yul\":1488:1508 */\n calldataload\n /* \"#utility.yul\":1479:1508 */\n swap1\n pop\n /* \"#utility.yul\":1517:1550 */\n tag_143\n /* \"#utility.yul\":1544:1549 */\n dup2\n /* \"#utility.yul\":1517:1550 */\n tag_69\n jump\t// in\n tag_143:\n /* \"#utility.yul\":1417:1556 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":1562:1663 */\n tag_71:\n /* \"#utility.yul\":1598:1605 */\n 0x00\n /* \"#utility.yul\":1638:1656 */\n 0xffffffffffffffff\n /* \"#utility.yul\":1631:1636 */\n dup3\n /* \"#utility.yul\":1627:1657 */\n and\n /* \"#utility.yul\":1616:1657 */\n swap1\n pop\n /* \"#utility.yul\":1562:1663 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":1669:1789 */\n tag_72:\n /* \"#utility.yul\":1741:1764 */\n tag_146\n /* \"#utility.yul\":1758:1763 */\n dup2\n /* \"#utility.yul\":1741:1764 */\n tag_71\n jump\t// in\n tag_146:\n /* \"#utility.yul\":1734:1739 */\n dup2\n /* \"#utility.yul\":1731:1765 */\n eq\n /* \"#utility.yul\":1721:1783 */\n tag_147\n jumpi\n /* \"#utility.yul\":1779:1780 */\n 0x00\n /* \"#utility.yul\":1776:1777 */\n dup1\n /* \"#utility.yul\":1769:1781 */\n revert\n /* \"#utility.yul\":1721:1783 */\n tag_147:\n /* \"#utility.yul\":1669:1789 */\n pop\n jump\t// out\n /* \"#utility.yul\":1795:1932 */\n tag_73:\n /* \"#utility.yul\":1840:1845 */\n 0x00\n /* \"#utility.yul\":1878:1884 */\n dup2\n /* \"#utility.yul\":1865:1885 */\n calldataload\n /* \"#utility.yul\":1856:1885 */\n swap1\n pop\n /* \"#utility.yul\":1894:1926 */\n tag_149\n /* \"#utility.yul\":1920:1925 */\n dup2\n /* \"#utility.yul\":1894:1926 */\n tag_72\n jump\t// in\n tag_149:\n /* \"#utility.yul\":1795:1932 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":1938:2055 */\n tag_74:\n /* \"#utility.yul\":2047:2048 */\n 0x00\n /* \"#utility.yul\":2044:2045 */\n dup1\n /* \"#utility.yul\":2037:2049 */\n revert\n /* \"#utility.yul\":2061:2178 */\n tag_75:\n /* \"#utility.yul\":2170:2171 */\n 0x00\n /* \"#utility.yul\":2167:2168 */\n dup1\n /* \"#utility.yul\":2160:2172 */\n revert\n /* \"#utility.yul\":2184:2286 */\n tag_76:\n /* \"#utility.yul\":2225:2231 */\n 0x00\n /* \"#utility.yul\":2276:2278 */\n 0x1f\n /* \"#utility.yul\":2272:2279 */\n not\n /* \"#utility.yul\":2267:2269 */\n 0x1f\n /* \"#utility.yul\":2260:2265 */\n dup4\n /* \"#utility.yul\":2256:2270 */\n add\n /* \"#utility.yul\":2252:2280 */\n and\n /* \"#utility.yul\":2242:2280 */\n swap1\n pop\n /* \"#utility.yul\":2184:2286 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":2292:2472 */\n tag_77:\n /* \"#utility.yul\":2340:2417 */\n 0x4e487b7100000000000000000000000000000000000000000000000000000000\n /* \"#utility.yul\":2337:2338 */\n 0x00\n /* \"#utility.yul\":2330:2418 */\n mstore\n /* \"#utility.yul\":2437:2441 */\n 0x41\n /* \"#utility.yul\":2434:2435 */\n 0x04\n /* \"#utility.yul\":2427:2442 */\n mstore\n /* \"#utility.yul\":2461:2465 */\n 0x24\n /* \"#utility.yul\":2458:2459 */\n 0x00\n /* \"#utility.yul\":2451:2466 */\n revert\n /* \"#utility.yul\":2478:2759 */\n tag_78:\n /* \"#utility.yul\":2561:2588 */\n tag_155\n /* \"#utility.yul\":2583:2587 */\n dup3\n /* \"#utility.yul\":2561:2588 */\n tag_76\n jump\t// in\n tag_155:\n /* \"#utility.yul\":2553:2559 */\n dup2\n /* \"#utility.yul\":2549:2589 */\n add\n /* \"#utility.yul\":2691:2697 */\n dup2\n /* \"#utility.yul\":2679:2689 */\n dup2\n /* \"#utility.yul\":2676:2698 */\n lt\n /* \"#utility.yul\":2655:2673 */\n 0xffffffffffffffff\n /* \"#utility.yul\":2643:2653 */\n dup3\n /* \"#utility.yul\":2640:2674 */\n gt\n /* \"#utility.yul\":2637:2699 */\n or\n /* \"#utility.yul\":2634:2722 */\n iszero\n tag_156\n jumpi\n /* \"#utility.yul\":2702:2720 */\n tag_157\n tag_77\n jump\t// in\n tag_157:\n /* \"#utility.yul\":2634:2722 */\n tag_156:\n /* \"#utility.yul\":2742:2752 */\n dup1\n /* \"#utility.yul\":2738:2740 */\n 0x40\n /* \"#utility.yul\":2731:2753 */\n mstore\n /* \"#utility.yul\":2521:2759 */\n pop\n /* \"#utility.yul\":2478:2759 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":2765:2894 */\n tag_79:\n /* \"#utility.yul\":2799:2805 */\n 0x00\n /* \"#utility.yul\":2826:2846 */\n tag_159\n tag_58\n jump\t// in\n tag_159:\n /* \"#utility.yul\":2816:2846 */\n swap1\n pop\n /* \"#utility.yul\":2855:2888 */\n tag_160\n /* \"#utility.yul\":2883:2887 */\n dup3\n /* \"#utility.yul\":2875:2881 */\n dup3\n /* \"#utility.yul\":2855:2888 */\n tag_78\n jump\t// in\n tag_160:\n /* \"#utility.yul\":2765:2894 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":2900:3207 */\n tag_80:\n /* \"#utility.yul\":2961:2965 */\n 0x00\n /* \"#utility.yul\":3051:3069 */\n 0xffffffffffffffff\n /* \"#utility.yul\":3043:3049 */\n dup3\n /* \"#utility.yul\":3040:3070 */\n gt\n /* \"#utility.yul\":3037:3093 */\n iszero\n tag_162\n jumpi\n /* \"#utility.yul\":3073:3091 */\n tag_163\n tag_77\n jump\t// in\n tag_163:\n /* \"#utility.yul\":3037:3093 */\n tag_162:\n /* \"#utility.yul\":3111:3140 */\n tag_164\n /* \"#utility.yul\":3133:3139 */\n dup3\n /* \"#utility.yul\":3111:3140 */\n tag_76\n jump\t// in\n tag_164:\n /* \"#utility.yul\":3103:3140 */\n swap1\n pop\n /* \"#utility.yul\":3195:3199 */\n 0x20\n /* \"#utility.yul\":3189:3193 */\n dup2\n /* \"#utility.yul\":3185:3200 */\n add\n /* \"#utility.yul\":3177:3200 */\n swap1\n pop\n /* \"#utility.yul\":2900:3207 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":3213:3367 */\n tag_81:\n /* \"#utility.yul\":3297:3303 */\n dup3\n /* \"#utility.yul\":3292:3295 */\n dup2\n /* \"#utility.yul\":3287:3290 */\n dup4\n /* \"#utility.yul\":3274:3304 */\n calldatacopy\n /* \"#utility.yul\":3359:3360 */\n 0x00\n /* \"#utility.yul\":3350:3356 */\n dup4\n /* \"#utility.yul\":3345:3348 */\n dup4\n /* \"#utility.yul\":3341:3357 */\n add\n /* \"#utility.yul\":3334:3361 */\n mstore\n /* \"#utility.yul\":3213:3367 */\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":3373:3783 */\n tag_82:\n /* \"#utility.yul\":3450:3455 */\n 0x00\n /* \"#utility.yul\":3475:3540 */\n tag_167\n /* \"#utility.yul\":3491:3539 */\n tag_168\n /* \"#utility.yul\":3532:3538 */\n dup5\n /* \"#utility.yul\":3491:3539 */\n tag_80\n jump\t// in\n tag_168:\n /* \"#utility.yul\":3475:3540 */\n tag_79\n jump\t// in\n tag_167:\n /* \"#utility.yul\":3466:3540 */\n swap1\n pop\n /* \"#utility.yul\":3563:3569 */\n dup3\n /* \"#utility.yul\":3556:3561 */\n dup2\n /* \"#utility.yul\":3549:3570 */\n mstore\n /* \"#utility.yul\":3601:3605 */\n 0x20\n /* \"#utility.yul\":3594:3599 */\n dup2\n /* \"#utility.yul\":3590:3606 */\n add\n /* \"#utility.yul\":3639:3642 */\n dup5\n /* \"#utility.yul\":3630:3636 */\n dup5\n /* \"#utility.yul\":3625:3628 */\n dup5\n /* \"#utility.yul\":3621:3637 */\n add\n /* \"#utility.yul\":3618:3643 */\n gt\n /* \"#utility.yul\":3615:3727 */\n iszero\n tag_169\n jumpi\n /* \"#utility.yul\":3646:3725 */\n tag_170\n tag_75\n jump\t// in\n tag_170:\n /* \"#utility.yul\":3615:3727 */\n tag_169:\n /* \"#utility.yul\":3736:3777 */\n tag_171\n /* \"#utility.yul\":3770:3776 */\n dup5\n /* \"#utility.yul\":3765:3768 */\n dup3\n /* \"#utility.yul\":3760:3763 */\n dup6\n /* \"#utility.yul\":3736:3777 */\n tag_81\n jump\t// in\n tag_171:\n /* \"#utility.yul\":3456:3783 */\n pop\n /* \"#utility.yul\":3373:3783 */\n swap4\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":3802:4140 */\n tag_83:\n /* \"#utility.yul\":3857:3862 */\n 0x00\n /* \"#utility.yul\":3906:3909 */\n dup3\n /* \"#utility.yul\":3899:3903 */\n 0x1f\n /* \"#utility.yul\":3891:3897 */\n dup4\n /* \"#utility.yul\":3887:3904 */\n add\n /* \"#utility.yul\":3883:3910 */\n slt\n /* \"#utility.yul\":3873:3995 */\n tag_173\n jumpi\n /* \"#utility.yul\":3914:3993 */\n tag_174\n tag_74\n jump\t// in\n tag_174:\n /* \"#utility.yul\":3873:3995 */\n tag_173:\n /* \"#utility.yul\":4031:4037 */\n dup2\n /* \"#utility.yul\":4018:4038 */\n calldataload\n /* \"#utility.yul\":4056:4134 */\n tag_175\n /* \"#utility.yul\":4130:4133 */\n dup5\n /* \"#utility.yul\":4122:4128 */\n dup3\n /* \"#utility.yul\":4115:4119 */\n 0x20\n /* \"#utility.yul\":4107:4113 */\n dup7\n /* \"#utility.yul\":4103:4120 */\n add\n /* \"#utility.yul\":4056:4134 */\n tag_82\n jump\t// in\n tag_175:\n /* \"#utility.yul\":4047:4134 */\n swap2\n pop\n /* \"#utility.yul\":3863:4140 */\n pop\n /* \"#utility.yul\":3802:4140 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":4146:5227 */\n tag_10:\n /* \"#utility.yul\":4246:4252 */\n 0x00\n /* \"#utility.yul\":4254:4260 */\n dup1\n /* \"#utility.yul\":4262:4268 */\n 0x00\n /* \"#utility.yul\":4270:4276 */\n dup1\n /* \"#utility.yul\":4278:4284 */\n 0x00\n /* \"#utility.yul\":4327:4330 */\n 0xa0\n /* \"#utility.yul\":4315:4324 */\n dup7\n /* \"#utility.yul\":4306:4313 */\n dup9\n /* \"#utility.yul\":4302:4325 */\n sub\n /* \"#utility.yul\":4298:4331 */\n slt\n /* \"#utility.yul\":4295:4415 */\n iszero\n tag_177\n jumpi\n /* \"#utility.yul\":4334:4413 */\n tag_178\n tag_59\n jump\t// in\n tag_178:\n /* \"#utility.yul\":4295:4415 */\n tag_177:\n /* \"#utility.yul\":4454:4455 */\n 0x00\n /* \"#utility.yul\":4479:4530 */\n tag_179\n /* \"#utility.yul\":4522:4529 */\n dup9\n /* \"#utility.yul\":4513:4519 */\n dup3\n /* \"#utility.yul\":4502:4511 */\n dup10\n /* \"#utility.yul\":4498:4520 */\n add\n /* \"#utility.yul\":4479:4530 */\n tag_63\n jump\t// in\n tag_179:\n /* \"#utility.yul\":4469:4530 */\n swap6\n pop\n /* \"#utility.yul\":4425:4540 */\n pop\n /* \"#utility.yul\":4579:4581 */\n 0x20\n /* \"#utility.yul\":4605:4657 */\n tag_180\n /* \"#utility.yul\":4649:4656 */\n dup9\n /* \"#utility.yul\":4640:4646 */\n dup3\n /* \"#utility.yul\":4629:4638 */\n dup10\n /* \"#utility.yul\":4625:4647 */\n add\n /* \"#utility.yul\":4605:4657 */\n tag_66\n jump\t// in\n tag_180:\n /* \"#utility.yul\":4595:4657 */\n swap5\n pop\n /* \"#utility.yul\":4550:4667 */\n pop\n /* \"#utility.yul\":4706:4708 */\n 0x40\n /* \"#utility.yul\":4732:4785 */\n tag_181\n /* \"#utility.yul\":4777:4784 */\n dup9\n /* \"#utility.yul\":4768:4774 */\n dup3\n /* \"#utility.yul\":4757:4766 */\n dup10\n /* \"#utility.yul\":4753:4775 */\n add\n /* \"#utility.yul\":4732:4785 */\n tag_70\n jump\t// in\n tag_181:\n /* \"#utility.yul\":4722:4785 */\n swap4\n pop\n /* \"#utility.yul\":4677:4795 */\n pop\n /* \"#utility.yul\":4834:4836 */\n 0x60\n /* \"#utility.yul\":4860:4912 */\n tag_182\n /* \"#utility.yul\":4904:4911 */\n dup9\n /* \"#utility.yul\":4895:4901 */\n dup3\n /* \"#utility.yul\":4884:4893 */\n dup10\n /* \"#utility.yul\":4880:4902 */\n add\n /* \"#utility.yul\":4860:4912 */\n tag_73\n jump\t// in\n tag_182:\n /* \"#utility.yul\":4850:4912 */\n swap3\n pop\n /* \"#utility.yul\":4805:4922 */\n pop\n /* \"#utility.yul\":4989:4992 */\n 0x80\n /* \"#utility.yul\":4978:4987 */\n dup7\n /* \"#utility.yul\":4974:4993 */\n add\n /* \"#utility.yul\":4961:4994 */\n calldataload\n /* \"#utility.yul\":5021:5039 */\n 0xffffffffffffffff\n /* \"#utility.yul\":5013:5019 */\n dup2\n /* \"#utility.yul\":5010:5040 */\n gt\n /* \"#utility.yul\":5007:5124 */\n iszero\n tag_183\n jumpi\n /* \"#utility.yul\":5043:5122 */\n tag_184\n tag_60\n jump\t// in\n tag_184:\n /* \"#utility.yul\":5007:5124 */\n tag_183:\n /* \"#utility.yul\":5148:5210 */\n tag_185\n /* \"#utility.yul\":5202:5209 */\n dup9\n /* \"#utility.yul\":5193:5199 */\n dup3\n /* \"#utility.yul\":5182:5191 */\n dup10\n /* \"#utility.yul\":5178:5200 */\n add\n /* \"#utility.yul\":5148:5210 */\n tag_83\n jump\t// in\n tag_185:\n /* \"#utility.yul\":5138:5210 */\n swap2\n pop\n /* \"#utility.yul\":4932:5220 */\n pop\n /* \"#utility.yul\":4146:5227 */\n swap3\n swap6\n pop\n swap3\n swap6\n swap1\n swap4\n pop\n jump\t// out\n /* \"#utility.yul\":5233:5293 */\n tag_84:\n /* \"#utility.yul\":5261:5264 */\n 0x00\n /* \"#utility.yul\":5282:5287 */\n dup2\n /* \"#utility.yul\":5275:5287 */\n swap1\n pop\n /* \"#utility.yul\":5233:5293 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":5299:5441 */\n tag_85:\n /* \"#utility.yul\":5349:5358 */\n 0x00\n /* \"#utility.yul\":5382:5435 */\n tag_188\n /* \"#utility.yul\":5400:5434 */\n tag_189\n /* \"#utility.yul\":5409:5433 */\n tag_190\n /* \"#utility.yul\":5427:5432 */\n dup5\n /* \"#utility.yul\":5409:5433 */\n tag_67\n jump\t// in\n tag_190:\n /* \"#utility.yul\":5400:5434 */\n tag_84\n jump\t// in\n tag_189:\n /* \"#utility.yul\":5382:5435 */\n tag_67\n jump\t// in\n tag_188:\n /* \"#utility.yul\":5369:5435 */\n swap1\n pop\n /* \"#utility.yul\":5299:5441 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":5447:5573 */\n tag_86:\n /* \"#utility.yul\":5497:5506 */\n 0x00\n /* \"#utility.yul\":5530:5567 */\n tag_192\n /* \"#utility.yul\":5561:5566 */\n dup3\n /* \"#utility.yul\":5530:5567 */\n tag_85\n jump\t// in\n tag_192:\n /* \"#utility.yul\":5517:5567 */\n swap1\n pop\n /* \"#utility.yul\":5447:5573 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":5579:5725 */\n tag_87:\n /* \"#utility.yul\":5649:5658 */\n 0x00\n /* \"#utility.yul\":5682:5719 */\n tag_194\n /* \"#utility.yul\":5713:5718 */\n dup3\n /* \"#utility.yul\":5682:5719 */\n tag_86\n jump\t// in\n tag_194:\n /* \"#utility.yul\":5669:5719 */\n swap1\n pop\n /* \"#utility.yul\":5579:5725 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":5731:5902 */\n tag_88:\n /* \"#utility.yul\":5838:5895 */\n tag_196\n /* \"#utility.yul\":5889:5894 */\n dup2\n /* \"#utility.yul\":5838:5895 */\n tag_87\n jump\t// in\n tag_196:\n /* \"#utility.yul\":5833:5836 */\n dup3\n /* \"#utility.yul\":5826:5896 */\n mstore\n /* \"#utility.yul\":5731:5902 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":5908:6170 */\n tag_15:\n /* \"#utility.yul\":6021:6025 */\n 0x00\n /* \"#utility.yul\":6059:6061 */\n 0x20\n /* \"#utility.yul\":6048:6057 */\n dup3\n /* \"#utility.yul\":6044:6062 */\n add\n /* \"#utility.yul\":6036:6062 */\n swap1\n pop\n /* \"#utility.yul\":6072:6163 */\n tag_198\n /* \"#utility.yul\":6160:6161 */\n 0x00\n /* \"#utility.yul\":6149:6158 */\n dup4\n /* \"#utility.yul\":6145:6162 */\n add\n /* \"#utility.yul\":6136:6142 */\n dup5\n /* \"#utility.yul\":6072:6163 */\n tag_88\n jump\t// in\n tag_198:\n /* \"#utility.yul\":5908:6170 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":6176:6503 */\n tag_18:\n /* \"#utility.yul\":6234:6240 */\n 0x00\n /* \"#utility.yul\":6283:6285 */\n 0x20\n /* \"#utility.yul\":6271:6280 */\n dup3\n /* \"#utility.yul\":6262:6269 */\n dup5\n /* \"#utility.yul\":6258:6281 */\n sub\n /* \"#utility.yul\":6254:6286 */\n slt\n /* \"#utility.yul\":6251:6370 */\n iszero\n tag_200\n jumpi\n /* \"#utility.yul\":6289:6368 */\n tag_201\n tag_59\n jump\t// in\n tag_201:\n /* \"#utility.yul\":6251:6370 */\n tag_200:\n /* \"#utility.yul\":6409:6410 */\n 0x00\n /* \"#utility.yul\":6434:6486 */\n tag_202\n /* \"#utility.yul\":6478:6485 */\n dup5\n /* \"#utility.yul\":6469:6475 */\n dup3\n /* \"#utility.yul\":6458:6467 */\n dup6\n /* \"#utility.yul\":6454:6476 */\n add\n /* \"#utility.yul\":6434:6486 */\n tag_66\n jump\t// in\n tag_202:\n /* \"#utility.yul\":6424:6486 */\n swap2\n pop\n /* \"#utility.yul\":6380:6496 */\n pop\n /* \"#utility.yul\":6176:6503 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":6509:6627 */\n tag_89:\n /* \"#utility.yul\":6596:6620 */\n tag_204\n /* \"#utility.yul\":6614:6619 */\n dup2\n /* \"#utility.yul\":6596:6620 */\n tag_68\n jump\t// in\n tag_204:\n /* \"#utility.yul\":6591:6594 */\n dup3\n /* \"#utility.yul\":6584:6621 */\n mstore\n /* \"#utility.yul\":6509:6627 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":6633:6855 */\n tag_21:\n /* \"#utility.yul\":6726:6730 */\n 0x00\n /* \"#utility.yul\":6764:6766 */\n 0x20\n /* \"#utility.yul\":6753:6762 */\n dup3\n /* \"#utility.yul\":6749:6767 */\n add\n /* \"#utility.yul\":6741:6767 */\n swap1\n pop\n /* \"#utility.yul\":6777:6848 */\n tag_206\n /* \"#utility.yul\":6845:6846 */\n 0x00\n /* \"#utility.yul\":6834:6843 */\n dup4\n /* \"#utility.yul\":6830:6847 */\n add\n /* \"#utility.yul\":6821:6827 */\n dup5\n /* \"#utility.yul\":6777:6848 */\n tag_89\n jump\t// in\n tag_206:\n /* \"#utility.yul\":6633:6855 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":6861:6978 */\n tag_90:\n /* \"#utility.yul\":6970:6971 */\n 0x00\n /* \"#utility.yul\":6967:6968 */\n dup1\n /* \"#utility.yul\":6960:6972 */\n revert\n /* \"#utility.yul\":6984:7101 */\n tag_91:\n /* \"#utility.yul\":7093:7094 */\n 0x00\n /* \"#utility.yul\":7090:7091 */\n dup1\n /* \"#utility.yul\":7083:7095 */\n revert\n /* \"#utility.yul\":7107:7427 */\n tag_92:\n /* \"#utility.yul\":7193:7197 */\n 0x00\n /* \"#utility.yul\":7283:7301 */\n 0xffffffffffffffff\n /* \"#utility.yul\":7275:7281 */\n dup3\n /* \"#utility.yul\":7272:7302 */\n gt\n /* \"#utility.yul\":7269:7325 */\n iszero\n tag_210\n jumpi\n /* \"#utility.yul\":7305:7323 */\n tag_211\n tag_77\n jump\t// in\n tag_211:\n /* \"#utility.yul\":7269:7325 */\n tag_210:\n /* \"#utility.yul\":7355:7359 */\n 0x20\n /* \"#utility.yul\":7347:7353 */\n dup3\n /* \"#utility.yul\":7343:7360 */\n mul\n /* \"#utility.yul\":7335:7360 */\n swap1\n pop\n /* \"#utility.yul\":7415:7419 */\n 0x20\n /* \"#utility.yul\":7409:7413 */\n dup2\n /* \"#utility.yul\":7405:7420 */\n add\n /* \"#utility.yul\":7397:7420 */\n swap1\n pop\n /* \"#utility.yul\":7107:7427 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":7433:7550 */\n tag_93:\n /* \"#utility.yul\":7542:7543 */\n 0x00\n /* \"#utility.yul\":7539:7540 */\n dup1\n /* \"#utility.yul\":7532:7544 */\n revert\n /* \"#utility.yul\":7571:8513 */\n tag_94:\n /* \"#utility.yul\":7676:7681 */\n 0x00\n /* \"#utility.yul\":7701:7791 */\n tag_214\n /* \"#utility.yul\":7717:7790 */\n tag_215\n /* \"#utility.yul\":7783:7789 */\n dup5\n /* \"#utility.yul\":7717:7790 */\n tag_92\n jump\t// in\n tag_215:\n /* \"#utility.yul\":7701:7791 */\n tag_79\n jump\t// in\n tag_214:\n /* \"#utility.yul\":7692:7791 */\n swap1\n pop\n /* \"#utility.yul\":7811:7816 */\n dup1\n /* \"#utility.yul\":7840:7846 */\n dup4\n /* \"#utility.yul\":7833:7838 */\n dup3\n /* \"#utility.yul\":7826:7847 */\n mstore\n /* \"#utility.yul\":7874:7878 */\n 0x20\n /* \"#utility.yul\":7867:7872 */\n dup3\n /* \"#utility.yul\":7863:7879 */\n add\n /* \"#utility.yul\":7856:7879 */\n swap1\n pop\n /* \"#utility.yul\":7927:7931 */\n 0x20\n /* \"#utility.yul\":7919:7925 */\n dup5\n /* \"#utility.yul\":7915:7932 */\n mul\n /* \"#utility.yul\":7907:7913 */\n dup4\n /* \"#utility.yul\":7903:7933 */\n add\n /* \"#utility.yul\":7956:7959 */\n dup6\n /* \"#utility.yul\":7948:7954 */\n dup2\n /* \"#utility.yul\":7945:7960 */\n gt\n /* \"#utility.yul\":7942:8064 */\n iszero\n tag_216\n jumpi\n /* \"#utility.yul\":7975:8054 */\n tag_217\n tag_93\n jump\t// in\n tag_217:\n /* \"#utility.yul\":7942:8064 */\n tag_216:\n /* \"#utility.yul\":8090:8096 */\n dup4\n /* \"#utility.yul\":8073:8507 */\n tag_218:\n /* \"#utility.yul\":8107:8113 */\n dup2\n /* \"#utility.yul\":8102:8105 */\n dup2\n /* \"#utility.yul\":8099:8114 */\n lt\n /* \"#utility.yul\":8073:8507 */\n iszero\n tag_220\n jumpi\n /* \"#utility.yul\":8196:8199 */\n dup1\n /* \"#utility.yul\":8183:8200 */\n calldataload\n /* \"#utility.yul\":8232:8250 */\n 0xffffffffffffffff\n /* \"#utility.yul\":8219:8230 */\n dup2\n /* \"#utility.yul\":8216:8251 */\n gt\n /* \"#utility.yul\":8213:8335 */\n iszero\n tag_221\n jumpi\n /* \"#utility.yul\":8254:8333 */\n tag_222\n tag_74\n jump\t// in\n tag_222:\n /* \"#utility.yul\":8213:8335 */\n tag_221:\n /* \"#utility.yul\":8378:8389 */\n dup1\n /* \"#utility.yul\":8370:8376 */\n dup7\n /* \"#utility.yul\":8366:8390 */\n add\n /* \"#utility.yul\":8416:8462 */\n tag_223\n /* \"#utility.yul\":8458:8461 */\n dup10\n /* \"#utility.yul\":8446:8456 */\n dup3\n /* \"#utility.yul\":8416:8462 */\n tag_83\n jump\t// in\n tag_223:\n /* \"#utility.yul\":8411:8414 */\n dup6\n /* \"#utility.yul\":8404:8463 */\n mstore\n /* \"#utility.yul\":8492:8496 */\n 0x20\n /* \"#utility.yul\":8487:8490 */\n dup6\n /* \"#utility.yul\":8483:8497 */\n add\n /* \"#utility.yul\":8476:8497 */\n swap5\n pop\n /* \"#utility.yul\":8149:8507 */\n pop\n pop\n /* \"#utility.yul\":8133:8137 */\n 0x20\n /* \"#utility.yul\":8128:8131 */\n dup2\n /* \"#utility.yul\":8124:8138 */\n add\n /* \"#utility.yul\":8117:8138 */\n swap1\n pop\n /* \"#utility.yul\":8073:8507 */\n jump(tag_218)\n tag_220:\n /* \"#utility.yul\":8077:8098 */\n pop\n /* \"#utility.yul\":7682:8513 */\n pop\n pop\n /* \"#utility.yul\":7571:8513 */\n swap4\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":8534:8922 */\n tag_95:\n /* \"#utility.yul\":8614:8619 */\n 0x00\n /* \"#utility.yul\":8663:8666 */\n dup3\n /* \"#utility.yul\":8656:8660 */\n 0x1f\n /* \"#utility.yul\":8648:8654 */\n dup4\n /* \"#utility.yul\":8644:8661 */\n add\n /* \"#utility.yul\":8640:8667 */\n slt\n /* \"#utility.yul\":8630:8752 */\n tag_225\n jumpi\n /* \"#utility.yul\":8671:8750 */\n tag_226\n tag_74\n jump\t// in\n tag_226:\n /* \"#utility.yul\":8630:8752 */\n tag_225:\n /* \"#utility.yul\":8788:8794 */\n dup2\n /* \"#utility.yul\":8775:8795 */\n calldataload\n /* \"#utility.yul\":8813:8916 */\n tag_227\n /* \"#utility.yul\":8912:8915 */\n dup5\n /* \"#utility.yul\":8904:8910 */\n dup3\n /* \"#utility.yul\":8897:8901 */\n 0x20\n /* \"#utility.yul\":8889:8895 */\n dup7\n /* \"#utility.yul\":8885:8902 */\n add\n /* \"#utility.yul\":8813:8916 */\n tag_94\n jump\t// in\n tag_227:\n /* \"#utility.yul\":8804:8916 */\n swap2\n pop\n /* \"#utility.yul\":8620:8922 */\n pop\n /* \"#utility.yul\":8534:8922 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":8970:9746 */\n tag_96:\n /* \"#utility.yul\":9047:9052 */\n 0x00\n /* \"#utility.yul\":9091:9095 */\n 0x40\n /* \"#utility.yul\":9079:9088 */\n dup3\n /* \"#utility.yul\":9074:9077 */\n dup5\n /* \"#utility.yul\":9070:9089 */\n sub\n /* \"#utility.yul\":9066:9096 */\n slt\n /* \"#utility.yul\":9063:9180 */\n iszero\n tag_229\n jumpi\n /* \"#utility.yul\":9099:9178 */\n tag_230\n tag_90\n jump\t// in\n tag_230:\n /* \"#utility.yul\":9063:9180 */\n tag_229:\n /* \"#utility.yul\":9198:9219 */\n tag_231\n /* \"#utility.yul\":9214:9218 */\n 0x40\n /* \"#utility.yul\":9198:9219 */\n tag_79\n jump\t// in\n tag_231:\n /* \"#utility.yul\":9189:9219 */\n swap1\n pop\n /* \"#utility.yul\":9281:9282 */\n 0x00\n /* \"#utility.yul\":9321:9368 */\n tag_232\n /* \"#utility.yul\":9364:9367 */\n dup5\n /* \"#utility.yul\":9355:9361 */\n dup3\n /* \"#utility.yul\":9344:9353 */\n dup6\n /* \"#utility.yul\":9340:9362 */\n add\n /* \"#utility.yul\":9321:9368 */\n tag_63\n jump\t// in\n tag_232:\n /* \"#utility.yul\":9314:9318 */\n 0x00\n /* \"#utility.yul\":9307:9312 */\n dup4\n /* \"#utility.yul\":9303:9319 */\n add\n /* \"#utility.yul\":9296:9369 */\n mstore\n /* \"#utility.yul\":9229:9380 */\n pop\n /* \"#utility.yul\":9471:9473 */\n 0x20\n /* \"#utility.yul\":9460:9469 */\n dup3\n /* \"#utility.yul\":9456:9474 */\n add\n /* \"#utility.yul\":9443:9475 */\n calldataload\n /* \"#utility.yul\":9502:9520 */\n 0xffffffffffffffff\n /* \"#utility.yul\":9494:9500 */\n dup2\n /* \"#utility.yul\":9491:9521 */\n gt\n /* \"#utility.yul\":9488:9605 */\n iszero\n tag_233\n jumpi\n /* \"#utility.yul\":9524:9603 */\n tag_234\n tag_91\n jump\t// in\n tag_234:\n /* \"#utility.yul\":9488:9605 */\n tag_233:\n /* \"#utility.yul\":9644:9727 */\n tag_235\n /* \"#utility.yul\":9723:9726 */\n dup5\n /* \"#utility.yul\":9714:9720 */\n dup3\n /* \"#utility.yul\":9703:9712 */\n dup6\n /* \"#utility.yul\":9699:9721 */\n add\n /* \"#utility.yul\":9644:9727 */\n tag_95\n jump\t// in\n tag_235:\n /* \"#utility.yul\":9637:9641 */\n 0x20\n /* \"#utility.yul\":9630:9635 */\n dup4\n /* \"#utility.yul\":9626:9642 */\n add\n /* \"#utility.yul\":9619:9728 */\n mstore\n /* \"#utility.yul\":9390:9739 */\n pop\n /* \"#utility.yul\":8970:9746 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":9752:11049 */\n tag_24:\n /* \"#utility.yul\":9880:9886 */\n 0x00\n /* \"#utility.yul\":9888:9894 */\n dup1\n /* \"#utility.yul\":9896:9902 */\n 0x00\n /* \"#utility.yul\":9904:9910 */\n dup1\n /* \"#utility.yul\":9912:9918 */\n 0x00\n /* \"#utility.yul\":9961:9964 */\n 0xa0\n /* \"#utility.yul\":9949:9958 */\n dup7\n /* \"#utility.yul\":9940:9947 */\n dup9\n /* \"#utility.yul\":9936:9959 */\n sub\n /* \"#utility.yul\":9932:9965 */\n slt\n /* \"#utility.yul\":9929:10049 */\n iszero\n tag_237\n jumpi\n /* \"#utility.yul\":9968:10047 */\n tag_238\n tag_59\n jump\t// in\n tag_238:\n /* \"#utility.yul\":9929:10049 */\n tag_237:\n /* \"#utility.yul\":10088:10089 */\n 0x00\n /* \"#utility.yul\":10113:10164 */\n tag_239\n /* \"#utility.yul\":10156:10163 */\n dup9\n /* \"#utility.yul\":10147:10153 */\n dup3\n /* \"#utility.yul\":10136:10145 */\n dup10\n /* \"#utility.yul\":10132:10154 */\n add\n /* \"#utility.yul\":10113:10164 */\n tag_63\n jump\t// in\n tag_239:\n /* \"#utility.yul\":10103:10164 */\n swap6\n pop\n /* \"#utility.yul\":10059:10174 */\n pop\n /* \"#utility.yul\":10213:10215 */\n 0x20\n /* \"#utility.yul\":10239:10291 */\n tag_240\n /* \"#utility.yul\":10283:10290 */\n dup9\n /* \"#utility.yul\":10274:10280 */\n dup3\n /* \"#utility.yul\":10263:10272 */\n dup10\n /* \"#utility.yul\":10259:10281 */\n add\n /* \"#utility.yul\":10239:10291 */\n tag_66\n jump\t// in\n tag_240:\n /* \"#utility.yul\":10229:10291 */\n swap5\n pop\n /* \"#utility.yul\":10184:10301 */\n pop\n /* \"#utility.yul\":10368:10370 */\n 0x40\n /* \"#utility.yul\":10357:10366 */\n dup7\n /* \"#utility.yul\":10353:10371 */\n add\n /* \"#utility.yul\":10340:10372 */\n calldataload\n /* \"#utility.yul\":10399:10417 */\n 0xffffffffffffffff\n /* \"#utility.yul\":10391:10397 */\n dup2\n /* \"#utility.yul\":10388:10418 */\n gt\n /* \"#utility.yul\":10385:10502 */\n iszero\n tag_241\n jumpi\n /* \"#utility.yul\":10421:10500 */\n tag_242\n tag_60\n jump\t// in\n tag_242:\n /* \"#utility.yul\":10385:10502 */\n tag_241:\n /* \"#utility.yul\":10526:10607 */\n tag_243\n /* \"#utility.yul\":10599:10606 */\n dup9\n /* \"#utility.yul\":10590:10596 */\n dup3\n /* \"#utility.yul\":10579:10588 */\n dup10\n /* \"#utility.yul\":10575:10597 */\n add\n /* \"#utility.yul\":10526:10607 */\n tag_96\n jump\t// in\n tag_243:\n /* \"#utility.yul\":10516:10607 */\n swap4\n pop\n /* \"#utility.yul\":10311:10617 */\n pop\n /* \"#utility.yul\":10656:10658 */\n 0x60\n /* \"#utility.yul\":10682:10734 */\n tag_244\n /* \"#utility.yul\":10726:10733 */\n dup9\n /* \"#utility.yul\":10717:10723 */\n dup3\n /* \"#utility.yul\":10706:10715 */\n dup10\n /* \"#utility.yul\":10702:10724 */\n add\n /* \"#utility.yul\":10682:10734 */\n tag_73\n jump\t// in\n tag_244:\n /* \"#utility.yul\":10672:10734 */\n swap3\n pop\n /* \"#utility.yul\":10627:10744 */\n pop\n /* \"#utility.yul\":10811:10814 */\n 0x80\n /* \"#utility.yul\":10800:10809 */\n dup7\n /* \"#utility.yul\":10796:10815 */\n add\n /* \"#utility.yul\":10783:10816 */\n calldataload\n /* \"#utility.yul\":10843:10861 */\n 0xffffffffffffffff\n /* \"#utility.yul\":10835:10841 */\n dup2\n /* \"#utility.yul\":10832:10862 */\n gt\n /* \"#utility.yul\":10829:10946 */\n iszero\n tag_245\n jumpi\n /* \"#utility.yul\":10865:10944 */\n tag_246\n tag_60\n jump\t// in\n tag_246:\n /* \"#utility.yul\":10829:10946 */\n tag_245:\n /* \"#utility.yul\":10970:11032 */\n tag_247\n /* \"#utility.yul\":11024:11031 */\n dup9\n /* \"#utility.yul\":11015:11021 */\n dup3\n /* \"#utility.yul\":11004:11013 */\n dup10\n /* \"#utility.yul\":11000:11022 */\n add\n /* \"#utility.yul\":10970:11032 */\n tag_83\n jump\t// in\n tag_247:\n /* \"#utility.yul\":10960:11032 */\n swap2\n pop\n /* \"#utility.yul\":10754:11042 */\n pop\n /* \"#utility.yul\":9752:11049 */\n swap3\n swap6\n pop\n swap3\n swap6\n swap1\n swap4\n pop\n jump\t// out\n /* \"#utility.yul\":11055:11600 */\n tag_28:\n /* \"#utility.yul\":11142:11148 */\n 0x00\n /* \"#utility.yul\":11191:11193 */\n 0x20\n /* \"#utility.yul\":11179:11188 */\n dup3\n /* \"#utility.yul\":11170:11177 */\n dup5\n /* \"#utility.yul\":11166:11189 */\n sub\n /* \"#utility.yul\":11162:11194 */\n slt\n /* \"#utility.yul\":11159:11278 */\n iszero\n tag_249\n jumpi\n /* \"#utility.yul\":11197:11276 */\n tag_250\n tag_59\n jump\t// in\n tag_250:\n /* \"#utility.yul\":11159:11278 */\n tag_249:\n /* \"#utility.yul\":11345:11346 */\n 0x00\n /* \"#utility.yul\":11334:11343 */\n dup3\n /* \"#utility.yul\":11330:11347 */\n add\n /* \"#utility.yul\":11317:11348 */\n calldataload\n /* \"#utility.yul\":11375:11393 */\n 0xffffffffffffffff\n /* \"#utility.yul\":11367:11373 */\n dup2\n /* \"#utility.yul\":11364:11394 */\n gt\n /* \"#utility.yul\":11361:11478 */\n iszero\n tag_251\n jumpi\n /* \"#utility.yul\":11397:11476 */\n tag_252\n tag_60\n jump\t// in\n tag_252:\n /* \"#utility.yul\":11361:11478 */\n tag_251:\n /* \"#utility.yul\":11502:11583 */\n tag_253\n /* \"#utility.yul\":11575:11582 */\n dup5\n /* \"#utility.yul\":11566:11572 */\n dup3\n /* \"#utility.yul\":11555:11564 */\n dup6\n /* \"#utility.yul\":11551:11573 */\n add\n /* \"#utility.yul\":11502:11583 */\n tag_96\n jump\t// in\n tag_253:\n /* \"#utility.yul\":11492:11583 */\n swap2\n pop\n /* \"#utility.yul\":11288:11593 */\n pop\n /* \"#utility.yul\":11055:11600 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":11606:11721 */\n tag_97:\n /* \"#utility.yul\":11691:11714 */\n tag_255\n /* \"#utility.yul\":11708:11713 */\n dup2\n /* \"#utility.yul\":11691:11714 */\n tag_71\n jump\t// in\n tag_255:\n /* \"#utility.yul\":11686:11689 */\n dup3\n /* \"#utility.yul\":11679:11715 */\n mstore\n /* \"#utility.yul\":11606:11721 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":11727:11804 */\n tag_98:\n /* \"#utility.yul\":11764:11771 */\n 0x00\n /* \"#utility.yul\":11793:11798 */\n dup2\n /* \"#utility.yul\":11782:11798 */\n swap1\n pop\n /* \"#utility.yul\":11727:11804 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":11810:11928 */\n tag_99:\n /* \"#utility.yul\":11897:11921 */\n tag_258\n /* \"#utility.yul\":11915:11920 */\n dup2\n /* \"#utility.yul\":11897:11921 */\n tag_98\n jump\t// in\n tag_258:\n /* \"#utility.yul\":11892:11895 */\n dup3\n /* \"#utility.yul\":11885:11922 */\n mstore\n /* \"#utility.yul\":11810:11928 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":11934:12368 */\n tag_31:\n /* \"#utility.yul\":12079:12083 */\n 0x00\n /* \"#utility.yul\":12117:12119 */\n 0x60\n /* \"#utility.yul\":12106:12115 */\n dup3\n /* \"#utility.yul\":12102:12120 */\n add\n /* \"#utility.yul\":12094:12120 */\n swap1\n pop\n /* \"#utility.yul\":12130:12199 */\n tag_260\n /* \"#utility.yul\":12196:12197 */\n 0x00\n /* \"#utility.yul\":12185:12194 */\n dup4\n /* \"#utility.yul\":12181:12198 */\n add\n /* \"#utility.yul\":12172:12178 */\n dup7\n /* \"#utility.yul\":12130:12199 */\n tag_97\n jump\t// in\n tag_260:\n /* \"#utility.yul\":12209:12281 */\n tag_261\n /* \"#utility.yul\":12277:12279 */\n 0x20\n /* \"#utility.yul\":12266:12275 */\n dup4\n /* \"#utility.yul\":12262:12280 */\n add\n /* \"#utility.yul\":12253:12259 */\n dup6\n /* \"#utility.yul\":12209:12281 */\n tag_99\n jump\t// in\n tag_261:\n /* \"#utility.yul\":12291:12361 */\n tag_262\n /* \"#utility.yul\":12357:12359 */\n 0x40\n /* \"#utility.yul\":12346:12355 */\n dup4\n /* \"#utility.yul\":12342:12360 */\n add\n /* \"#utility.yul\":12333:12339 */\n dup5\n /* \"#utility.yul\":12291:12361 */\n tag_97\n jump\t// in\n tag_262:\n /* \"#utility.yul\":11934:12368 */\n swap5\n swap4\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":12374:12486 */\n tag_100:\n /* \"#utility.yul\":12457:12479 */\n tag_264\n /* \"#utility.yul\":12473:12478 */\n dup2\n /* \"#utility.yul\":12457:12479 */\n tag_61\n jump\t// in\n tag_264:\n /* \"#utility.yul\":12452:12455 */\n dup3\n /* \"#utility.yul\":12445:12480 */\n mstore\n /* \"#utility.yul\":12374:12486 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":12492:12607 */\n tag_101:\n /* \"#utility.yul\":12577:12600 */\n tag_266\n /* \"#utility.yul\":12594:12599 */\n dup2\n /* \"#utility.yul\":12577:12600 */\n tag_64\n jump\t// in\n tag_266:\n /* \"#utility.yul\":12572:12575 */\n dup3\n /* \"#utility.yul\":12565:12601 */\n mstore\n /* \"#utility.yul\":12492:12607 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":12613:12711 */\n tag_102:\n /* \"#utility.yul\":12664:12670 */\n 0x00\n /* \"#utility.yul\":12698:12703 */\n dup2\n /* \"#utility.yul\":12692:12704 */\n mload\n /* \"#utility.yul\":12682:12704 */\n swap1\n pop\n /* \"#utility.yul\":12613:12711 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":12717:12885 */\n tag_103:\n /* \"#utility.yul\":12800:12811 */\n 0x00\n /* \"#utility.yul\":12834:12840 */\n dup3\n /* \"#utility.yul\":12829:12832 */\n dup3\n /* \"#utility.yul\":12822:12841 */\n mstore\n /* \"#utility.yul\":12874:12878 */\n 0x20\n /* \"#utility.yul\":12869:12872 */\n dup3\n /* \"#utility.yul\":12865:12879 */\n add\n /* \"#utility.yul\":12850:12879 */\n swap1\n pop\n /* \"#utility.yul\":12717:12885 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":12891:13198 */\n tag_104:\n /* \"#utility.yul\":12959:12960 */\n 0x00\n /* \"#utility.yul\":12969:13082 */\n tag_270:\n /* \"#utility.yul\":12983:12989 */\n dup4\n /* \"#utility.yul\":12980:12981 */\n dup2\n /* \"#utility.yul\":12977:12990 */\n lt\n /* \"#utility.yul\":12969:13082 */\n iszero\n tag_272\n jumpi\n /* \"#utility.yul\":13068:13069 */\n dup1\n /* \"#utility.yul\":13063:13066 */\n dup3\n /* \"#utility.yul\":13059:13070 */\n add\n /* \"#utility.yul\":13053:13071 */\n mload\n /* \"#utility.yul\":13049:13050 */\n dup2\n /* \"#utility.yul\":13044:13047 */\n dup5\n /* \"#utility.yul\":13040:13051 */\n add\n /* \"#utility.yul\":13033:13072 */\n mstore\n /* \"#utility.yul\":13005:13007 */\n 0x20\n /* \"#utility.yul\":13002:13003 */\n dup2\n /* \"#utility.yul\":12998:13008 */\n add\n /* \"#utility.yul\":12993:13008 */\n swap1\n pop\n /* \"#utility.yul\":12969:13082 */\n jump(tag_270)\n tag_272:\n /* \"#utility.yul\":13100:13106 */\n dup4\n /* \"#utility.yul\":13097:13098 */\n dup2\n /* \"#utility.yul\":13094:13107 */\n gt\n /* \"#utility.yul\":13091:13192 */\n iszero\n tag_273\n jumpi\n /* \"#utility.yul\":13180:13181 */\n 0x00\n /* \"#utility.yul\":13171:13177 */\n dup5\n /* \"#utility.yul\":13166:13169 */\n dup5\n /* \"#utility.yul\":13162:13178 */\n add\n /* \"#utility.yul\":13155:13182 */\n mstore\n /* \"#utility.yul\":13091:13192 */\n tag_273:\n /* \"#utility.yul\":12940:13198 */\n pop\n /* \"#utility.yul\":12891:13198 */\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":13204:13564 */\n tag_105:\n /* \"#utility.yul\":13290:13293 */\n 0x00\n /* \"#utility.yul\":13318:13356 */\n tag_275\n /* \"#utility.yul\":13350:13355 */\n dup3\n /* \"#utility.yul\":13318:13356 */\n tag_102\n jump\t// in\n tag_275:\n /* \"#utility.yul\":13372:13442 */\n tag_276\n /* \"#utility.yul\":13435:13441 */\n dup2\n /* \"#utility.yul\":13430:13433 */\n dup6\n /* \"#utility.yul\":13372:13442 */\n tag_103\n jump\t// in\n tag_276:\n /* \"#utility.yul\":13365:13442 */\n swap4\n pop\n /* \"#utility.yul\":13451:13503 */\n tag_277\n /* \"#utility.yul\":13496:13502 */\n dup2\n /* \"#utility.yul\":13491:13494 */\n dup6\n /* \"#utility.yul\":13484:13488 */\n 0x20\n /* \"#utility.yul\":13477:13482 */\n dup7\n /* \"#utility.yul\":13473:13489 */\n add\n /* \"#utility.yul\":13451:13503 */\n tag_104\n jump\t// in\n tag_277:\n /* \"#utility.yul\":13528:13557 */\n tag_278\n /* \"#utility.yul\":13550:13556 */\n dup2\n /* \"#utility.yul\":13528:13557 */\n tag_76\n jump\t// in\n tag_278:\n /* \"#utility.yul\":13523:13526 */\n dup5\n /* \"#utility.yul\":13519:13558 */\n add\n /* \"#utility.yul\":13512:13558 */\n swap2\n pop\n /* \"#utility.yul\":13294:13564 */\n pop\n /* \"#utility.yul\":13204:13564 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":13570:14305 */\n tag_34:\n /* \"#utility.yul\":13785:13789 */\n 0x00\n /* \"#utility.yul\":13823:13826 */\n 0xa0\n /* \"#utility.yul\":13812:13821 */\n dup3\n /* \"#utility.yul\":13808:13827 */\n add\n /* \"#utility.yul\":13800:13827 */\n swap1\n pop\n /* \"#utility.yul\":13837:13904 */\n tag_280\n /* \"#utility.yul\":13901:13902 */\n 0x00\n /* \"#utility.yul\":13890:13899 */\n dup4\n /* \"#utility.yul\":13886:13903 */\n add\n /* \"#utility.yul\":13877:13883 */\n dup9\n /* \"#utility.yul\":13837:13904 */\n tag_100\n jump\t// in\n tag_280:\n /* \"#utility.yul\":13914:13984 */\n tag_281\n /* \"#utility.yul\":13980:13982 */\n 0x20\n /* \"#utility.yul\":13969:13978 */\n dup4\n /* \"#utility.yul\":13965:13983 */\n add\n /* \"#utility.yul\":13956:13962 */\n dup8\n /* \"#utility.yul\":13914:13984 */\n tag_101\n jump\t// in\n tag_281:\n /* \"#utility.yul\":13994:14066 */\n tag_282\n /* \"#utility.yul\":14062:14064 */\n 0x40\n /* \"#utility.yul\":14051:14060 */\n dup4\n /* \"#utility.yul\":14047:14065 */\n add\n /* \"#utility.yul\":14038:14044 */\n dup7\n /* \"#utility.yul\":13994:14066 */\n tag_89\n jump\t// in\n tag_282:\n /* \"#utility.yul\":14076:14146 */\n tag_283\n /* \"#utility.yul\":14142:14144 */\n 0x60\n /* \"#utility.yul\":14131:14140 */\n dup4\n /* \"#utility.yul\":14127:14145 */\n add\n /* \"#utility.yul\":14118:14124 */\n dup6\n /* \"#utility.yul\":14076:14146 */\n tag_97\n jump\t// in\n tag_283:\n /* \"#utility.yul\":14194:14203 */\n dup2\n /* \"#utility.yul\":14188:14192 */\n dup2\n /* \"#utility.yul\":14184:14204 */\n sub\n /* \"#utility.yul\":14178:14181 */\n 0x80\n /* \"#utility.yul\":14167:14176 */\n dup4\n /* \"#utility.yul\":14163:14182 */\n add\n /* \"#utility.yul\":14156:14205 */\n mstore\n /* \"#utility.yul\":14222:14298 */\n tag_284\n /* \"#utility.yul\":14293:14297 */\n dup2\n /* \"#utility.yul\":14284:14290 */\n dup5\n /* \"#utility.yul\":14222:14298 */\n tag_105\n jump\t// in\n tag_284:\n /* \"#utility.yul\":14214:14298 */\n swap1\n pop\n /* \"#utility.yul\":13570:14305 */\n swap7\n swap6\n pop\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":14311:14529 */\n tag_40:\n /* \"#utility.yul\":14402:14406 */\n 0x00\n /* \"#utility.yul\":14440:14442 */\n 0x20\n /* \"#utility.yul\":14429:14438 */\n dup3\n /* \"#utility.yul\":14425:14443 */\n add\n /* \"#utility.yul\":14417:14443 */\n swap1\n pop\n /* \"#utility.yul\":14453:14522 */\n tag_286\n /* \"#utility.yul\":14519:14520 */\n 0x00\n /* \"#utility.yul\":14508:14517 */\n dup4\n /* \"#utility.yul\":14504:14521 */\n add\n /* \"#utility.yul\":14495:14501 */\n dup5\n /* \"#utility.yul\":14453:14522 */\n tag_101\n jump\t// in\n tag_286:\n /* \"#utility.yul\":14311:14529 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":14535:14678 */\n tag_106:\n /* \"#utility.yul\":14592:14597 */\n 0x00\n /* \"#utility.yul\":14623:14629 */\n dup2\n /* \"#utility.yul\":14617:14630 */\n mload\n /* \"#utility.yul\":14608:14630 */\n swap1\n pop\n /* \"#utility.yul\":14639:14672 */\n tag_288\n /* \"#utility.yul\":14666:14671 */\n dup2\n /* \"#utility.yul\":14639:14672 */\n tag_69\n jump\t// in\n tag_288:\n /* \"#utility.yul\":14535:14678 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":14684:15035 */\n tag_44:\n /* \"#utility.yul\":14754:14760 */\n 0x00\n /* \"#utility.yul\":14803:14805 */\n 0x20\n /* \"#utility.yul\":14791:14800 */\n dup3\n /* \"#utility.yul\":14782:14789 */\n dup5\n /* \"#utility.yul\":14778:14801 */\n sub\n /* \"#utility.yul\":14774:14806 */\n slt\n /* \"#utility.yul\":14771:14890 */\n iszero\n tag_290\n jumpi\n /* \"#utility.yul\":14809:14888 */\n tag_291\n tag_59\n jump\t// in\n tag_291:\n /* \"#utility.yul\":14771:14890 */\n tag_290:\n /* \"#utility.yul\":14929:14930 */\n 0x00\n /* \"#utility.yul\":14954:15018 */\n tag_292\n /* \"#utility.yul\":15010:15017 */\n dup5\n /* \"#utility.yul\":15001:15007 */\n dup3\n /* \"#utility.yul\":14990:14999 */\n dup6\n /* \"#utility.yul\":14986:15008 */\n add\n /* \"#utility.yul\":14954:15018 */\n tag_106\n jump\t// in\n tag_292:\n /* \"#utility.yul\":14944:15018 */\n swap2\n pop\n /* \"#utility.yul\":14900:15028 */\n pop\n /* \"#utility.yul\":14684:15035 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":15041:15143 */\n tag_107:\n /* \"#utility.yul\":15114:15136 */\n tag_294\n /* \"#utility.yul\":15130:15135 */\n dup2\n /* \"#utility.yul\":15114:15136 */\n tag_61\n jump\t// in\n tag_294:\n /* \"#utility.yul\":15109:15112 */\n dup3\n /* \"#utility.yul\":15102:15137 */\n mstore\n /* \"#utility.yul\":15041:15143 */\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":15149:15272 */\n tag_108:\n /* \"#utility.yul\":15225:15231 */\n 0x00\n /* \"#utility.yul\":15259:15264 */\n dup2\n /* \"#utility.yul\":15253:15265 */\n mload\n /* \"#utility.yul\":15243:15265 */\n swap1\n pop\n /* \"#utility.yul\":15149:15272 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":15278:15461 */\n tag_109:\n /* \"#utility.yul\":15376:15387 */\n 0x00\n /* \"#utility.yul\":15410:15416 */\n dup3\n /* \"#utility.yul\":15405:15408 */\n dup3\n /* \"#utility.yul\":15398:15417 */\n mstore\n /* \"#utility.yul\":15450:15454 */\n 0x20\n /* \"#utility.yul\":15445:15448 */\n dup3\n /* \"#utility.yul\":15441:15455 */\n add\n /* \"#utility.yul\":15426:15455 */\n swap1\n pop\n /* \"#utility.yul\":15278:15461 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":15467:15608 */\n tag_110:\n /* \"#utility.yul\":15543:15547 */\n 0x00\n /* \"#utility.yul\":15566:15569 */\n dup2\n /* \"#utility.yul\":15558:15569 */\n swap1\n pop\n /* \"#utility.yul\":15596:15600 */\n 0x20\n /* \"#utility.yul\":15591:15594 */\n dup3\n /* \"#utility.yul\":15587:15601 */\n add\n /* \"#utility.yul\":15579:15601 */\n swap1\n pop\n /* \"#utility.yul\":15467:15608 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":15614:15772 */\n tag_111:\n /* \"#utility.yul\":15687:15698 */\n 0x00\n /* \"#utility.yul\":15721:15727 */\n dup3\n /* \"#utility.yul\":15716:15719 */\n dup3\n /* \"#utility.yul\":15709:15728 */\n mstore\n /* \"#utility.yul\":15761:15765 */\n 0x20\n /* \"#utility.yul\":15756:15759 */\n dup3\n /* \"#utility.yul\":15752:15766 */\n add\n /* \"#utility.yul\":15737:15766 */\n swap1\n pop\n /* \"#utility.yul\":15614:15772 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":15778:16118 */\n tag_112:\n /* \"#utility.yul\":15854:15857 */\n 0x00\n /* \"#utility.yul\":15882:15920 */\n tag_300\n /* \"#utility.yul\":15914:15919 */\n dup3\n /* \"#utility.yul\":15882:15920 */\n tag_102\n jump\t// in\n tag_300:\n /* \"#utility.yul\":15936:15996 */\n tag_301\n /* \"#utility.yul\":15989:15995 */\n dup2\n /* \"#utility.yul\":15984:15987 */\n dup6\n /* \"#utility.yul\":15936:15996 */\n tag_111\n jump\t// in\n tag_301:\n /* \"#utility.yul\":15929:15996 */\n swap4\n pop\n /* \"#utility.yul\":16005:16057 */\n tag_302\n /* \"#utility.yul\":16050:16056 */\n dup2\n /* \"#utility.yul\":16045:16048 */\n dup6\n /* \"#utility.yul\":16038:16042 */\n 0x20\n /* \"#utility.yul\":16031:16036 */\n dup7\n /* \"#utility.yul\":16027:16043 */\n add\n /* \"#utility.yul\":16005:16057 */\n tag_104\n jump\t// in\n tag_302:\n /* \"#utility.yul\":16082:16111 */\n tag_303\n /* \"#utility.yul\":16104:16110 */\n dup2\n /* \"#utility.yul\":16082:16111 */\n tag_76\n jump\t// in\n tag_303:\n /* \"#utility.yul\":16077:16080 */\n dup5\n /* \"#utility.yul\":16073:16112 */\n add\n /* \"#utility.yul\":16066:16112 */\n swap2\n pop\n /* \"#utility.yul\":15858:16118 */\n pop\n /* \"#utility.yul\":15778:16118 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":16124:16316 */\n tag_113:\n /* \"#utility.yul\":16211:16221 */\n 0x00\n /* \"#utility.yul\":16246:16310 */\n tag_305\n /* \"#utility.yul\":16306:16309 */\n dup4\n /* \"#utility.yul\":16298:16304 */\n dup4\n /* \"#utility.yul\":16246:16310 */\n tag_112\n jump\t// in\n tag_305:\n /* \"#utility.yul\":16232:16310 */\n swap1\n pop\n /* \"#utility.yul\":16124:16316 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":16322:16444 */\n tag_114:\n /* \"#utility.yul\":16401:16405 */\n 0x00\n /* \"#utility.yul\":16433:16437 */\n 0x20\n /* \"#utility.yul\":16428:16431 */\n dup3\n /* \"#utility.yul\":16424:16438 */\n add\n /* \"#utility.yul\":16416:16438 */\n swap1\n pop\n /* \"#utility.yul\":16322:16444 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":16476:17439 */\n tag_115:\n /* \"#utility.yul\":16603:16606 */\n 0x00\n /* \"#utility.yul\":16632:16695 */\n tag_308\n /* \"#utility.yul\":16689:16694 */\n dup3\n /* \"#utility.yul\":16632:16695 */\n tag_108\n jump\t// in\n tag_308:\n /* \"#utility.yul\":16711:16796 */\n tag_309\n /* \"#utility.yul\":16789:16795 */\n dup2\n /* \"#utility.yul\":16784:16787 */\n dup6\n /* \"#utility.yul\":16711:16796 */\n tag_109\n jump\t// in\n tag_309:\n /* \"#utility.yul\":16704:16796 */\n swap4\n pop\n /* \"#utility.yul\":16822:16825 */\n dup4\n /* \"#utility.yul\":16867:16871 */\n 0x20\n /* \"#utility.yul\":16859:16865 */\n dup3\n /* \"#utility.yul\":16855:16872 */\n mul\n /* \"#utility.yul\":16850:16853 */\n dup6\n /* \"#utility.yul\":16846:16873 */\n add\n /* \"#utility.yul\":16897:16962 */\n tag_310\n /* \"#utility.yul\":16956:16961 */\n dup6\n /* \"#utility.yul\":16897:16962 */\n tag_110\n jump\t// in\n tag_310:\n /* \"#utility.yul\":16985:16992 */\n dup1\n /* \"#utility.yul\":17016:17017 */\n 0x00\n /* \"#utility.yul\":17001:17394 */\n tag_311:\n /* \"#utility.yul\":17026:17032 */\n dup6\n /* \"#utility.yul\":17023:17024 */\n dup2\n /* \"#utility.yul\":17020:17033 */\n lt\n /* \"#utility.yul\":17001:17394 */\n iszero\n tag_313\n jumpi\n /* \"#utility.yul\":17097:17106 */\n dup5\n /* \"#utility.yul\":17091:17095 */\n dup5\n /* \"#utility.yul\":17087:17107 */\n sub\n /* \"#utility.yul\":17082:17085 */\n dup10\n /* \"#utility.yul\":17075:17108 */\n mstore\n /* \"#utility.yul\":17148:17154 */\n dup2\n /* \"#utility.yul\":17142:17155 */\n mload\n /* \"#utility.yul\":17176:17258 */\n tag_314\n /* \"#utility.yul\":17253:17257 */\n dup6\n /* \"#utility.yul\":17238:17251 */\n dup3\n /* \"#utility.yul\":17176:17258 */\n tag_113\n jump\t// in\n tag_314:\n /* \"#utility.yul\":17168:17258 */\n swap5\n pop\n /* \"#utility.yul\":17281:17350 */\n tag_315\n /* \"#utility.yul\":17343:17349 */\n dup4\n /* \"#utility.yul\":17281:17350 */\n tag_114\n jump\t// in\n tag_315:\n /* \"#utility.yul\":17271:17350 */\n swap3\n pop\n /* \"#utility.yul\":17379:17383 */\n 0x20\n /* \"#utility.yul\":17374:17377 */\n dup11\n /* \"#utility.yul\":17370:17384 */\n add\n /* \"#utility.yul\":17363:17384 */\n swap10\n pop\n /* \"#utility.yul\":17061:17394 */\n pop\n /* \"#utility.yul\":17048:17049 */\n 0x01\n /* \"#utility.yul\":17045:17046 */\n dup2\n /* \"#utility.yul\":17041:17050 */\n add\n /* \"#utility.yul\":17036:17050 */\n swap1\n pop\n /* \"#utility.yul\":17001:17394 */\n jump(tag_311)\n tag_313:\n /* \"#utility.yul\":17005:17019 */\n pop\n /* \"#utility.yul\":17410:17414 */\n dup3\n /* \"#utility.yul\":17403:17414 */\n swap8\n pop\n /* \"#utility.yul\":17430:17433 */\n dup8\n /* \"#utility.yul\":17423:17433 */\n swap6\n pop\n /* \"#utility.yul\":16608:17439 */\n pop\n pop\n pop\n pop\n pop\n /* \"#utility.yul\":16476:17439 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":17525:18188 */\n tag_116:\n /* \"#utility.yul\":17650:17653 */\n 0x00\n /* \"#utility.yul\":17686:17690 */\n 0x40\n /* \"#utility.yul\":17681:17684 */\n dup4\n /* \"#utility.yul\":17677:17691 */\n add\n /* \"#utility.yul\":17776:17780 */\n 0x00\n /* \"#utility.yul\":17769:17774 */\n dup4\n /* \"#utility.yul\":17765:17781 */\n add\n /* \"#utility.yul\":17759:17782 */\n mload\n /* \"#utility.yul\":17795:17854 */\n tag_317\n /* \"#utility.yul\":17848:17852 */\n 0x00\n /* \"#utility.yul\":17843:17846 */\n dup7\n /* \"#utility.yul\":17839:17853 */\n add\n /* \"#utility.yul\":17825:17837 */\n dup3\n /* \"#utility.yul\":17795:17854 */\n tag_107\n jump\t// in\n tag_317:\n /* \"#utility.yul\":17701:17864 */\n pop\n /* \"#utility.yul\":17950:17954 */\n 0x20\n /* \"#utility.yul\":17943:17948 */\n dup4\n /* \"#utility.yul\":17939:17955 */\n add\n /* \"#utility.yul\":17933:17956 */\n mload\n /* \"#utility.yul\":18003:18006 */\n dup5\n /* \"#utility.yul\":17997:18001 */\n dup3\n /* \"#utility.yul\":17993:18007 */\n sub\n /* \"#utility.yul\":17986:17990 */\n 0x20\n /* \"#utility.yul\":17981:17984 */\n dup7\n /* \"#utility.yul\":17977:17991 */\n add\n /* \"#utility.yul\":17970:18008 */\n mstore\n /* \"#utility.yul\":18029:18150 */\n tag_318\n /* \"#utility.yul\":18145:18149 */\n dup3\n /* \"#utility.yul\":18131:18143 */\n dup3\n /* \"#utility.yul\":18029:18150 */\n tag_115\n jump\t// in\n tag_318:\n /* \"#utility.yul\":18021:18150 */\n swap2\n pop\n /* \"#utility.yul\":17874:18161 */\n pop\n /* \"#utility.yul\":18178:18182 */\n dup1\n /* \"#utility.yul\":18171:18182 */\n swap2\n pop\n /* \"#utility.yul\":17655:18188 */\n pop\n /* \"#utility.yul\":17525:18188 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":18194:19092 */\n tag_47:\n /* \"#utility.yul\":18465:18469 */\n 0x00\n /* \"#utility.yul\":18503:18506 */\n 0xa0\n /* \"#utility.yul\":18492:18501 */\n dup3\n /* \"#utility.yul\":18488:18507 */\n add\n /* \"#utility.yul\":18480:18507 */\n swap1\n pop\n /* \"#utility.yul\":18517:18584 */\n tag_320\n /* \"#utility.yul\":18581:18582 */\n 0x00\n /* \"#utility.yul\":18570:18579 */\n dup4\n /* \"#utility.yul\":18566:18583 */\n add\n /* \"#utility.yul\":18557:18563 */\n dup9\n /* \"#utility.yul\":18517:18584 */\n tag_100\n jump\t// in\n tag_320:\n /* \"#utility.yul\":18594:18664 */\n tag_321\n /* \"#utility.yul\":18660:18662 */\n 0x20\n /* \"#utility.yul\":18649:18658 */\n dup4\n /* \"#utility.yul\":18645:18663 */\n add\n /* \"#utility.yul\":18636:18642 */\n dup8\n /* \"#utility.yul\":18594:18664 */\n tag_101\n jump\t// in\n tag_321:\n /* \"#utility.yul\":18711:18720 */\n dup2\n /* \"#utility.yul\":18705:18709 */\n dup2\n /* \"#utility.yul\":18701:18721 */\n sub\n /* \"#utility.yul\":18696:18698 */\n 0x40\n /* \"#utility.yul\":18685:18694 */\n dup4\n /* \"#utility.yul\":18681:18699 */\n add\n /* \"#utility.yul\":18674:18722 */\n mstore\n /* \"#utility.yul\":18739:18853 */\n tag_322\n /* \"#utility.yul\":18848:18852 */\n dup2\n /* \"#utility.yul\":18839:18845 */\n dup7\n /* \"#utility.yul\":18739:18853 */\n tag_116\n jump\t// in\n tag_322:\n /* \"#utility.yul\":18731:18853 */\n swap1\n pop\n /* \"#utility.yul\":18863:18933 */\n tag_323\n /* \"#utility.yul\":18929:18931 */\n 0x60\n /* \"#utility.yul\":18918:18927 */\n dup4\n /* \"#utility.yul\":18914:18932 */\n add\n /* \"#utility.yul\":18905:18911 */\n dup6\n /* \"#utility.yul\":18863:18933 */\n tag_97\n jump\t// in\n tag_323:\n /* \"#utility.yul\":18981:18990 */\n dup2\n /* \"#utility.yul\":18975:18979 */\n dup2\n /* \"#utility.yul\":18971:18991 */\n sub\n /* \"#utility.yul\":18965:18968 */\n 0x80\n /* \"#utility.yul\":18954:18963 */\n dup4\n /* \"#utility.yul\":18950:18969 */\n add\n /* \"#utility.yul\":18943:18992 */\n mstore\n /* \"#utility.yul\":19009:19085 */\n tag_324\n /* \"#utility.yul\":19080:19084 */\n dup2\n /* \"#utility.yul\":19071:19077 */\n dup5\n /* \"#utility.yul\":19009:19085 */\n tag_105\n jump\t// in\n tag_324:\n /* \"#utility.yul\":19001:19085 */\n swap1\n pop\n /* \"#utility.yul\":18194:19092 */\n swap7\n swap6\n pop\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":19098:19483 */\n tag_53:\n /* \"#utility.yul\":19247:19251 */\n 0x00\n /* \"#utility.yul\":19285:19287 */\n 0x20\n /* \"#utility.yul\":19274:19283 */\n dup3\n /* \"#utility.yul\":19270:19288 */\n add\n /* \"#utility.yul\":19262:19288 */\n swap1\n pop\n /* \"#utility.yul\":19334:19343 */\n dup2\n /* \"#utility.yul\":19328:19332 */\n dup2\n /* \"#utility.yul\":19324:19344 */\n sub\n /* \"#utility.yul\":19320:19321 */\n 0x00\n /* \"#utility.yul\":19309:19318 */\n dup4\n /* \"#utility.yul\":19305:19322 */\n add\n /* \"#utility.yul\":19298:19345 */\n mstore\n /* \"#utility.yul\":19362:19476 */\n tag_326\n /* \"#utility.yul\":19471:19475 */\n dup2\n /* \"#utility.yul\":19462:19468 */\n dup5\n /* \"#utility.yul\":19362:19476 */\n tag_116\n jump\t// in\n tag_326:\n /* \"#utility.yul\":19354:19476 */\n swap1\n pop\n /* \"#utility.yul\":19098:19483 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":19489:19630 */\n tag_117:\n /* \"#utility.yul\":19545:19550 */\n 0x00\n /* \"#utility.yul\":19576:19582 */\n dup2\n /* \"#utility.yul\":19570:19583 */\n mload\n /* \"#utility.yul\":19561:19583 */\n swap1\n pop\n /* \"#utility.yul\":19592:19624 */\n tag_328\n /* \"#utility.yul\":19618:19623 */\n dup2\n /* \"#utility.yul\":19592:19624 */\n tag_72\n jump\t// in\n tag_328:\n /* \"#utility.yul\":19489:19630 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":19636:19758 */\n tag_118:\n /* \"#utility.yul\":19709:19733 */\n tag_330\n /* \"#utility.yul\":19727:19732 */\n dup2\n /* \"#utility.yul\":19709:19733 */\n tag_98\n jump\t// in\n tag_330:\n /* \"#utility.yul\":19702:19707 */\n dup2\n /* \"#utility.yul\":19699:19734 */\n eq\n /* \"#utility.yul\":19689:19752 */\n tag_331\n jumpi\n /* \"#utility.yul\":19748:19749 */\n 0x00\n /* \"#utility.yul\":19745:19746 */\n dup1\n /* \"#utility.yul\":19738:19750 */\n revert\n /* \"#utility.yul\":19689:19752 */\n tag_331:\n /* \"#utility.yul\":19636:19758 */\n pop\n jump\t// out\n /* \"#utility.yul\":19764:19907 */\n tag_119:\n /* \"#utility.yul\":19821:19826 */\n 0x00\n /* \"#utility.yul\":19852:19858 */\n dup2\n /* \"#utility.yul\":19846:19859 */\n mload\n /* \"#utility.yul\":19837:19859 */\n swap1\n pop\n /* \"#utility.yul\":19868:19901 */\n tag_333\n /* \"#utility.yul\":19895:19900 */\n dup2\n /* \"#utility.yul\":19868:19901 */\n tag_118\n jump\t// in\n tag_333:\n /* \"#utility.yul\":19764:19907 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":19913:20572 */\n tag_57:\n /* \"#utility.yul\":19999:20005 */\n 0x00\n /* \"#utility.yul\":20007:20013 */\n dup1\n /* \"#utility.yul\":20015:20021 */\n 0x00\n /* \"#utility.yul\":20064:20066 */\n 0x60\n /* \"#utility.yul\":20052:20061 */\n dup5\n /* \"#utility.yul\":20043:20050 */\n dup7\n /* \"#utility.yul\":20039:20062 */\n sub\n /* \"#utility.yul\":20035:20067 */\n slt\n /* \"#utility.yul\":20032:20151 */\n iszero\n tag_335\n jumpi\n /* \"#utility.yul\":20070:20149 */\n tag_336\n tag_59\n jump\t// in\n tag_336:\n /* \"#utility.yul\":20032:20151 */\n tag_335:\n /* \"#utility.yul\":20190:20191 */\n 0x00\n /* \"#utility.yul\":20215:20278 */\n tag_337\n /* \"#utility.yul\":20270:20277 */\n dup7\n /* \"#utility.yul\":20261:20267 */\n dup3\n /* \"#utility.yul\":20250:20259 */\n dup8\n /* \"#utility.yul\":20246:20268 */\n add\n /* \"#utility.yul\":20215:20278 */\n tag_117\n jump\t// in\n tag_337:\n /* \"#utility.yul\":20205:20278 */\n swap4\n pop\n /* \"#utility.yul\":20161:20288 */\n pop\n /* \"#utility.yul\":20327:20329 */\n 0x20\n /* \"#utility.yul\":20353:20417 */\n tag_338\n /* \"#utility.yul\":20409:20416 */\n dup7\n /* \"#utility.yul\":20400:20406 */\n dup3\n /* \"#utility.yul\":20389:20398 */\n dup8\n /* \"#utility.yul\":20385:20407 */\n add\n /* \"#utility.yul\":20353:20417 */\n tag_119\n jump\t// in\n tag_338:\n /* \"#utility.yul\":20343:20417 */\n swap3\n pop\n /* \"#utility.yul\":20298:20427 */\n pop\n /* \"#utility.yul\":20466:20468 */\n 0x40\n /* \"#utility.yul\":20492:20555 */\n tag_339\n /* \"#utility.yul\":20547:20554 */\n dup7\n /* \"#utility.yul\":20538:20544 */\n dup3\n /* \"#utility.yul\":20527:20536 */\n dup8\n /* \"#utility.yul\":20523:20545 */\n add\n /* \"#utility.yul\":20492:20555 */\n tag_117\n jump\t// in\n tag_339:\n /* \"#utility.yul\":20482:20555 */\n swap2\n pop\n /* \"#utility.yul\":20437:20565 */\n pop\n /* \"#utility.yul\":19913:20572 */\n swap3\n pop\n swap3\n pop\n swap3\n jump\t// out\n\n auxdata: 0xa26469706673582212200c97281bd15caba3cc6efa4a076e6f49a63c3b3c013798a44e77679bfec3fec964736f6c634300080a0033\n}\n", "bytecode": { "functionDebugData": {}, "generatedSources": [], "linkReferences": {}, - "object": "60806040526108066000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005257600080fd5b50610e3d806100626000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063267d40621461005c57806361fc548f1461007857806371b0edfa146100965780639f89f03e146100c6578063f87f493f146100e2575b600080fd5b6100766004803603810190610071919061063d565b610113565b005b6100806101ad565b60405161008d9190610733565b60405180910390f35b6100b060048036038101906100ab919061074e565b6101d1565b6040516100bd919061078a565b60405180910390f35b6100e060048036038101906100db9190610901565b610284565b005b6100fc60048036038101906100f791906109b4565b61031e565b60405161010a929190610a25565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663267d406286868686866040518663ffffffff1660e01b8152600401610174959493929190610af4565b600060405180830381600087803b15801561018e57600080fd5b505af11580156101a2573d6000803e3d6000fd5b505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166371b0edfa836040518263ffffffff1660e01b815260040161022d9190610b4e565b60206040518083038186803b15801561024557600080fd5b505afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610b7e565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639f89f03e86868686866040518663ffffffff1660e01b81526004016102e5959493929190610d03565b600060405180830381600087803b1580156102ff57600080fd5b505af1158015610313573d6000803e3d6000fd5b505050505050505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f87f493f846040518263ffffffff1660e01b815260040161037a9190610d64565b604080518083038186803b15801561039157600080fd5b505afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610dc7565b91509150915091565b6000604051905090565b600080fd5b600080fd5b600060ff82169050919050565b6103fc816103e6565b811461040757600080fd5b50565b600081359050610419816103f3565b92915050565b600061ffff82169050919050565b6104368161041f565b811461044157600080fd5b50565b6000813590506104538161042d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061048482610459565b9050919050565b61049481610479565b811461049f57600080fd5b50565b6000813590506104b18161048b565b92915050565b600067ffffffffffffffff82169050919050565b6104d4816104b7565b81146104df57600080fd5b50565b6000813590506104f1816104cb565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61054a82610501565b810181811067ffffffffffffffff8211171561056957610568610512565b5b80604052505050565b600061057c6103d2565b90506105888282610541565b919050565b600067ffffffffffffffff8211156105a8576105a7610512565b5b6105b182610501565b9050602081019050919050565b82818337600083830152505050565b60006105e06105db8461058d565b610572565b9050828152602081018484840111156105fc576105fb6104fc565b5b6106078482856105be565b509392505050565b600082601f830112610624576106236104f7565b5b81356106348482602086016105cd565b91505092915050565b600080600080600060a08688031215610659576106586103dc565b5b60006106678882890161040a565b955050602061067888828901610444565b9450506040610689888289016104a2565b935050606061069a888289016104e2565b925050608086013567ffffffffffffffff8111156106bb576106ba6103e1565b5b6106c78882890161060f565b9150509295509295909350565b6000819050919050565b60006106f96106f46106ef84610459565b6106d4565b610459565b9050919050565b600061070b826106de565b9050919050565b600061071d82610700565b9050919050565b61072d81610712565b82525050565b60006020820190506107486000830184610724565b92915050565b600060208284031215610764576107636103dc565b5b600061077284828501610444565b91505092915050565b61078481610479565b82525050565b600060208201905061079f600083018461077b565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff8211156107ca576107c9610512565b5b602082029050602081019050919050565b600080fd5b60006107f36107ee846107af565b610572565b90508083825260208201905060208402830185811115610816576108156107db565b5b835b8181101561085d57803567ffffffffffffffff81111561083b5761083a6104f7565b5b808601610848898261060f565b85526020850194505050602081019050610818565b5050509392505050565b600082601f83011261087c5761087b6104f7565b5b813561088c8482602086016107e0565b91505092915050565b6000604082840312156108ab576108aa6107a5565b5b6108b56040610572565b905060006108c58482850161040a565b600083015250602082013567ffffffffffffffff8111156108e9576108e86107aa565b5b6108f584828501610867565b60208301525092915050565b600080600080600060a0868803121561091d5761091c6103dc565b5b600061092b8882890161040a565b955050602061093c88828901610444565b945050604086013567ffffffffffffffff81111561095d5761095c6103e1565b5b61096988828901610895565b935050606061097a888289016104e2565b925050608086013567ffffffffffffffff81111561099b5761099a6103e1565b5b6109a78882890161060f565b9150509295509295909350565b6000602082840312156109ca576109c96103dc565b5b600082013567ffffffffffffffff8111156109e8576109e76103e1565b5b6109f484828501610895565b91505092915050565b6000819050919050565b610a10816109fd565b82525050565b610a1f816104b7565b82525050565b6000604082019050610a3a6000830185610a07565b610a476020830184610a16565b9392505050565b610a57816103e6565b82525050565b610a668161041f565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610aa6578082015181840152602081019050610a8b565b83811115610ab5576000848401525b50505050565b6000610ac682610a6c565b610ad08185610a77565b9350610ae0818560208601610a88565b610ae981610501565b840191505092915050565b600060a082019050610b096000830188610a4e565b610b166020830187610a5d565b610b23604083018661077b565b610b306060830185610a16565b8181036080830152610b428184610abb565b90509695505050505050565b6000602082019050610b636000830184610a5d565b92915050565b600081519050610b788161048b565b92915050565b600060208284031215610b9457610b936103dc565b5b6000610ba284828501610b69565b91505092915050565b610bb4816103e6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000610c0282610a6c565b610c0c8185610be6565b9350610c1c818560208601610a88565b610c2581610501565b840191505092915050565b6000610c3c8383610bf7565b905092915050565b6000602082019050919050565b6000610c5c82610bba565b610c668185610bc5565b935083602082028501610c7885610bd6565b8060005b85811015610cb45784840389528151610c958582610c30565b9450610ca083610c44565b925060208a01995050600181019050610c7c565b50829750879550505050505092915050565b6000604083016000830151610cde6000860182610bab565b5060208301518482036020860152610cf68282610c51565b9150508091505092915050565b600060a082019050610d186000830188610a4e565b610d256020830187610a5d565b8181036040830152610d378186610cc6565b9050610d466060830185610a16565b8181036080830152610d588184610abb565b90509695505050505050565b60006020820190508181036000830152610d7e8184610cc6565b905092915050565b610d8f816109fd565b8114610d9a57600080fd5b50565b600081519050610dac81610d86565b92915050565b600081519050610dc1816104cb565b92915050565b60008060408385031215610dde57610ddd6103dc565b5b6000610dec85828601610d9d565b9250506020610dfd85828601610db2565b915050925092905056fea2646970667358221220f4c38984c6cc29dbcc2eaba10fd373f554e43032ce961ef414eb2edc3748591664736f6c63430008090033", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH2 0x806 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP CALLVALUE DUP1 ISZERO PUSH2 0x52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE3D DUP1 PUSH2 0x62 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x57 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x267D4062 EQ PUSH2 0x5C JUMPI DUP1 PUSH4 0x61FC548F EQ PUSH2 0x78 JUMPI DUP1 PUSH4 0x71B0EDFA EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0x9F89F03E EQ PUSH2 0xC6 JUMPI DUP1 PUSH4 0xF87F493F EQ PUSH2 0xE2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x76 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x71 SWAP2 SWAP1 PUSH2 0x63D JUMP JUMPDEST PUSH2 0x113 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x80 PUSH2 0x1AD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8D SWAP2 SWAP1 PUSH2 0x733 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xB0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xAB SWAP2 SWAP1 PUSH2 0x74E JUMP JUMPDEST PUSH2 0x1D1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBD SWAP2 SWAP1 PUSH2 0x78A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xDB SWAP2 SWAP1 PUSH2 0x901 JUMP JUMPDEST PUSH2 0x284 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFC PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xF7 SWAP2 SWAP1 PUSH2 0x9B4 JUMP JUMPDEST PUSH2 0x31E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10A SWAP3 SWAP2 SWAP1 PUSH2 0xA25 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x267D4062 DUP7 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x174 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xAF4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x71B0EDFA DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22D SWAP2 SWAP1 PUSH2 0xB4E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x245 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x259 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x27D SWAP2 SWAP1 PUSH2 0xB7E JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x9F89F03E DUP7 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2E5 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xD03 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x313 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF87F493F DUP5 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x37A SWAP2 SWAP1 PUSH2 0xD64 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x391 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3A5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3C9 SWAP2 SWAP1 PUSH2 0xDC7 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x3FC DUP2 PUSH2 0x3E6 JUMP JUMPDEST DUP2 EQ PUSH2 0x407 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x419 DUP2 PUSH2 0x3F3 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x436 DUP2 PUSH2 0x41F JUMP JUMPDEST DUP2 EQ PUSH2 0x441 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x453 DUP2 PUSH2 0x42D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x484 DUP3 PUSH2 0x459 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x494 DUP2 PUSH2 0x479 JUMP JUMPDEST DUP2 EQ PUSH2 0x49F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x4B1 DUP2 PUSH2 0x48B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x4D4 DUP2 PUSH2 0x4B7 JUMP JUMPDEST DUP2 EQ PUSH2 0x4DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x4F1 DUP2 PUSH2 0x4CB JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x54A DUP3 PUSH2 0x501 JUMP JUMPDEST DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x569 JUMPI PUSH2 0x568 PUSH2 0x512 JUMP JUMPDEST JUMPDEST DUP1 PUSH1 0x40 MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x57C PUSH2 0x3D2 JUMP JUMPDEST SWAP1 POP PUSH2 0x588 DUP3 DUP3 PUSH2 0x541 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5A8 JUMPI PUSH2 0x5A7 PUSH2 0x512 JUMP JUMPDEST JUMPDEST PUSH2 0x5B1 DUP3 PUSH2 0x501 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY PUSH1 0x0 DUP4 DUP4 ADD MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5E0 PUSH2 0x5DB DUP5 PUSH2 0x58D JUMP JUMPDEST PUSH2 0x572 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP5 DUP5 DUP5 ADD GT ISZERO PUSH2 0x5FC JUMPI PUSH2 0x5FB PUSH2 0x4FC JUMP JUMPDEST JUMPDEST PUSH2 0x607 DUP5 DUP3 DUP6 PUSH2 0x5BE JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x624 JUMPI PUSH2 0x623 PUSH2 0x4F7 JUMP JUMPDEST JUMPDEST DUP2 CALLDATALOAD PUSH2 0x634 DUP5 DUP3 PUSH1 0x20 DUP7 ADD PUSH2 0x5CD JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x659 JUMPI PUSH2 0x658 PUSH2 0x3DC JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x667 DUP9 DUP3 DUP10 ADD PUSH2 0x40A JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x678 DUP9 DUP3 DUP10 ADD PUSH2 0x444 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x689 DUP9 DUP3 DUP10 ADD PUSH2 0x4A2 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x69A DUP9 DUP3 DUP10 ADD PUSH2 0x4E2 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6BB JUMPI PUSH2 0x6BA PUSH2 0x3E1 JUMP JUMPDEST JUMPDEST PUSH2 0x6C7 DUP9 DUP3 DUP10 ADD PUSH2 0x60F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6F9 PUSH2 0x6F4 PUSH2 0x6EF DUP5 PUSH2 0x459 JUMP JUMPDEST PUSH2 0x6D4 JUMP JUMPDEST PUSH2 0x459 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x70B DUP3 PUSH2 0x6DE JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x71D DUP3 PUSH2 0x700 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x72D DUP2 PUSH2 0x712 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x748 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x724 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x764 JUMPI PUSH2 0x763 PUSH2 0x3DC JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x772 DUP5 DUP3 DUP6 ADD PUSH2 0x444 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x784 DUP2 PUSH2 0x479 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x79F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x77B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x7CA JUMPI PUSH2 0x7C9 PUSH2 0x512 JUMP JUMPDEST JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7F3 PUSH2 0x7EE DUP5 PUSH2 0x7AF JUMP JUMPDEST PUSH2 0x572 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH1 0x20 DUP5 MUL DUP4 ADD DUP6 DUP2 GT ISZERO PUSH2 0x816 JUMPI PUSH2 0x815 PUSH2 0x7DB JUMP JUMPDEST JUMPDEST DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x85D JUMPI DUP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x83B JUMPI PUSH2 0x83A PUSH2 0x4F7 JUMP JUMPDEST JUMPDEST DUP1 DUP7 ADD PUSH2 0x848 DUP10 DUP3 PUSH2 0x60F JUMP JUMPDEST DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP5 POP POP POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x818 JUMP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x87C JUMPI PUSH2 0x87B PUSH2 0x4F7 JUMP JUMPDEST JUMPDEST DUP2 CALLDATALOAD PUSH2 0x88C DUP5 DUP3 PUSH1 0x20 DUP7 ADD PUSH2 0x7E0 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8AB JUMPI PUSH2 0x8AA PUSH2 0x7A5 JUMP JUMPDEST JUMPDEST PUSH2 0x8B5 PUSH1 0x40 PUSH2 0x572 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x8C5 DUP5 DUP3 DUP6 ADD PUSH2 0x40A JUMP JUMPDEST PUSH1 0x0 DUP4 ADD MSTORE POP PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8E9 JUMPI PUSH2 0x8E8 PUSH2 0x7AA JUMP JUMPDEST JUMPDEST PUSH2 0x8F5 DUP5 DUP3 DUP6 ADD PUSH2 0x867 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x91D JUMPI PUSH2 0x91C PUSH2 0x3DC JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x92B DUP9 DUP3 DUP10 ADD PUSH2 0x40A JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x93C DUP9 DUP3 DUP10 ADD PUSH2 0x444 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x95D JUMPI PUSH2 0x95C PUSH2 0x3E1 JUMP JUMPDEST JUMPDEST PUSH2 0x969 DUP9 DUP3 DUP10 ADD PUSH2 0x895 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x97A DUP9 DUP3 DUP10 ADD PUSH2 0x4E2 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x99B JUMPI PUSH2 0x99A PUSH2 0x3E1 JUMP JUMPDEST JUMPDEST PUSH2 0x9A7 DUP9 DUP3 DUP10 ADD PUSH2 0x60F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x9CA JUMPI PUSH2 0x9C9 PUSH2 0x3DC JUMP JUMPDEST JUMPDEST PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x9E8 JUMPI PUSH2 0x9E7 PUSH2 0x3E1 JUMP JUMPDEST JUMPDEST PUSH2 0x9F4 DUP5 DUP3 DUP6 ADD PUSH2 0x895 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xA10 DUP2 PUSH2 0x9FD JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0xA1F DUP2 PUSH2 0x4B7 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0xA3A PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0xA07 JUMP JUMPDEST PUSH2 0xA47 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xA16 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xA57 DUP2 PUSH2 0x3E6 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0xA66 DUP2 PUSH2 0x41F JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xAA6 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xA8B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xAB5 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAC6 DUP3 PUSH2 0xA6C JUMP JUMPDEST PUSH2 0xAD0 DUP2 DUP6 PUSH2 0xA77 JUMP JUMPDEST SWAP4 POP PUSH2 0xAE0 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0xA88 JUMP JUMPDEST PUSH2 0xAE9 DUP2 PUSH2 0x501 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD SWAP1 POP PUSH2 0xB09 PUSH1 0x0 DUP4 ADD DUP9 PUSH2 0xA4E JUMP JUMPDEST PUSH2 0xB16 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0xA5D JUMP JUMPDEST PUSH2 0xB23 PUSH1 0x40 DUP4 ADD DUP7 PUSH2 0x77B JUMP JUMPDEST PUSH2 0xB30 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0xA16 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0xB42 DUP2 DUP5 PUSH2 0xABB JUMP JUMPDEST SWAP1 POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0xB63 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xA5D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xB78 DUP2 PUSH2 0x48B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB94 JUMPI PUSH2 0xB93 PUSH2 0x3DC JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xBA2 DUP5 DUP3 DUP6 ADD PUSH2 0xB69 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xBB4 DUP2 PUSH2 0x3E6 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC02 DUP3 PUSH2 0xA6C JUMP JUMPDEST PUSH2 0xC0C DUP2 DUP6 PUSH2 0xBE6 JUMP JUMPDEST SWAP4 POP PUSH2 0xC1C DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0xA88 JUMP JUMPDEST PUSH2 0xC25 DUP2 PUSH2 0x501 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC3C DUP4 DUP4 PUSH2 0xBF7 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC5C DUP3 PUSH2 0xBBA JUMP JUMPDEST PUSH2 0xC66 DUP2 DUP6 PUSH2 0xBC5 JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0xC78 DUP6 PUSH2 0xBD6 JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0xCB4 JUMPI DUP5 DUP5 SUB DUP10 MSTORE DUP2 MLOAD PUSH2 0xC95 DUP6 DUP3 PUSH2 0xC30 JUMP JUMPDEST SWAP5 POP PUSH2 0xCA0 DUP4 PUSH2 0xC44 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP11 ADD SWAP10 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0xC7C JUMP JUMPDEST POP DUP3 SWAP8 POP DUP8 SWAP6 POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0xCDE PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0xBAB JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0xCF6 DUP3 DUP3 PUSH2 0xC51 JUMP JUMPDEST SWAP2 POP POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD SWAP1 POP PUSH2 0xD18 PUSH1 0x0 DUP4 ADD DUP9 PUSH2 0xA4E JUMP JUMPDEST PUSH2 0xD25 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0xA5D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xD37 DUP2 DUP7 PUSH2 0xCC6 JUMP JUMPDEST SWAP1 POP PUSH2 0xD46 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0xA16 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0xD58 DUP2 DUP5 PUSH2 0xABB JUMP JUMPDEST SWAP1 POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0xD7E DUP2 DUP5 PUSH2 0xCC6 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xD8F DUP2 PUSH2 0x9FD JUMP JUMPDEST DUP2 EQ PUSH2 0xD9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xDAC DUP2 PUSH2 0xD86 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xDC1 DUP2 PUSH2 0x4CB JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xDDE JUMPI PUSH2 0xDDD PUSH2 0x3DC JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xDEC DUP6 DUP3 DUP7 ADD PUSH2 0xD9D JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xDFD DUP6 DUP3 DUP7 ADD PUSH2 0xDB2 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DELEGATECALL 0xC3 DUP10 DUP5 0xC6 0xCC 0x29 0xDB 0xCC 0x2E 0xAB LOG1 0xF 0xD3 PUSH20 0xF554E43032CE961EF414EB2EDC3748591664736F PUSH13 0x63430008090033000000000000 ", - "sourceMap": "2633:1652:0:-:0;;;2808:42;2757:94;;;;;;;;;;;;;;;;;;;;2633:1652;;;;;;;;;;;;;;;;" + "object": "60806040526108066000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005257600080fd5b50610e49806100626000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063267d40621461005c57806361fc548f1461007857806371b0edfa146100965780639f89f03e146100c6578063f87f493f146100e2575b600080fd5b61007660048036038101906100719190610628565b610114565b005b6100806101ae565b60405161008d919061071e565b60405180910390f35b6100b060048036038101906100ab9190610739565b6101d2565b6040516100bd9190610775565b60405180910390f35b6100e060048036038101906100db91906108ec565b610276565b005b6100fc60048036038101906100f7919061099f565b610310565b60405161010b93929190610a10565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663267d406286868686866040518663ffffffff1660e01b8152600401610175959493929190610aed565b600060405180830381600087803b15801561018f57600080fd5b505af11580156101a3573d6000803e3d6000fd5b505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166371b0edfa836040518263ffffffff1660e01b815260040161022e9190610b47565b602060405180830381865afa15801561024b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026f9190610b77565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639f89f03e86868686866040518663ffffffff1660e01b81526004016102d7959493929190610cfc565b600060405180830381600087803b1580156102f157600080fd5b505af1158015610305573d6000803e3d6000fd5b505050505050505050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f87f493f856040518263ffffffff1660e01b815260040161036f9190610d5d565b606060405180830381865afa15801561038c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b09190610dc0565b9250925092509193909250565b6000604051905090565b600080fd5b600080fd5b600060ff82169050919050565b6103e7816103d1565b81146103f257600080fd5b50565b600081359050610404816103de565b92915050565b600061ffff82169050919050565b6104218161040a565b811461042c57600080fd5b50565b60008135905061043e81610418565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061046f82610444565b9050919050565b61047f81610464565b811461048a57600080fd5b50565b60008135905061049c81610476565b92915050565b600067ffffffffffffffff82169050919050565b6104bf816104a2565b81146104ca57600080fd5b50565b6000813590506104dc816104b6565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610535826104ec565b810181811067ffffffffffffffff82111715610554576105536104fd565b5b80604052505050565b60006105676103bd565b9050610573828261052c565b919050565b600067ffffffffffffffff821115610593576105926104fd565b5b61059c826104ec565b9050602081019050919050565b82818337600083830152505050565b60006105cb6105c684610578565b61055d565b9050828152602081018484840111156105e7576105e66104e7565b5b6105f28482856105a9565b509392505050565b600082601f83011261060f5761060e6104e2565b5b813561061f8482602086016105b8565b91505092915050565b600080600080600060a08688031215610644576106436103c7565b5b6000610652888289016103f5565b95505060206106638882890161042f565b94505060406106748882890161048d565b9350506060610685888289016104cd565b925050608086013567ffffffffffffffff8111156106a6576106a56103cc565b5b6106b2888289016105fa565b9150509295509295909350565b6000819050919050565b60006106e46106df6106da84610444565b6106bf565b610444565b9050919050565b60006106f6826106c9565b9050919050565b6000610708826106eb565b9050919050565b610718816106fd565b82525050565b6000602082019050610733600083018461070f565b92915050565b60006020828403121561074f5761074e6103c7565b5b600061075d8482850161042f565b91505092915050565b61076f81610464565b82525050565b600060208201905061078a6000830184610766565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff8211156107b5576107b46104fd565b5b602082029050602081019050919050565b600080fd5b60006107de6107d98461079a565b61055d565b90508083825260208201905060208402830185811115610801576108006107c6565b5b835b8181101561084857803567ffffffffffffffff811115610826576108256104e2565b5b80860161083389826105fa565b85526020850194505050602081019050610803565b5050509392505050565b600082601f830112610867576108666104e2565b5b81356108778482602086016107cb565b91505092915050565b60006040828403121561089657610895610790565b5b6108a0604061055d565b905060006108b0848285016103f5565b600083015250602082013567ffffffffffffffff8111156108d4576108d3610795565b5b6108e084828501610852565b60208301525092915050565b600080600080600060a08688031215610908576109076103c7565b5b6000610916888289016103f5565b95505060206109278882890161042f565b945050604086013567ffffffffffffffff811115610948576109476103cc565b5b61095488828901610880565b9350506060610965888289016104cd565b925050608086013567ffffffffffffffff811115610986576109856103cc565b5b610992888289016105fa565b9150509295509295909350565b6000602082840312156109b5576109b46103c7565b5b600082013567ffffffffffffffff8111156109d3576109d26103cc565b5b6109df84828501610880565b91505092915050565b6109f1816104a2565b82525050565b6000819050919050565b610a0a816109f7565b82525050565b6000606082019050610a2560008301866109e8565b610a326020830185610a01565b610a3f60408301846109e8565b949350505050565b610a50816103d1565b82525050565b610a5f8161040a565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610a9f578082015181840152602081019050610a84565b83811115610aae576000848401525b50505050565b6000610abf82610a65565b610ac98185610a70565b9350610ad9818560208601610a81565b610ae2816104ec565b840191505092915050565b600060a082019050610b026000830188610a47565b610b0f6020830187610a56565b610b1c6040830186610766565b610b2960608301856109e8565b8181036080830152610b3b8184610ab4565b90509695505050505050565b6000602082019050610b5c6000830184610a56565b92915050565b600081519050610b7181610476565b92915050565b600060208284031215610b8d57610b8c6103c7565b5b6000610b9b84828501610b62565b91505092915050565b610bad816103d1565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000610bfb82610a65565b610c058185610bdf565b9350610c15818560208601610a81565b610c1e816104ec565b840191505092915050565b6000610c358383610bf0565b905092915050565b6000602082019050919050565b6000610c5582610bb3565b610c5f8185610bbe565b935083602082028501610c7185610bcf565b8060005b85811015610cad5784840389528151610c8e8582610c29565b9450610c9983610c3d565b925060208a01995050600181019050610c75565b50829750879550505050505092915050565b6000604083016000830151610cd76000860182610ba4565b5060208301518482036020860152610cef8282610c4a565b9150508091505092915050565b600060a082019050610d116000830188610a47565b610d1e6020830187610a56565b8181036040830152610d308186610cbf565b9050610d3f60608301856109e8565b8181036080830152610d518184610ab4565b90509695505050505050565b60006020820190508181036000830152610d778184610cbf565b905092915050565b600081519050610d8e816104b6565b92915050565b610d9d816109f7565b8114610da857600080fd5b50565b600081519050610dba81610d94565b92915050565b600080600060608486031215610dd957610dd86103c7565b5b6000610de786828701610d7f565b9350506020610df886828701610dab565b9250506040610e0986828701610d7f565b915050925092509256fea26469706673582212200c97281bd15caba3cc6efa4a076e6f49a63c3b3c013798a44e77679bfec3fec964736f6c634300080a0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH2 0x806 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP CALLVALUE DUP1 ISZERO PUSH2 0x52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE49 DUP1 PUSH2 0x62 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x57 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x267D4062 EQ PUSH2 0x5C JUMPI DUP1 PUSH4 0x61FC548F EQ PUSH2 0x78 JUMPI DUP1 PUSH4 0x71B0EDFA EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0x9F89F03E EQ PUSH2 0xC6 JUMPI DUP1 PUSH4 0xF87F493F EQ PUSH2 0xE2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x76 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x71 SWAP2 SWAP1 PUSH2 0x628 JUMP JUMPDEST PUSH2 0x114 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x80 PUSH2 0x1AE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8D SWAP2 SWAP1 PUSH2 0x71E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xB0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xAB SWAP2 SWAP1 PUSH2 0x739 JUMP JUMPDEST PUSH2 0x1D2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBD SWAP2 SWAP1 PUSH2 0x775 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xDB SWAP2 SWAP1 PUSH2 0x8EC JUMP JUMPDEST PUSH2 0x276 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFC PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xF7 SWAP2 SWAP1 PUSH2 0x99F JUMP JUMPDEST PUSH2 0x310 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xA10 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x267D4062 DUP7 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x175 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xAED JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x71B0EDFA DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22E SWAP2 SWAP1 PUSH2 0xB47 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x24B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x26F SWAP2 SWAP1 PUSH2 0xB77 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x9F89F03E DUP7 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xCFC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x305 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF87F493F DUP6 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x36F SWAP2 SWAP1 PUSH2 0xD5D JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x38C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3B0 SWAP2 SWAP1 PUSH2 0xDC0 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x3E7 DUP2 PUSH2 0x3D1 JUMP JUMPDEST DUP2 EQ PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x404 DUP2 PUSH2 0x3DE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x421 DUP2 PUSH2 0x40A JUMP JUMPDEST DUP2 EQ PUSH2 0x42C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x43E DUP2 PUSH2 0x418 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x46F DUP3 PUSH2 0x444 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x47F DUP2 PUSH2 0x464 JUMP JUMPDEST DUP2 EQ PUSH2 0x48A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x49C DUP2 PUSH2 0x476 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x4BF DUP2 PUSH2 0x4A2 JUMP JUMPDEST DUP2 EQ PUSH2 0x4CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x4DC DUP2 PUSH2 0x4B6 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x535 DUP3 PUSH2 0x4EC JUMP JUMPDEST DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x554 JUMPI PUSH2 0x553 PUSH2 0x4FD JUMP JUMPDEST JUMPDEST DUP1 PUSH1 0x40 MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x567 PUSH2 0x3BD JUMP JUMPDEST SWAP1 POP PUSH2 0x573 DUP3 DUP3 PUSH2 0x52C JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x593 JUMPI PUSH2 0x592 PUSH2 0x4FD JUMP JUMPDEST JUMPDEST PUSH2 0x59C DUP3 PUSH2 0x4EC JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY PUSH1 0x0 DUP4 DUP4 ADD MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5CB PUSH2 0x5C6 DUP5 PUSH2 0x578 JUMP JUMPDEST PUSH2 0x55D JUMP JUMPDEST SWAP1 POP DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP5 DUP5 DUP5 ADD GT ISZERO PUSH2 0x5E7 JUMPI PUSH2 0x5E6 PUSH2 0x4E7 JUMP JUMPDEST JUMPDEST PUSH2 0x5F2 DUP5 DUP3 DUP6 PUSH2 0x5A9 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x60F JUMPI PUSH2 0x60E PUSH2 0x4E2 JUMP JUMPDEST JUMPDEST DUP2 CALLDATALOAD PUSH2 0x61F DUP5 DUP3 PUSH1 0x20 DUP7 ADD PUSH2 0x5B8 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x644 JUMPI PUSH2 0x643 PUSH2 0x3C7 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x652 DUP9 DUP3 DUP10 ADD PUSH2 0x3F5 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x663 DUP9 DUP3 DUP10 ADD PUSH2 0x42F JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x674 DUP9 DUP3 DUP10 ADD PUSH2 0x48D JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x685 DUP9 DUP3 DUP10 ADD PUSH2 0x4CD JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6A6 JUMPI PUSH2 0x6A5 PUSH2 0x3CC JUMP JUMPDEST JUMPDEST PUSH2 0x6B2 DUP9 DUP3 DUP10 ADD PUSH2 0x5FA JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6E4 PUSH2 0x6DF PUSH2 0x6DA DUP5 PUSH2 0x444 JUMP JUMPDEST PUSH2 0x6BF JUMP JUMPDEST PUSH2 0x444 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6F6 DUP3 PUSH2 0x6C9 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x708 DUP3 PUSH2 0x6EB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x718 DUP2 PUSH2 0x6FD JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x733 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x70F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x74F JUMPI PUSH2 0x74E PUSH2 0x3C7 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x75D DUP5 DUP3 DUP6 ADD PUSH2 0x42F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x76F DUP2 PUSH2 0x464 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x78A PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x766 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x7B5 JUMPI PUSH2 0x7B4 PUSH2 0x4FD JUMP JUMPDEST JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7DE PUSH2 0x7D9 DUP5 PUSH2 0x79A JUMP JUMPDEST PUSH2 0x55D JUMP JUMPDEST SWAP1 POP DUP1 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH1 0x20 DUP5 MUL DUP4 ADD DUP6 DUP2 GT ISZERO PUSH2 0x801 JUMPI PUSH2 0x800 PUSH2 0x7C6 JUMP JUMPDEST JUMPDEST DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x848 JUMPI DUP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x826 JUMPI PUSH2 0x825 PUSH2 0x4E2 JUMP JUMPDEST JUMPDEST DUP1 DUP7 ADD PUSH2 0x833 DUP10 DUP3 PUSH2 0x5FA JUMP JUMPDEST DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP5 POP POP POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x803 JUMP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x867 JUMPI PUSH2 0x866 PUSH2 0x4E2 JUMP JUMPDEST JUMPDEST DUP2 CALLDATALOAD PUSH2 0x877 DUP5 DUP3 PUSH1 0x20 DUP7 ADD PUSH2 0x7CB JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x896 JUMPI PUSH2 0x895 PUSH2 0x790 JUMP JUMPDEST JUMPDEST PUSH2 0x8A0 PUSH1 0x40 PUSH2 0x55D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x8B0 DUP5 DUP3 DUP6 ADD PUSH2 0x3F5 JUMP JUMPDEST PUSH1 0x0 DUP4 ADD MSTORE POP PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8D4 JUMPI PUSH2 0x8D3 PUSH2 0x795 JUMP JUMPDEST JUMPDEST PUSH2 0x8E0 DUP5 DUP3 DUP6 ADD PUSH2 0x852 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x908 JUMPI PUSH2 0x907 PUSH2 0x3C7 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x916 DUP9 DUP3 DUP10 ADD PUSH2 0x3F5 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x927 DUP9 DUP3 DUP10 ADD PUSH2 0x42F JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x948 JUMPI PUSH2 0x947 PUSH2 0x3CC JUMP JUMPDEST JUMPDEST PUSH2 0x954 DUP9 DUP3 DUP10 ADD PUSH2 0x880 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x965 DUP9 DUP3 DUP10 ADD PUSH2 0x4CD JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x986 JUMPI PUSH2 0x985 PUSH2 0x3CC JUMP JUMPDEST JUMPDEST PUSH2 0x992 DUP9 DUP3 DUP10 ADD PUSH2 0x5FA JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x9B5 JUMPI PUSH2 0x9B4 PUSH2 0x3C7 JUMP JUMPDEST JUMPDEST PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x9D3 JUMPI PUSH2 0x9D2 PUSH2 0x3CC JUMP JUMPDEST JUMPDEST PUSH2 0x9DF DUP5 DUP3 DUP6 ADD PUSH2 0x880 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x9F1 DUP2 PUSH2 0x4A2 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xA0A DUP2 PUSH2 0x9F7 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 ADD SWAP1 POP PUSH2 0xA25 PUSH1 0x0 DUP4 ADD DUP7 PUSH2 0x9E8 JUMP JUMPDEST PUSH2 0xA32 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xA01 JUMP JUMPDEST PUSH2 0xA3F PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x9E8 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xA50 DUP2 PUSH2 0x3D1 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0xA5F DUP2 PUSH2 0x40A JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA9F JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xA84 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xAAE JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xABF DUP3 PUSH2 0xA65 JUMP JUMPDEST PUSH2 0xAC9 DUP2 DUP6 PUSH2 0xA70 JUMP JUMPDEST SWAP4 POP PUSH2 0xAD9 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0xA81 JUMP JUMPDEST PUSH2 0xAE2 DUP2 PUSH2 0x4EC JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD SWAP1 POP PUSH2 0xB02 PUSH1 0x0 DUP4 ADD DUP9 PUSH2 0xA47 JUMP JUMPDEST PUSH2 0xB0F PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0xA56 JUMP JUMPDEST PUSH2 0xB1C PUSH1 0x40 DUP4 ADD DUP7 PUSH2 0x766 JUMP JUMPDEST PUSH2 0xB29 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x9E8 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0xB3B DUP2 DUP5 PUSH2 0xAB4 JUMP JUMPDEST SWAP1 POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0xB5C PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xA56 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xB71 DUP2 PUSH2 0x476 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB8D JUMPI PUSH2 0xB8C PUSH2 0x3C7 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xB9B DUP5 DUP3 DUP6 ADD PUSH2 0xB62 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xBAD DUP2 PUSH2 0x3D1 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBFB DUP3 PUSH2 0xA65 JUMP JUMPDEST PUSH2 0xC05 DUP2 DUP6 PUSH2 0xBDF JUMP JUMPDEST SWAP4 POP PUSH2 0xC15 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0xA81 JUMP JUMPDEST PUSH2 0xC1E DUP2 PUSH2 0x4EC JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC35 DUP4 DUP4 PUSH2 0xBF0 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC55 DUP3 PUSH2 0xBB3 JUMP JUMPDEST PUSH2 0xC5F DUP2 DUP6 PUSH2 0xBBE JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0xC71 DUP6 PUSH2 0xBCF JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0xCAD JUMPI DUP5 DUP5 SUB DUP10 MSTORE DUP2 MLOAD PUSH2 0xC8E DUP6 DUP3 PUSH2 0xC29 JUMP JUMPDEST SWAP5 POP PUSH2 0xC99 DUP4 PUSH2 0xC3D JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP11 ADD SWAP10 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0xC75 JUMP JUMPDEST POP DUP3 SWAP8 POP DUP8 SWAP6 POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0xCD7 PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0xBA4 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0xCEF DUP3 DUP3 PUSH2 0xC4A JUMP JUMPDEST SWAP2 POP POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD SWAP1 POP PUSH2 0xD11 PUSH1 0x0 DUP4 ADD DUP9 PUSH2 0xA47 JUMP JUMPDEST PUSH2 0xD1E PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0xA56 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xD30 DUP2 DUP7 PUSH2 0xCBF JUMP JUMPDEST SWAP1 POP PUSH2 0xD3F PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x9E8 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0xD51 DUP2 DUP5 PUSH2 0xAB4 JUMP JUMPDEST SWAP1 POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0xD77 DUP2 DUP5 PUSH2 0xCBF JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xD8E DUP2 PUSH2 0x4B6 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xD9D DUP2 PUSH2 0x9F7 JUMP JUMPDEST DUP2 EQ PUSH2 0xDA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xDBA DUP2 PUSH2 0xD94 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xDD9 JUMPI PUSH2 0xDD8 PUSH2 0x3C7 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xDE7 DUP7 DUP3 DUP8 ADD PUSH2 0xD7F JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0xDF8 DUP7 DUP3 DUP8 ADD PUSH2 0xDAB JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0xE09 DUP7 DUP3 DUP8 ADD PUSH2 0xD7F JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC SWAP8 0x28 SHL 0xD1 0x5C 0xAB LOG3 0xCC PUSH15 0xFA4A076E6F49A63C3B3C013798A44E PUSH24 0x679BFEC3FEC964736F6C634300080A003300000000000000 ", + "sourceMap": "2664:1682:0:-:0;;;2839:42;2788:94;;;;;;;;;;;;;;;;;;;;2664:1682;;;;;;;;;;;;;;;;" }, "deployedBytecode": { "functionDebugData": { - "@index_to_account_80": { - "entryPoint": 465, - "id": 80, + "@index_to_account_82": { + "entryPoint": 466, + "id": 82, "parameterSlots": 1, "returnSlots": 1 }, - "@transact_info_97": { - "entryPoint": 798, - "id": 97, + "@transact_info_101": { + "entryPoint": 784, + "id": 101, "parameterSlots": 1, - "returnSlots": 2 + "returnSlots": 3 }, - "@transact_through_derivative_148": { - "entryPoint": 275, - "id": 148, + "@transact_through_derivative_152": { + "entryPoint": 276, + "id": 152, "parameterSlots": 5, "returnSlots": 0 }, - "@transact_through_derivative_multilocation_123": { - "entryPoint": 644, - "id": 123, + "@transact_through_derivative_multilocation_127": { + "entryPoint": 630, + "id": 127, "parameterSlots": 5, "returnSlots": 0 }, - "@xcmtransactor_66": { - "entryPoint": 429, - "id": 66, + "@xcmtransactor_68": { + "entryPoint": 430, + "id": 68, "parameterSlots": 0, "returnSlots": 0 }, "abi_decode_available_length_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr": { - "entryPoint": 2016, + "entryPoint": 1995, "id": null, "parameterSlots": 3, "returnSlots": 1 }, "abi_decode_available_length_t_bytes_memory_ptr": { - "entryPoint": 1485, + "entryPoint": 1464, "id": null, "parameterSlots": 3, "returnSlots": 1 }, "abi_decode_t_address": { - "entryPoint": 1186, + "entryPoint": 1165, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_decode_t_address_fromMemory": { - "entryPoint": 2921, + "entryPoint": 2914, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_decode_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr": { - "entryPoint": 2151, + "entryPoint": 2130, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_decode_t_bytes_memory_ptr": { - "entryPoint": 1551, + "entryPoint": 1530, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_decode_t_struct$_Multilocation_$8_memory_ptr": { - "entryPoint": 2197, + "entryPoint": 2176, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_decode_t_uint16": { - "entryPoint": 1092, + "entryPoint": 1071, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_decode_t_uint256_fromMemory": { - "entryPoint": 3485, + "entryPoint": 3499, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_decode_t_uint64": { - "entryPoint": 1250, + "entryPoint": 1229, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_decode_t_uint64_fromMemory": { - "entryPoint": 3506, + "entryPoint": 3455, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_decode_t_uint8": { - "entryPoint": 1034, + "entryPoint": 1013, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_decode_tuple_t_address_fromMemory": { - "entryPoint": 2942, + "entryPoint": 2935, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_decode_tuple_t_struct$_Multilocation_$8_memory_ptr": { - "entryPoint": 2484, + "entryPoint": 2463, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_decode_tuple_t_uint16": { - "entryPoint": 1870, + "entryPoint": 1849, "id": null, "parameterSlots": 2, "returnSlots": 1 }, - "abi_decode_tuple_t_uint256t_uint64_fromMemory": { - "entryPoint": 3527, + "abi_decode_tuple_t_uint64t_uint256t_uint64_fromMemory": { + "entryPoint": 3520, "id": null, "parameterSlots": 2, - "returnSlots": 2 + "returnSlots": 3 }, "abi_decode_tuple_t_uint8t_uint16t_addresst_uint64t_bytes_memory_ptr": { - "entryPoint": 1597, + "entryPoint": 1576, "id": null, "parameterSlots": 2, "returnSlots": 5 }, "abi_decode_tuple_t_uint8t_uint16t_struct$_Multilocation_$8_memory_ptrt_uint64t_bytes_memory_ptr": { - "entryPoint": 2305, + "entryPoint": 2284, "id": null, "parameterSlots": 2, "returnSlots": 5 }, "abi_encodeUpdatedPos_t_bytes_memory_ptr_to_t_bytes_memory_ptr": { - "entryPoint": 3120, + "entryPoint": 3113, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_encode_t_address_to_t_address_fromStack": { - "entryPoint": 1915, + "entryPoint": 1894, "id": null, "parameterSlots": 2, "returnSlots": 0 }, "abi_encode_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_to_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr": { - "entryPoint": 3153, + "entryPoint": 3146, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr": { - "entryPoint": 3063, + "entryPoint": 3056, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr_fromStack": { - "entryPoint": 2747, + "entryPoint": 2740, "id": null, "parameterSlots": 2, "returnSlots": 1 }, - "abi_encode_t_contract$_XcmTransactor_$57_to_t_address_fromStack": { - "entryPoint": 1828, + "abi_encode_t_contract$_XcmTransactor_$59_to_t_address_fromStack": { + "entryPoint": 1807, "id": null, "parameterSlots": 2, "returnSlots": 0 }, "abi_encode_t_struct$_Multilocation_$8_memory_ptr_to_t_struct$_Multilocation_$8_memory_ptr_fromStack": { - "entryPoint": 3270, + "entryPoint": 3263, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_encode_t_uint16_to_t_uint16_fromStack": { - "entryPoint": 2653, + "entryPoint": 2646, "id": null, "parameterSlots": 2, "returnSlots": 0 }, "abi_encode_t_uint256_to_t_uint256_fromStack": { - "entryPoint": 2567, + "entryPoint": 2561, "id": null, "parameterSlots": 2, "returnSlots": 0 }, "abi_encode_t_uint64_to_t_uint64_fromStack": { - "entryPoint": 2582, + "entryPoint": 2536, "id": null, "parameterSlots": 2, "returnSlots": 0 }, "abi_encode_t_uint8_to_t_uint8": { - "entryPoint": 2987, + "entryPoint": 2980, "id": null, "parameterSlots": 2, "returnSlots": 0 }, "abi_encode_t_uint8_to_t_uint8_fromStack": { - "entryPoint": 2638, + "entryPoint": 2631, "id": null, "parameterSlots": 2, "returnSlots": 0 }, "abi_encode_tuple_t_address__to_t_address__fromStack_reversed": { - "entryPoint": 1930, + "entryPoint": 1909, "id": null, "parameterSlots": 2, "returnSlots": 1 }, - "abi_encode_tuple_t_contract$_XcmTransactor_$57__to_t_address__fromStack_reversed": { - "entryPoint": 1843, + "abi_encode_tuple_t_contract$_XcmTransactor_$59__to_t_address__fromStack_reversed": { + "entryPoint": 1822, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_encode_tuple_t_struct$_Multilocation_$8_memory_ptr__to_t_struct$_Multilocation_$8_memory_ptr__fromStack_reversed": { - "entryPoint": 3428, + "entryPoint": 3421, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "abi_encode_tuple_t_uint16__to_t_uint16__fromStack_reversed": { - "entryPoint": 2894, + "entryPoint": 2887, "id": null, "parameterSlots": 2, "returnSlots": 1 }, - "abi_encode_tuple_t_uint256_t_uint64__to_t_uint256_t_uint64__fromStack_reversed": { - "entryPoint": 2597, + "abi_encode_tuple_t_uint64_t_uint256_t_uint64__to_t_uint64_t_uint256_t_uint64__fromStack_reversed": { + "entryPoint": 2576, "id": null, - "parameterSlots": 3, + "parameterSlots": 4, "returnSlots": 1 }, "abi_encode_tuple_t_uint8_t_uint16_t_address_t_uint64_t_bytes_memory_ptr__to_t_uint8_t_uint16_t_address_t_uint64_t_bytes_memory_ptr__fromStack_reversed": { - "entryPoint": 2804, + "entryPoint": 2797, "id": null, "parameterSlots": 6, "returnSlots": 1 }, "abi_encode_tuple_t_uint8_t_uint16_t_struct$_Multilocation_$8_memory_ptr_t_uint64_t_bytes_memory_ptr__to_t_uint8_t_uint16_t_struct$_Multilocation_$8_memory_ptr_t_uint64_t_bytes_memory_ptr__fromStack_reversed": { - "entryPoint": 3331, + "entryPoint": 3324, "id": null, "parameterSlots": 6, "returnSlots": 1 }, "allocate_memory": { - "entryPoint": 1394, + "entryPoint": 1373, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "allocate_unbounded": { - "entryPoint": 978, + "entryPoint": 957, "id": null, "parameterSlots": 0, "returnSlots": 1 }, "array_allocation_size_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr": { - "entryPoint": 1967, + "entryPoint": 1946, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "array_allocation_size_t_bytes_memory_ptr": { - "entryPoint": 1421, + "entryPoint": 1400, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "array_dataslot_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr": { - "entryPoint": 3030, + "entryPoint": 3023, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "array_length_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr": { - "entryPoint": 3002, + "entryPoint": 2995, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "array_length_t_bytes_memory_ptr": { - "entryPoint": 2668, + "entryPoint": 2661, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "array_nextElement_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr": { - "entryPoint": 3140, + "entryPoint": 3133, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "array_storeLengthForEncoding_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr": { - "entryPoint": 3013, + "entryPoint": 3006, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "array_storeLengthForEncoding_t_bytes_memory_ptr": { - "entryPoint": 3046, + "entryPoint": 3039, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "array_storeLengthForEncoding_t_bytes_memory_ptr_fromStack": { - "entryPoint": 2679, + "entryPoint": 2672, "id": null, "parameterSlots": 2, "returnSlots": 1 }, "cleanup_t_address": { - "entryPoint": 1145, + "entryPoint": 1124, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "cleanup_t_uint16": { - "entryPoint": 1055, + "entryPoint": 1034, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "cleanup_t_uint160": { - "entryPoint": 1113, + "entryPoint": 1092, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "cleanup_t_uint256": { - "entryPoint": 2557, + "entryPoint": 2551, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "cleanup_t_uint64": { - "entryPoint": 1207, + "entryPoint": 1186, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "cleanup_t_uint8": { - "entryPoint": 998, + "entryPoint": 977, "id": null, "parameterSlots": 1, "returnSlots": 1 }, - "convert_t_contract$_XcmTransactor_$57_to_t_address": { - "entryPoint": 1810, + "convert_t_contract$_XcmTransactor_$59_to_t_address": { + "entryPoint": 1789, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "convert_t_uint160_to_t_address": { - "entryPoint": 1792, + "entryPoint": 1771, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "convert_t_uint160_to_t_uint160": { - "entryPoint": 1758, + "entryPoint": 1737, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "copy_calldata_to_memory": { - "entryPoint": 1470, + "entryPoint": 1449, "id": null, "parameterSlots": 3, "returnSlots": 0 }, "copy_memory_to_memory": { - "entryPoint": 2696, + "entryPoint": 2689, "id": null, "parameterSlots": 3, "returnSlots": 0 }, "finalize_allocation": { - "entryPoint": 1345, + "entryPoint": 1324, "id": null, "parameterSlots": 2, "returnSlots": 0 }, "identity": { - "entryPoint": 1748, + "entryPoint": 1727, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "panic_error_0x41": { - "entryPoint": 1298, + "entryPoint": 1277, "id": null, "parameterSlots": 0, "returnSlots": 0 }, "revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d": { - "entryPoint": 1271, + "entryPoint": 1250, "id": null, "parameterSlots": 0, "returnSlots": 0 }, "revert_error_3538a459e4a0eb828f1aed5ebe5dc96fe59620a31d9b33e41259bb820cae769f": { - "entryPoint": 1957, + "entryPoint": 1936, "id": null, "parameterSlots": 0, "returnSlots": 0 }, "revert_error_5e8f644817bc4960744f35c15999b6eff64ae702f94b1c46297cfd4e1aec2421": { - "entryPoint": 1962, + "entryPoint": 1941, "id": null, "parameterSlots": 0, "returnSlots": 0 }, "revert_error_81385d8c0b31fffe14be1da910c8bd3a80be4cfa248e04f42ec0faea3132a8ef": { - "entryPoint": 2011, + "entryPoint": 1990, "id": null, "parameterSlots": 0, "returnSlots": 0 }, "revert_error_987264b3b1d58a9c7f8255e93e81c77d86d6299019c33110a076957a3e06e2ae": { - "entryPoint": 1276, + "entryPoint": 1255, "id": null, "parameterSlots": 0, "returnSlots": 0 }, "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { - "entryPoint": 993, + "entryPoint": 972, "id": null, "parameterSlots": 0, "returnSlots": 0 }, "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { - "entryPoint": 988, + "entryPoint": 967, "id": null, "parameterSlots": 0, "returnSlots": 0 }, "round_up_to_mul_of_32": { - "entryPoint": 1281, + "entryPoint": 1260, "id": null, "parameterSlots": 1, "returnSlots": 1 }, "validator_revert_t_address": { - "entryPoint": 1163, + "entryPoint": 1142, "id": null, "parameterSlots": 1, "returnSlots": 0 }, "validator_revert_t_uint16": { - "entryPoint": 1069, + "entryPoint": 1048, "id": null, "parameterSlots": 1, "returnSlots": 0 }, "validator_revert_t_uint256": { - "entryPoint": 3462, + "entryPoint": 3476, "id": null, "parameterSlots": 1, "returnSlots": 0 }, "validator_revert_t_uint64": { - "entryPoint": 1227, + "entryPoint": 1206, "id": null, "parameterSlots": 1, "returnSlots": 0 }, "validator_revert_t_uint8": { - "entryPoint": 1011, + "entryPoint": 990, "id": null, "parameterSlots": 1, "returnSlots": 0 @@ -626,7 +627,7 @@ { "ast": { "nodeType": "YulBlock", - "src": "0:20315:1", + "src": "0:20575:1", "statements": [ { "body": { @@ -3717,7 +3718,7 @@ } ] }, - "name": "convert_t_contract$_XcmTransactor_$57_to_t_address", + "name": "convert_t_contract$_XcmTransactor_$59_to_t_address", "nodeType": "YulFunctionDefinition", "parameters": [ { @@ -3759,7 +3760,7 @@ } ], "functionName": { - "name": "convert_t_contract$_XcmTransactor_$57_to_t_address", + "name": "convert_t_contract$_XcmTransactor_$59_to_t_address", "nodeType": "YulIdentifier", "src": "5838:50:1" }, @@ -3780,7 +3781,7 @@ } ] }, - "name": "abi_encode_t_contract$_XcmTransactor_$57_to_t_address_fromStack", + "name": "abi_encode_t_contract$_XcmTransactor_$59_to_t_address_fromStack", "nodeType": "YulFunctionDefinition", "parameters": [ { @@ -3870,7 +3871,7 @@ } ], "functionName": { - "name": "abi_encode_t_contract$_XcmTransactor_$57_to_t_address_fromStack", + "name": "abi_encode_t_contract$_XcmTransactor_$59_to_t_address_fromStack", "nodeType": "YulIdentifier", "src": "6072:63:1" }, @@ -3882,7 +3883,7 @@ } ] }, - "name": "abi_encode_tuple_t_contract$_XcmTransactor_$57__to_t_address__fromStack_reversed", + "name": "abi_encode_tuple_t_contract$_XcmTransactor_$59__to_t_address__fromStack_reversed", "nodeType": "YulFunctionDefinition", "parameters": [ { @@ -6504,50 +6505,7 @@ { "body": { "nodeType": "YulBlock", - "src": "11651:32:1", - "statements": [ - { - "nodeType": "YulAssignment", - "src": "11661:16:1", - "value": { - "name": "value", - "nodeType": "YulIdentifier", - "src": "11672:5:1" - }, - "variableNames": [ - { - "name": "cleaned", - "nodeType": "YulIdentifier", - "src": "11661:7:1" - } - ] - } - ] - }, - "name": "cleanup_t_uint256", - "nodeType": "YulFunctionDefinition", - "parameters": [ - { - "name": "value", - "nodeType": "YulTypedName", - "src": "11633:5:1", - "type": "" - } - ], - "returnVariables": [ - { - "name": "cleaned", - "nodeType": "YulTypedName", - "src": "11643:7:1", - "type": "" - } - ], - "src": "11606:77:1" - }, - { - "body": { - "nodeType": "YulBlock", - "src": "11754:53:1", + "src": "11669:52:1", "statements": [ { "expression": { @@ -6555,60 +6513,103 @@ { "name": "pos", "nodeType": "YulIdentifier", - "src": "11771:3:1" + "src": "11686:3:1" }, { "arguments": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "11794:5:1" + "src": "11708:5:1" } ], "functionName": { - "name": "cleanup_t_uint256", + "name": "cleanup_t_uint64", "nodeType": "YulIdentifier", - "src": "11776:17:1" + "src": "11691:16:1" }, "nodeType": "YulFunctionCall", - "src": "11776:24:1" + "src": "11691:23:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "11764:6:1" + "src": "11679:6:1" }, "nodeType": "YulFunctionCall", - "src": "11764:37:1" + "src": "11679:36:1" }, "nodeType": "YulExpressionStatement", - "src": "11764:37:1" + "src": "11679:36:1" } ] }, - "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "name": "abi_encode_t_uint64_to_t_uint64_fromStack", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "value", "nodeType": "YulTypedName", - "src": "11742:5:1", + "src": "11657:5:1", "type": "" }, { "name": "pos", "nodeType": "YulTypedName", - "src": "11749:3:1", + "src": "11664:3:1", + "type": "" + } + ], + "src": "11606:115:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11772:32:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "11782:16:1", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "11793:5:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "11782:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "11754:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "11764:7:1", "type": "" } ], - "src": "11689:118:1" + "src": "11727:77:1" }, { "body": { "nodeType": "YulBlock", - "src": "11876:52:1", + "src": "11875:53:1", "statements": [ { "expression": { @@ -6616,7 +6617,7 @@ { "name": "pos", "nodeType": "YulIdentifier", - "src": "11893:3:1" + "src": "11892:3:1" }, { "arguments": [ @@ -6627,81 +6628,81 @@ } ], "functionName": { - "name": "cleanup_t_uint64", + "name": "cleanup_t_uint256", "nodeType": "YulIdentifier", - "src": "11898:16:1" + "src": "11897:17:1" }, "nodeType": "YulFunctionCall", - "src": "11898:23:1" + "src": "11897:24:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "11886:6:1" + "src": "11885:6:1" }, "nodeType": "YulFunctionCall", - "src": "11886:36:1" + "src": "11885:37:1" }, "nodeType": "YulExpressionStatement", - "src": "11886:36:1" + "src": "11885:37:1" } ] }, - "name": "abi_encode_t_uint64_to_t_uint64_fromStack", + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "value", "nodeType": "YulTypedName", - "src": "11864:5:1", + "src": "11863:5:1", "type": "" }, { "name": "pos", "nodeType": "YulTypedName", - "src": "11871:3:1", + "src": "11870:3:1", "type": "" } ], - "src": "11813:115:1" + "src": "11810:118:1" }, { "body": { "nodeType": "YulBlock", - "src": "12058:204:1", + "src": "12084:284:1", "statements": [ { "nodeType": "YulAssignment", - "src": "12068:26:1", + "src": "12094:26:1", "value": { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "12080:9:1" + "src": "12106:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "12091:2:1", + "src": "12117:2:1", "type": "", - "value": "64" + "value": "96" } ], "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "12076:3:1" + "src": "12102:3:1" }, "nodeType": "YulFunctionCall", - "src": "12076:18:1" + "src": "12102:18:1" }, "variableNames": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "12068:4:1" + "src": "12094:4:1" } ] }, @@ -6711,19 +6712,19 @@ { "name": "value0", "nodeType": "YulIdentifier", - "src": "12148:6:1" + "src": "12172:6:1" }, { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "12161:9:1" + "src": "12185:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "12172:1:1", + "src": "12196:1:1", "type": "", "value": "0" } @@ -6731,22 +6732,22 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "12157:3:1" + "src": "12181:3:1" }, "nodeType": "YulFunctionCall", - "src": "12157:17:1" + "src": "12181:17:1" } ], "functionName": { - "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "name": "abi_encode_t_uint64_to_t_uint64_fromStack", "nodeType": "YulIdentifier", - "src": "12104:43:1" + "src": "12130:41:1" }, "nodeType": "YulFunctionCall", - "src": "12104:71:1" + "src": "12130:69:1" }, "nodeType": "YulExpressionStatement", - "src": "12104:71:1" + "src": "12130:69:1" }, { "expression": { @@ -6754,19 +6755,19 @@ { "name": "value1", "nodeType": "YulIdentifier", - "src": "12227:6:1" + "src": "12253:6:1" }, { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "12240:9:1" + "src": "12266:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "12251:2:1", + "src": "12277:2:1", "type": "", "value": "32" } @@ -6774,44 +6775,93 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "12236:3:1" + "src": "12262:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "12262:18:1" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "12209:43:1" + }, + "nodeType": "YulFunctionCall", + "src": "12209:72:1" + }, + "nodeType": "YulExpressionStatement", + "src": "12209:72:1" + }, + { + "expression": { + "arguments": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "12333:6:1" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "12346:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12357:2:1", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12342:3:1" }, "nodeType": "YulFunctionCall", - "src": "12236:18:1" + "src": "12342:18:1" } ], "functionName": { "name": "abi_encode_t_uint64_to_t_uint64_fromStack", "nodeType": "YulIdentifier", - "src": "12185:41:1" + "src": "12291:41:1" }, "nodeType": "YulFunctionCall", - "src": "12185:70:1" + "src": "12291:70:1" }, "nodeType": "YulExpressionStatement", - "src": "12185:70:1" + "src": "12291:70:1" } ] }, - "name": "abi_encode_tuple_t_uint256_t_uint64__to_t_uint256_t_uint64__fromStack_reversed", + "name": "abi_encode_tuple_t_uint64_t_uint256_t_uint64__to_t_uint64_t_uint256_t_uint64__fromStack_reversed", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "headStart", "nodeType": "YulTypedName", - "src": "12022:9:1", + "src": "12040:9:1", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "12052:6:1", "type": "" }, { "name": "value1", "nodeType": "YulTypedName", - "src": "12034:6:1", + "src": "12060:6:1", "type": "" }, { "name": "value0", "nodeType": "YulTypedName", - "src": "12042:6:1", + "src": "12068:6:1", "type": "" } ], @@ -6819,16 +6869,16 @@ { "name": "tail", "nodeType": "YulTypedName", - "src": "12053:4:1", + "src": "12079:4:1", "type": "" } ], - "src": "11934:328:1" + "src": "11934:434:1" }, { "body": { "nodeType": "YulBlock", - "src": "12329:51:1", + "src": "12435:51:1", "statements": [ { "expression": { @@ -6836,35 +6886,35 @@ { "name": "pos", "nodeType": "YulIdentifier", - "src": "12346:3:1" + "src": "12452:3:1" }, { "arguments": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "12367:5:1" + "src": "12473:5:1" } ], "functionName": { "name": "cleanup_t_uint8", "nodeType": "YulIdentifier", - "src": "12351:15:1" + "src": "12457:15:1" }, "nodeType": "YulFunctionCall", - "src": "12351:22:1" + "src": "12457:22:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "12339:6:1" + "src": "12445:6:1" }, "nodeType": "YulFunctionCall", - "src": "12339:35:1" + "src": "12445:35:1" }, "nodeType": "YulExpressionStatement", - "src": "12339:35:1" + "src": "12445:35:1" } ] }, @@ -6874,22 +6924,22 @@ { "name": "value", "nodeType": "YulTypedName", - "src": "12317:5:1", + "src": "12423:5:1", "type": "" }, { "name": "pos", "nodeType": "YulTypedName", - "src": "12324:3:1", + "src": "12430:3:1", "type": "" } ], - "src": "12268:112:1" + "src": "12374:112:1" }, { "body": { "nodeType": "YulBlock", - "src": "12449:52:1", + "src": "12555:52:1", "statements": [ { "expression": { @@ -6897,35 +6947,35 @@ { "name": "pos", "nodeType": "YulIdentifier", - "src": "12466:3:1" + "src": "12572:3:1" }, { "arguments": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "12488:5:1" + "src": "12594:5:1" } ], "functionName": { "name": "cleanup_t_uint16", "nodeType": "YulIdentifier", - "src": "12471:16:1" + "src": "12577:16:1" }, "nodeType": "YulFunctionCall", - "src": "12471:23:1" + "src": "12577:23:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "12459:6:1" + "src": "12565:6:1" }, "nodeType": "YulFunctionCall", - "src": "12459:36:1" + "src": "12565:36:1" }, "nodeType": "YulExpressionStatement", - "src": "12459:36:1" + "src": "12565:36:1" } ] }, @@ -6935,47 +6985,47 @@ { "name": "value", "nodeType": "YulTypedName", - "src": "12437:5:1", + "src": "12543:5:1", "type": "" }, { "name": "pos", "nodeType": "YulTypedName", - "src": "12444:3:1", + "src": "12550:3:1", "type": "" } ], - "src": "12386:115:1" + "src": "12492:115:1" }, { "body": { "nodeType": "YulBlock", - "src": "12565:40:1", + "src": "12671:40:1", "statements": [ { "nodeType": "YulAssignment", - "src": "12576:22:1", + "src": "12682:22:1", "value": { "arguments": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "12592:5:1" + "src": "12698:5:1" } ], "functionName": { "name": "mload", "nodeType": "YulIdentifier", - "src": "12586:5:1" + "src": "12692:5:1" }, "nodeType": "YulFunctionCall", - "src": "12586:12:1" + "src": "12692:12:1" }, "variableNames": [ { "name": "length", "nodeType": "YulIdentifier", - "src": "12576:6:1" + "src": "12682:6:1" } ] } @@ -6987,7 +7037,7 @@ { "name": "value", "nodeType": "YulTypedName", - "src": "12548:5:1", + "src": "12654:5:1", "type": "" } ], @@ -6995,16 +7045,16 @@ { "name": "length", "nodeType": "YulTypedName", - "src": "12558:6:1", + "src": "12664:6:1", "type": "" } ], - "src": "12507:98:1" + "src": "12613:98:1" }, { "body": { "nodeType": "YulBlock", - "src": "12706:73:1", + "src": "12812:73:1", "statements": [ { "expression": { @@ -7012,39 +7062,39 @@ { "name": "pos", "nodeType": "YulIdentifier", - "src": "12723:3:1" + "src": "12829:3:1" }, { "name": "length", "nodeType": "YulIdentifier", - "src": "12728:6:1" + "src": "12834:6:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "12716:6:1" + "src": "12822:6:1" }, "nodeType": "YulFunctionCall", - "src": "12716:19:1" + "src": "12822:19:1" }, "nodeType": "YulExpressionStatement", - "src": "12716:19:1" + "src": "12822:19:1" }, { "nodeType": "YulAssignment", - "src": "12744:29:1", + "src": "12850:29:1", "value": { "arguments": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "12763:3:1" + "src": "12869:3:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "12768:4:1", + "src": "12874:4:1", "type": "", "value": "0x20" } @@ -7052,16 +7102,16 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "12759:3:1" + "src": "12865:3:1" }, "nodeType": "YulFunctionCall", - "src": "12759:14:1" + "src": "12865:14:1" }, "variableNames": [ { "name": "updated_pos", "nodeType": "YulIdentifier", - "src": "12744:11:1" + "src": "12850:11:1" } ] } @@ -7073,13 +7123,13 @@ { "name": "pos", "nodeType": "YulTypedName", - "src": "12678:3:1", + "src": "12784:3:1", "type": "" }, { "name": "length", "nodeType": "YulTypedName", - "src": "12683:6:1", + "src": "12789:6:1", "type": "" } ], @@ -7087,24 +7137,24 @@ { "name": "updated_pos", "nodeType": "YulTypedName", - "src": "12694:11:1", + "src": "12800:11:1", "type": "" } ], - "src": "12611:168:1" + "src": "12717:168:1" }, { "body": { "nodeType": "YulBlock", - "src": "12834:258:1", + "src": "12940:258:1", "statements": [ { "nodeType": "YulVariableDeclaration", - "src": "12844:10:1", + "src": "12950:10:1", "value": { "kind": "number", "nodeType": "YulLiteral", - "src": "12853:1:1", + "src": "12959:1:1", "type": "", "value": "0" }, @@ -7112,7 +7162,7 @@ { "name": "i", "nodeType": "YulTypedName", - "src": "12848:1:1", + "src": "12954:1:1", "type": "" } ] @@ -7120,7 +7170,7 @@ { "body": { "nodeType": "YulBlock", - "src": "12913:63:1", + "src": "13019:63:1", "statements": [ { "expression": { @@ -7130,21 +7180,21 @@ { "name": "dst", "nodeType": "YulIdentifier", - "src": "12938:3:1" + "src": "13044:3:1" }, { "name": "i", "nodeType": "YulIdentifier", - "src": "12943:1:1" + "src": "13049:1:1" } ], "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "12934:3:1" + "src": "13040:3:1" }, "nodeType": "YulFunctionCall", - "src": "12934:11:1" + "src": "13040:11:1" }, { "arguments": [ @@ -7153,42 +7203,42 @@ { "name": "src", "nodeType": "YulIdentifier", - "src": "12957:3:1" + "src": "13063:3:1" }, { "name": "i", "nodeType": "YulIdentifier", - "src": "12962:1:1" + "src": "13068:1:1" } ], "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "12953:3:1" + "src": "13059:3:1" }, "nodeType": "YulFunctionCall", - "src": "12953:11:1" + "src": "13059:11:1" } ], "functionName": { "name": "mload", "nodeType": "YulIdentifier", - "src": "12947:5:1" + "src": "13053:5:1" }, "nodeType": "YulFunctionCall", - "src": "12947:18:1" + "src": "13053:18:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "12927:6:1" + "src": "13033:6:1" }, "nodeType": "YulFunctionCall", - "src": "12927:39:1" + "src": "13033:39:1" }, "nodeType": "YulExpressionStatement", - "src": "12927:39:1" + "src": "13033:39:1" } ] }, @@ -7197,41 +7247,41 @@ { "name": "i", "nodeType": "YulIdentifier", - "src": "12874:1:1" + "src": "12980:1:1" }, { "name": "length", "nodeType": "YulIdentifier", - "src": "12877:6:1" + "src": "12983:6:1" } ], "functionName": { "name": "lt", "nodeType": "YulIdentifier", - "src": "12871:2:1" + "src": "12977:2:1" }, "nodeType": "YulFunctionCall", - "src": "12871:13:1" + "src": "12977:13:1" }, "nodeType": "YulForLoop", "post": { "nodeType": "YulBlock", - "src": "12885:19:1", + "src": "12991:19:1", "statements": [ { "nodeType": "YulAssignment", - "src": "12887:15:1", + "src": "12993:15:1", "value": { "arguments": [ { "name": "i", "nodeType": "YulIdentifier", - "src": "12896:1:1" + "src": "13002:1:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "12899:2:1", + "src": "13005:2:1", "type": "", "value": "32" } @@ -7239,16 +7289,16 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "12892:3:1" + "src": "12998:3:1" }, "nodeType": "YulFunctionCall", - "src": "12892:10:1" + "src": "12998:10:1" }, "variableNames": [ { "name": "i", "nodeType": "YulIdentifier", - "src": "12887:1:1" + "src": "12993:1:1" } ] } @@ -7256,15 +7306,15 @@ }, "pre": { "nodeType": "YulBlock", - "src": "12867:3:1", + "src": "12973:3:1", "statements": [] }, - "src": "12863:113:1" + "src": "12969:113:1" }, { "body": { "nodeType": "YulBlock", - "src": "13010:76:1", + "src": "13116:76:1", "statements": [ { "expression": { @@ -7274,26 +7324,26 @@ { "name": "dst", "nodeType": "YulIdentifier", - "src": "13060:3:1" + "src": "13166:3:1" }, { "name": "length", "nodeType": "YulIdentifier", - "src": "13065:6:1" + "src": "13171:6:1" } ], "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "13056:3:1" + "src": "13162:3:1" }, "nodeType": "YulFunctionCall", - "src": "13056:16:1" + "src": "13162:16:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "13074:1:1", + "src": "13180:1:1", "type": "", "value": "0" } @@ -7301,13 +7351,13 @@ "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "13049:6:1" + "src": "13155:6:1" }, "nodeType": "YulFunctionCall", - "src": "13049:27:1" + "src": "13155:27:1" }, "nodeType": "YulExpressionStatement", - "src": "13049:27:1" + "src": "13155:27:1" } ] }, @@ -7316,24 +7366,24 @@ { "name": "i", "nodeType": "YulIdentifier", - "src": "12991:1:1" + "src": "13097:1:1" }, { "name": "length", "nodeType": "YulIdentifier", - "src": "12994:6:1" + "src": "13100:6:1" } ], "functionName": { "name": "gt", "nodeType": "YulIdentifier", - "src": "12988:2:1" + "src": "13094:2:1" }, "nodeType": "YulFunctionCall", - "src": "12988:13:1" + "src": "13094:13:1" }, "nodeType": "YulIf", - "src": "12985:101:1" + "src": "13091:101:1" } ] }, @@ -7343,86 +7393,86 @@ { "name": "src", "nodeType": "YulTypedName", - "src": "12816:3:1", + "src": "12922:3:1", "type": "" }, { "name": "dst", "nodeType": "YulTypedName", - "src": "12821:3:1", + "src": "12927:3:1", "type": "" }, { "name": "length", "nodeType": "YulTypedName", - "src": "12826:6:1", + "src": "12932:6:1", "type": "" } ], - "src": "12785:307:1" + "src": "12891:307:1" }, { "body": { "nodeType": "YulBlock", - "src": "13188:270:1", + "src": "13294:270:1", "statements": [ { "nodeType": "YulVariableDeclaration", - "src": "13198:52:1", + "src": "13304:52:1", "value": { "arguments": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "13244:5:1" + "src": "13350:5:1" } ], "functionName": { "name": "array_length_t_bytes_memory_ptr", "nodeType": "YulIdentifier", - "src": "13212:31:1" + "src": "13318:31:1" }, "nodeType": "YulFunctionCall", - "src": "13212:38:1" + "src": "13318:38:1" }, "variables": [ { "name": "length", "nodeType": "YulTypedName", - "src": "13202:6:1", + "src": "13308:6:1", "type": "" } ] }, { "nodeType": "YulAssignment", - "src": "13259:77:1", + "src": "13365:77:1", "value": { "arguments": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "13324:3:1" + "src": "13430:3:1" }, { "name": "length", "nodeType": "YulIdentifier", - "src": "13329:6:1" + "src": "13435:6:1" } ], "functionName": { "name": "array_storeLengthForEncoding_t_bytes_memory_ptr_fromStack", "nodeType": "YulIdentifier", - "src": "13266:57:1" + "src": "13372:57:1" }, "nodeType": "YulFunctionCall", - "src": "13266:70:1" + "src": "13372:70:1" }, "variableNames": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "13259:3:1" + "src": "13365:3:1" } ] }, @@ -7434,12 +7484,12 @@ { "name": "value", "nodeType": "YulIdentifier", - "src": "13371:5:1" + "src": "13477:5:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "13378:4:1", + "src": "13484:4:1", "type": "", "value": "0x20" } @@ -7447,73 +7497,73 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "13367:3:1" + "src": "13473:3:1" }, "nodeType": "YulFunctionCall", - "src": "13367:16:1" + "src": "13473:16:1" }, { "name": "pos", "nodeType": "YulIdentifier", - "src": "13385:3:1" + "src": "13491:3:1" }, { "name": "length", "nodeType": "YulIdentifier", - "src": "13390:6:1" + "src": "13496:6:1" } ], "functionName": { "name": "copy_memory_to_memory", "nodeType": "YulIdentifier", - "src": "13345:21:1" + "src": "13451:21:1" }, "nodeType": "YulFunctionCall", - "src": "13345:52:1" + "src": "13451:52:1" }, "nodeType": "YulExpressionStatement", - "src": "13345:52:1" + "src": "13451:52:1" }, { "nodeType": "YulAssignment", - "src": "13406:46:1", + "src": "13512:46:1", "value": { "arguments": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "13417:3:1" + "src": "13523:3:1" }, { "arguments": [ { "name": "length", "nodeType": "YulIdentifier", - "src": "13444:6:1" + "src": "13550:6:1" } ], "functionName": { "name": "round_up_to_mul_of_32", "nodeType": "YulIdentifier", - "src": "13422:21:1" + "src": "13528:21:1" }, "nodeType": "YulFunctionCall", - "src": "13422:29:1" + "src": "13528:29:1" } ], "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "13413:3:1" + "src": "13519:3:1" }, "nodeType": "YulFunctionCall", - "src": "13413:39:1" + "src": "13519:39:1" }, "variableNames": [ { "name": "end", "nodeType": "YulIdentifier", - "src": "13406:3:1" + "src": "13512:3:1" } ] } @@ -7525,13 +7575,13 @@ { "name": "value", "nodeType": "YulTypedName", - "src": "13169:5:1", + "src": "13275:5:1", "type": "" }, { "name": "pos", "nodeType": "YulTypedName", - "src": "13176:3:1", + "src": "13282:3:1", "type": "" } ], @@ -7539,31 +7589,31 @@ { "name": "end", "nodeType": "YulTypedName", - "src": "13184:3:1", + "src": "13290:3:1", "type": "" } ], - "src": "13098:360:1" + "src": "13204:360:1" }, { "body": { "nodeType": "YulBlock", - "src": "13684:515:1", + "src": "13790:515:1", "statements": [ { "nodeType": "YulAssignment", - "src": "13694:27:1", + "src": "13800:27:1", "value": { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "13706:9:1" + "src": "13812:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "13717:3:1", + "src": "13823:3:1", "type": "", "value": "160" } @@ -7571,16 +7621,16 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "13702:3:1" + "src": "13808:3:1" }, "nodeType": "YulFunctionCall", - "src": "13702:19:1" + "src": "13808:19:1" }, "variableNames": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "13694:4:1" + "src": "13800:4:1" } ] }, @@ -7590,19 +7640,19 @@ { "name": "value0", "nodeType": "YulIdentifier", - "src": "13771:6:1" + "src": "13877:6:1" }, { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "13784:9:1" + "src": "13890:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "13795:1:1", + "src": "13901:1:1", "type": "", "value": "0" } @@ -7610,22 +7660,22 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "13780:3:1" + "src": "13886:3:1" }, "nodeType": "YulFunctionCall", - "src": "13780:17:1" + "src": "13886:17:1" } ], "functionName": { "name": "abi_encode_t_uint8_to_t_uint8_fromStack", "nodeType": "YulIdentifier", - "src": "13731:39:1" + "src": "13837:39:1" }, "nodeType": "YulFunctionCall", - "src": "13731:67:1" + "src": "13837:67:1" }, "nodeType": "YulExpressionStatement", - "src": "13731:67:1" + "src": "13837:67:1" }, { "expression": { @@ -7633,19 +7683,19 @@ { "name": "value1", "nodeType": "YulIdentifier", - "src": "13850:6:1" + "src": "13956:6:1" }, { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "13863:9:1" + "src": "13969:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "13874:2:1", + "src": "13980:2:1", "type": "", "value": "32" } @@ -7653,22 +7703,22 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "13859:3:1" + "src": "13965:3:1" }, "nodeType": "YulFunctionCall", - "src": "13859:18:1" + "src": "13965:18:1" } ], "functionName": { "name": "abi_encode_t_uint16_to_t_uint16_fromStack", "nodeType": "YulIdentifier", - "src": "13808:41:1" + "src": "13914:41:1" }, "nodeType": "YulFunctionCall", - "src": "13808:70:1" + "src": "13914:70:1" }, "nodeType": "YulExpressionStatement", - "src": "13808:70:1" + "src": "13914:70:1" }, { "expression": { @@ -7676,19 +7726,19 @@ { "name": "value2", "nodeType": "YulIdentifier", - "src": "13932:6:1" + "src": "14038:6:1" }, { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "13945:9:1" + "src": "14051:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "13956:2:1", + "src": "14062:2:1", "type": "", "value": "64" } @@ -7696,22 +7746,22 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "13941:3:1" + "src": "14047:3:1" }, "nodeType": "YulFunctionCall", - "src": "13941:18:1" + "src": "14047:18:1" } ], "functionName": { "name": "abi_encode_t_address_to_t_address_fromStack", "nodeType": "YulIdentifier", - "src": "13888:43:1" + "src": "13994:43:1" }, "nodeType": "YulFunctionCall", - "src": "13888:72:1" + "src": "13994:72:1" }, "nodeType": "YulExpressionStatement", - "src": "13888:72:1" + "src": "13994:72:1" }, { "expression": { @@ -7719,19 +7769,19 @@ { "name": "value3", "nodeType": "YulIdentifier", - "src": "14012:6:1" + "src": "14118:6:1" }, { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "14025:9:1" + "src": "14131:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "14036:2:1", + "src": "14142:2:1", "type": "", "value": "96" } @@ -7739,22 +7789,22 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "14021:3:1" + "src": "14127:3:1" }, "nodeType": "YulFunctionCall", - "src": "14021:18:1" + "src": "14127:18:1" } ], "functionName": { "name": "abi_encode_t_uint64_to_t_uint64_fromStack", "nodeType": "YulIdentifier", - "src": "13970:41:1" + "src": "14076:41:1" }, "nodeType": "YulFunctionCall", - "src": "13970:70:1" + "src": "14076:70:1" }, "nodeType": "YulExpressionStatement", - "src": "13970:70:1" + "src": "14076:70:1" }, { "expression": { @@ -7764,12 +7814,12 @@ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "14061:9:1" + "src": "14167:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "14072:3:1", + "src": "14178:3:1", "type": "", "value": "128" } @@ -7777,73 +7827,73 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "14057:3:1" + "src": "14163:3:1" }, "nodeType": "YulFunctionCall", - "src": "14057:19:1" + "src": "14163:19:1" }, { "arguments": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "14082:4:1" + "src": "14188:4:1" }, { "name": "headStart", "nodeType": "YulIdentifier", - "src": "14088:9:1" + "src": "14194:9:1" } ], "functionName": { "name": "sub", "nodeType": "YulIdentifier", - "src": "14078:3:1" + "src": "14184:3:1" }, "nodeType": "YulFunctionCall", - "src": "14078:20:1" + "src": "14184:20:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "14050:6:1" + "src": "14156:6:1" }, "nodeType": "YulFunctionCall", - "src": "14050:49:1" + "src": "14156:49:1" }, "nodeType": "YulExpressionStatement", - "src": "14050:49:1" + "src": "14156:49:1" }, { "nodeType": "YulAssignment", - "src": "14108:84:1", + "src": "14214:84:1", "value": { "arguments": [ { "name": "value4", "nodeType": "YulIdentifier", - "src": "14178:6:1" + "src": "14284:6:1" }, { "name": "tail", "nodeType": "YulIdentifier", - "src": "14187:4:1" + "src": "14293:4:1" } ], "functionName": { "name": "abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr_fromStack", "nodeType": "YulIdentifier", - "src": "14116:61:1" + "src": "14222:61:1" }, "nodeType": "YulFunctionCall", - "src": "14116:76:1" + "src": "14222:76:1" }, "variableNames": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "14108:4:1" + "src": "14214:4:1" } ] } @@ -7855,37 +7905,37 @@ { "name": "headStart", "nodeType": "YulTypedName", - "src": "13624:9:1", + "src": "13730:9:1", "type": "" }, { "name": "value4", "nodeType": "YulTypedName", - "src": "13636:6:1", + "src": "13742:6:1", "type": "" }, { "name": "value3", "nodeType": "YulTypedName", - "src": "13644:6:1", + "src": "13750:6:1", "type": "" }, { "name": "value2", "nodeType": "YulTypedName", - "src": "13652:6:1", + "src": "13758:6:1", "type": "" }, { "name": "value1", "nodeType": "YulTypedName", - "src": "13660:6:1", + "src": "13766:6:1", "type": "" }, { "name": "value0", "nodeType": "YulTypedName", - "src": "13668:6:1", + "src": "13774:6:1", "type": "" } ], @@ -7893,31 +7943,31 @@ { "name": "tail", "nodeType": "YulTypedName", - "src": "13679:4:1", + "src": "13785:4:1", "type": "" } ], - "src": "13464:735:1" + "src": "13570:735:1" }, { "body": { "nodeType": "YulBlock", - "src": "14301:122:1", + "src": "14407:122:1", "statements": [ { "nodeType": "YulAssignment", - "src": "14311:26:1", + "src": "14417:26:1", "value": { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "14323:9:1" + "src": "14429:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "14334:2:1", + "src": "14440:2:1", "type": "", "value": "32" } @@ -7925,16 +7975,16 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "14319:3:1" + "src": "14425:3:1" }, "nodeType": "YulFunctionCall", - "src": "14319:18:1" + "src": "14425:18:1" }, "variableNames": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "14311:4:1" + "src": "14417:4:1" } ] }, @@ -7944,19 +7994,19 @@ { "name": "value0", "nodeType": "YulIdentifier", - "src": "14389:6:1" + "src": "14495:6:1" }, { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "14402:9:1" + "src": "14508:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "14413:1:1", + "src": "14519:1:1", "type": "", "value": "0" } @@ -7964,22 +8014,22 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "14398:3:1" + "src": "14504:3:1" }, "nodeType": "YulFunctionCall", - "src": "14398:17:1" + "src": "14504:17:1" } ], "functionName": { "name": "abi_encode_t_uint16_to_t_uint16_fromStack", "nodeType": "YulIdentifier", - "src": "14347:41:1" + "src": "14453:41:1" }, "nodeType": "YulFunctionCall", - "src": "14347:69:1" + "src": "14453:69:1" }, "nodeType": "YulExpressionStatement", - "src": "14347:69:1" + "src": "14453:69:1" } ] }, @@ -7989,13 +8039,13 @@ { "name": "headStart", "nodeType": "YulTypedName", - "src": "14273:9:1", + "src": "14379:9:1", "type": "" }, { "name": "value0", "nodeType": "YulTypedName", - "src": "14285:6:1", + "src": "14391:6:1", "type": "" } ], @@ -8003,41 +8053,41 @@ { "name": "tail", "nodeType": "YulTypedName", - "src": "14296:4:1", + "src": "14402:4:1", "type": "" } ], - "src": "14205:218:1" + "src": "14311:218:1" }, { "body": { "nodeType": "YulBlock", - "src": "14492:80:1", + "src": "14598:80:1", "statements": [ { "nodeType": "YulAssignment", - "src": "14502:22:1", + "src": "14608:22:1", "value": { "arguments": [ { "name": "offset", "nodeType": "YulIdentifier", - "src": "14517:6:1" + "src": "14623:6:1" } ], "functionName": { "name": "mload", "nodeType": "YulIdentifier", - "src": "14511:5:1" + "src": "14617:5:1" }, "nodeType": "YulFunctionCall", - "src": "14511:13:1" + "src": "14617:13:1" }, "variableNames": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "14502:5:1" + "src": "14608:5:1" } ] }, @@ -8047,19 +8097,19 @@ { "name": "value", "nodeType": "YulIdentifier", - "src": "14560:5:1" + "src": "14666:5:1" } ], "functionName": { "name": "validator_revert_t_address", "nodeType": "YulIdentifier", - "src": "14533:26:1" + "src": "14639:26:1" }, "nodeType": "YulFunctionCall", - "src": "14533:33:1" + "src": "14639:33:1" }, "nodeType": "YulExpressionStatement", - "src": "14533:33:1" + "src": "14639:33:1" } ] }, @@ -8069,13 +8119,13 @@ { "name": "offset", "nodeType": "YulTypedName", - "src": "14470:6:1", + "src": "14576:6:1", "type": "" }, { "name": "end", "nodeType": "YulTypedName", - "src": "14478:3:1", + "src": "14584:3:1", "type": "" } ], @@ -8083,21 +8133,21 @@ { "name": "value", "nodeType": "YulTypedName", - "src": "14486:5:1", + "src": "14592:5:1", "type": "" } ], - "src": "14429:143:1" + "src": "14535:143:1" }, { "body": { "nodeType": "YulBlock", - "src": "14655:274:1", + "src": "14761:274:1", "statements": [ { "body": { "nodeType": "YulBlock", - "src": "14701:83:1", + "src": "14807:83:1", "statements": [ { "expression": { @@ -8105,13 +8155,13 @@ "functionName": { "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", "nodeType": "YulIdentifier", - "src": "14703:77:1" + "src": "14809:77:1" }, "nodeType": "YulFunctionCall", - "src": "14703:79:1" + "src": "14809:79:1" }, "nodeType": "YulExpressionStatement", - "src": "14703:79:1" + "src": "14809:79:1" } ] }, @@ -8122,26 +8172,26 @@ { "name": "dataEnd", "nodeType": "YulIdentifier", - "src": "14676:7:1" + "src": "14782:7:1" }, { "name": "headStart", "nodeType": "YulIdentifier", - "src": "14685:9:1" + "src": "14791:9:1" } ], "functionName": { "name": "sub", "nodeType": "YulIdentifier", - "src": "14672:3:1" + "src": "14778:3:1" }, "nodeType": "YulFunctionCall", - "src": "14672:23:1" + "src": "14778:23:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "14697:2:1", + "src": "14803:2:1", "type": "", "value": "32" } @@ -8149,25 +8199,25 @@ "functionName": { "name": "slt", "nodeType": "YulIdentifier", - "src": "14668:3:1" + "src": "14774:3:1" }, "nodeType": "YulFunctionCall", - "src": "14668:32:1" + "src": "14774:32:1" }, "nodeType": "YulIf", - "src": "14665:119:1" + "src": "14771:119:1" }, { "nodeType": "YulBlock", - "src": "14794:128:1", + "src": "14900:128:1", "statements": [ { "nodeType": "YulVariableDeclaration", - "src": "14809:15:1", + "src": "14915:15:1", "value": { "kind": "number", "nodeType": "YulLiteral", - "src": "14823:1:1", + "src": "14929:1:1", "type": "", "value": "0" }, @@ -8175,14 +8225,14 @@ { "name": "offset", "nodeType": "YulTypedName", - "src": "14813:6:1", + "src": "14919:6:1", "type": "" } ] }, { "nodeType": "YulAssignment", - "src": "14838:74:1", + "src": "14944:74:1", "value": { "arguments": [ { @@ -8190,41 +8240,41 @@ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "14884:9:1" + "src": "14990:9:1" }, { "name": "offset", "nodeType": "YulIdentifier", - "src": "14895:6:1" + "src": "15001:6:1" } ], "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "14880:3:1" + "src": "14986:3:1" }, "nodeType": "YulFunctionCall", - "src": "14880:22:1" + "src": "14986:22:1" }, { "name": "dataEnd", "nodeType": "YulIdentifier", - "src": "14904:7:1" + "src": "15010:7:1" } ], "functionName": { "name": "abi_decode_t_address_fromMemory", "nodeType": "YulIdentifier", - "src": "14848:31:1" + "src": "14954:31:1" }, "nodeType": "YulFunctionCall", - "src": "14848:64:1" + "src": "14954:64:1" }, "variableNames": [ { "name": "value0", "nodeType": "YulIdentifier", - "src": "14838:6:1" + "src": "14944:6:1" } ] } @@ -8238,13 +8288,13 @@ { "name": "headStart", "nodeType": "YulTypedName", - "src": "14625:9:1", + "src": "14731:9:1", "type": "" }, { "name": "dataEnd", "nodeType": "YulTypedName", - "src": "14636:7:1", + "src": "14742:7:1", "type": "" } ], @@ -8252,16 +8302,16 @@ { "name": "value0", "nodeType": "YulTypedName", - "src": "14648:6:1", + "src": "14754:6:1", "type": "" } ], - "src": "14578:351:1" + "src": "14684:351:1" }, { "body": { "nodeType": "YulBlock", - "src": "14986:51:1", + "src": "15092:51:1", "statements": [ { "expression": { @@ -8269,35 +8319,35 @@ { "name": "pos", "nodeType": "YulIdentifier", - "src": "15003:3:1" + "src": "15109:3:1" }, { "arguments": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "15024:5:1" + "src": "15130:5:1" } ], "functionName": { "name": "cleanup_t_uint8", "nodeType": "YulIdentifier", - "src": "15008:15:1" + "src": "15114:15:1" }, "nodeType": "YulFunctionCall", - "src": "15008:22:1" + "src": "15114:22:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "14996:6:1" + "src": "15102:6:1" }, "nodeType": "YulFunctionCall", - "src": "14996:35:1" + "src": "15102:35:1" }, "nodeType": "YulExpressionStatement", - "src": "14996:35:1" + "src": "15102:35:1" } ] }, @@ -8307,47 +8357,47 @@ { "name": "value", "nodeType": "YulTypedName", - "src": "14974:5:1", + "src": "15080:5:1", "type": "" }, { "name": "pos", "nodeType": "YulTypedName", - "src": "14981:3:1", + "src": "15087:3:1", "type": "" } ], - "src": "14935:102:1" + "src": "15041:102:1" }, { "body": { "nodeType": "YulBlock", - "src": "15126:40:1", + "src": "15232:40:1", "statements": [ { "nodeType": "YulAssignment", - "src": "15137:22:1", + "src": "15243:22:1", "value": { "arguments": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "15153:5:1" + "src": "15259:5:1" } ], "functionName": { "name": "mload", "nodeType": "YulIdentifier", - "src": "15147:5:1" + "src": "15253:5:1" }, "nodeType": "YulFunctionCall", - "src": "15147:12:1" + "src": "15253:12:1" }, "variableNames": [ { "name": "length", "nodeType": "YulIdentifier", - "src": "15137:6:1" + "src": "15243:6:1" } ] } @@ -8359,7 +8409,7 @@ { "name": "value", "nodeType": "YulTypedName", - "src": "15109:5:1", + "src": "15215:5:1", "type": "" } ], @@ -8367,16 +8417,16 @@ { "name": "length", "nodeType": "YulTypedName", - "src": "15119:6:1", + "src": "15225:6:1", "type": "" } ], - "src": "15043:123:1" + "src": "15149:123:1" }, { "body": { "nodeType": "YulBlock", - "src": "15282:73:1", + "src": "15388:73:1", "statements": [ { "expression": { @@ -8384,39 +8434,39 @@ { "name": "pos", "nodeType": "YulIdentifier", - "src": "15299:3:1" + "src": "15405:3:1" }, { "name": "length", "nodeType": "YulIdentifier", - "src": "15304:6:1" + "src": "15410:6:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "15292:6:1" + "src": "15398:6:1" }, "nodeType": "YulFunctionCall", - "src": "15292:19:1" + "src": "15398:19:1" }, "nodeType": "YulExpressionStatement", - "src": "15292:19:1" + "src": "15398:19:1" }, { "nodeType": "YulAssignment", - "src": "15320:29:1", + "src": "15426:29:1", "value": { "arguments": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "15339:3:1" + "src": "15445:3:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "15344:4:1", + "src": "15450:4:1", "type": "", "value": "0x20" } @@ -8424,16 +8474,16 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "15335:3:1" + "src": "15441:3:1" }, "nodeType": "YulFunctionCall", - "src": "15335:14:1" + "src": "15441:14:1" }, "variableNames": [ { "name": "updated_pos", "nodeType": "YulIdentifier", - "src": "15320:11:1" + "src": "15426:11:1" } ] } @@ -8445,13 +8495,13 @@ { "name": "pos", "nodeType": "YulTypedName", - "src": "15254:3:1", + "src": "15360:3:1", "type": "" }, { "name": "length", "nodeType": "YulTypedName", - "src": "15259:6:1", + "src": "15365:6:1", "type": "" } ], @@ -8459,47 +8509,47 @@ { "name": "updated_pos", "nodeType": "YulTypedName", - "src": "15270:11:1", + "src": "15376:11:1", "type": "" } ], - "src": "15172:183:1" + "src": "15278:183:1" }, { "body": { "nodeType": "YulBlock", - "src": "15442:60:1", + "src": "15548:60:1", "statements": [ { "nodeType": "YulAssignment", - "src": "15452:11:1", + "src": "15558:11:1", "value": { "name": "ptr", "nodeType": "YulIdentifier", - "src": "15460:3:1" + "src": "15566:3:1" }, "variableNames": [ { "name": "data", "nodeType": "YulIdentifier", - "src": "15452:4:1" + "src": "15558:4:1" } ] }, { "nodeType": "YulAssignment", - "src": "15473:22:1", + "src": "15579:22:1", "value": { "arguments": [ { "name": "ptr", "nodeType": "YulIdentifier", - "src": "15485:3:1" + "src": "15591:3:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "15490:4:1", + "src": "15596:4:1", "type": "", "value": "0x20" } @@ -8507,16 +8557,16 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "15481:3:1" + "src": "15587:3:1" }, "nodeType": "YulFunctionCall", - "src": "15481:14:1" + "src": "15587:14:1" }, "variableNames": [ { "name": "data", "nodeType": "YulIdentifier", - "src": "15473:4:1" + "src": "15579:4:1" } ] } @@ -8528,7 +8578,7 @@ { "name": "ptr", "nodeType": "YulTypedName", - "src": "15429:3:1", + "src": "15535:3:1", "type": "" } ], @@ -8536,16 +8586,16 @@ { "name": "data", "nodeType": "YulTypedName", - "src": "15437:4:1", + "src": "15543:4:1", "type": "" } ], - "src": "15361:141:1" + "src": "15467:141:1" }, { "body": { "nodeType": "YulBlock", - "src": "15593:73:1", + "src": "15699:73:1", "statements": [ { "expression": { @@ -8553,39 +8603,39 @@ { "name": "pos", "nodeType": "YulIdentifier", - "src": "15610:3:1" + "src": "15716:3:1" }, { "name": "length", "nodeType": "YulIdentifier", - "src": "15615:6:1" + "src": "15721:6:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "15603:6:1" + "src": "15709:6:1" }, "nodeType": "YulFunctionCall", - "src": "15603:19:1" + "src": "15709:19:1" }, "nodeType": "YulExpressionStatement", - "src": "15603:19:1" + "src": "15709:19:1" }, { "nodeType": "YulAssignment", - "src": "15631:29:1", + "src": "15737:29:1", "value": { "arguments": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "15650:3:1" + "src": "15756:3:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "15655:4:1", + "src": "15761:4:1", "type": "", "value": "0x20" } @@ -8593,16 +8643,16 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "15646:3:1" + "src": "15752:3:1" }, "nodeType": "YulFunctionCall", - "src": "15646:14:1" + "src": "15752:14:1" }, "variableNames": [ { "name": "updated_pos", "nodeType": "YulIdentifier", - "src": "15631:11:1" + "src": "15737:11:1" } ] } @@ -8614,13 +8664,13 @@ { "name": "pos", "nodeType": "YulTypedName", - "src": "15565:3:1", + "src": "15671:3:1", "type": "" }, { "name": "length", "nodeType": "YulTypedName", - "src": "15570:6:1", + "src": "15676:6:1", "type": "" } ], @@ -8628,74 +8678,74 @@ { "name": "updated_pos", "nodeType": "YulTypedName", - "src": "15581:11:1", + "src": "15687:11:1", "type": "" } ], - "src": "15508:158:1" + "src": "15614:158:1" }, { "body": { "nodeType": "YulBlock", - "src": "15752:260:1", + "src": "15858:260:1", "statements": [ { "nodeType": "YulVariableDeclaration", - "src": "15762:52:1", + "src": "15868:52:1", "value": { "arguments": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "15808:5:1" + "src": "15914:5:1" } ], "functionName": { "name": "array_length_t_bytes_memory_ptr", "nodeType": "YulIdentifier", - "src": "15776:31:1" + "src": "15882:31:1" }, "nodeType": "YulFunctionCall", - "src": "15776:38:1" + "src": "15882:38:1" }, "variables": [ { "name": "length", "nodeType": "YulTypedName", - "src": "15766:6:1", + "src": "15872:6:1", "type": "" } ] }, { "nodeType": "YulAssignment", - "src": "15823:67:1", + "src": "15929:67:1", "value": { "arguments": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "15878:3:1" + "src": "15984:3:1" }, { "name": "length", "nodeType": "YulIdentifier", - "src": "15883:6:1" + "src": "15989:6:1" } ], "functionName": { "name": "array_storeLengthForEncoding_t_bytes_memory_ptr", "nodeType": "YulIdentifier", - "src": "15830:47:1" + "src": "15936:47:1" }, "nodeType": "YulFunctionCall", - "src": "15830:60:1" + "src": "15936:60:1" }, "variableNames": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "15823:3:1" + "src": "15929:3:1" } ] }, @@ -8707,12 +8757,12 @@ { "name": "value", "nodeType": "YulIdentifier", - "src": "15925:5:1" + "src": "16031:5:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "15932:4:1", + "src": "16038:4:1", "type": "", "value": "0x20" } @@ -8720,73 +8770,73 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "15921:3:1" + "src": "16027:3:1" }, "nodeType": "YulFunctionCall", - "src": "15921:16:1" + "src": "16027:16:1" }, { "name": "pos", "nodeType": "YulIdentifier", - "src": "15939:3:1" + "src": "16045:3:1" }, { "name": "length", "nodeType": "YulIdentifier", - "src": "15944:6:1" + "src": "16050:6:1" } ], "functionName": { "name": "copy_memory_to_memory", "nodeType": "YulIdentifier", - "src": "15899:21:1" + "src": "16005:21:1" }, "nodeType": "YulFunctionCall", - "src": "15899:52:1" + "src": "16005:52:1" }, "nodeType": "YulExpressionStatement", - "src": "15899:52:1" + "src": "16005:52:1" }, { "nodeType": "YulAssignment", - "src": "15960:46:1", + "src": "16066:46:1", "value": { "arguments": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "15971:3:1" + "src": "16077:3:1" }, { "arguments": [ { "name": "length", "nodeType": "YulIdentifier", - "src": "15998:6:1" + "src": "16104:6:1" } ], "functionName": { "name": "round_up_to_mul_of_32", "nodeType": "YulIdentifier", - "src": "15976:21:1" + "src": "16082:21:1" }, "nodeType": "YulFunctionCall", - "src": "15976:29:1" + "src": "16082:29:1" } ], "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "15967:3:1" + "src": "16073:3:1" }, "nodeType": "YulFunctionCall", - "src": "15967:39:1" + "src": "16073:39:1" }, "variableNames": [ { "name": "end", "nodeType": "YulIdentifier", - "src": "15960:3:1" + "src": "16066:3:1" } ] } @@ -8798,13 +8848,13 @@ { "name": "value", "nodeType": "YulTypedName", - "src": "15733:5:1", + "src": "15839:5:1", "type": "" }, { "name": "pos", "nodeType": "YulTypedName", - "src": "15740:3:1", + "src": "15846:3:1", "type": "" } ], @@ -8812,46 +8862,46 @@ { "name": "end", "nodeType": "YulTypedName", - "src": "15748:3:1", + "src": "15854:3:1", "type": "" } ], - "src": "15672:340:1" + "src": "15778:340:1" }, { "body": { "nodeType": "YulBlock", - "src": "16116:94:1", + "src": "16222:94:1", "statements": [ { "nodeType": "YulAssignment", - "src": "16126:78:1", + "src": "16232:78:1", "value": { "arguments": [ { "name": "value0", "nodeType": "YulIdentifier", - "src": "16192:6:1" + "src": "16298:6:1" }, { "name": "pos", "nodeType": "YulIdentifier", - "src": "16200:3:1" + "src": "16306:3:1" } ], "functionName": { "name": "abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr", "nodeType": "YulIdentifier", - "src": "16140:51:1" + "src": "16246:51:1" }, "nodeType": "YulFunctionCall", - "src": "16140:64:1" + "src": "16246:64:1" }, "variableNames": [ { "name": "updatedPos", "nodeType": "YulIdentifier", - "src": "16126:10:1" + "src": "16232:10:1" } ] } @@ -8863,13 +8913,13 @@ { "name": "value0", "nodeType": "YulTypedName", - "src": "16089:6:1", + "src": "16195:6:1", "type": "" }, { "name": "pos", "nodeType": "YulTypedName", - "src": "16097:3:1", + "src": "16203:3:1", "type": "" } ], @@ -8877,31 +8927,31 @@ { "name": "updatedPos", "nodeType": "YulTypedName", - "src": "16105:10:1", + "src": "16211:10:1", "type": "" } ], - "src": "16018:192:1" + "src": "16124:192:1" }, { "body": { "nodeType": "YulBlock", - "src": "16300:38:1", + "src": "16406:38:1", "statements": [ { "nodeType": "YulAssignment", - "src": "16310:22:1", + "src": "16416:22:1", "value": { "arguments": [ { "name": "ptr", "nodeType": "YulIdentifier", - "src": "16322:3:1" + "src": "16428:3:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "16327:4:1", + "src": "16433:4:1", "type": "", "value": "0x20" } @@ -8909,16 +8959,16 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "16318:3:1" + "src": "16424:3:1" }, "nodeType": "YulFunctionCall", - "src": "16318:14:1" + "src": "16424:14:1" }, "variableNames": [ { "name": "next", "nodeType": "YulIdentifier", - "src": "16310:4:1" + "src": "16416:4:1" } ] } @@ -8930,7 +8980,7 @@ { "name": "ptr", "nodeType": "YulTypedName", - "src": "16287:3:1", + "src": "16393:3:1", "type": "" } ], @@ -8938,115 +8988,115 @@ { "name": "next", "nodeType": "YulTypedName", - "src": "16295:4:1", + "src": "16401:4:1", "type": "" } ], - "src": "16216:122:1" + "src": "16322:122:1" }, { "body": { "nodeType": "YulBlock", - "src": "16502:831:1", + "src": "16608:831:1", "statements": [ { "nodeType": "YulVariableDeclaration", - "src": "16512:77:1", + "src": "16618:77:1", "value": { "arguments": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "16583:5:1" + "src": "16689:5:1" } ], "functionName": { "name": "array_length_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", "nodeType": "YulIdentifier", - "src": "16526:56:1" + "src": "16632:56:1" }, "nodeType": "YulFunctionCall", - "src": "16526:63:1" + "src": "16632:63:1" }, "variables": [ { "name": "length", "nodeType": "YulTypedName", - "src": "16516:6:1", + "src": "16622:6:1", "type": "" } ] }, { "nodeType": "YulAssignment", - "src": "16598:92:1", + "src": "16704:92:1", "value": { "arguments": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "16678:3:1" + "src": "16784:3:1" }, { "name": "length", "nodeType": "YulIdentifier", - "src": "16683:6:1" + "src": "16789:6:1" } ], "functionName": { "name": "array_storeLengthForEncoding_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", "nodeType": "YulIdentifier", - "src": "16605:72:1" + "src": "16711:72:1" }, "nodeType": "YulFunctionCall", - "src": "16605:85:1" + "src": "16711:85:1" }, "variableNames": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "16598:3:1" + "src": "16704:3:1" } ] }, { "nodeType": "YulVariableDeclaration", - "src": "16699:20:1", + "src": "16805:20:1", "value": { "name": "pos", "nodeType": "YulIdentifier", - "src": "16716:3:1" + "src": "16822:3:1" }, "variables": [ { "name": "headStart", "nodeType": "YulTypedName", - "src": "16703:9:1", + "src": "16809:9:1", "type": "" } ] }, { "nodeType": "YulVariableDeclaration", - "src": "16728:39:1", + "src": "16834:39:1", "value": { "arguments": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "16744:3:1" + "src": "16850:3:1" }, { "arguments": [ { "name": "length", "nodeType": "YulIdentifier", - "src": "16753:6:1" + "src": "16859:6:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "16761:4:1", + "src": "16867:4:1", "type": "", "value": "0x20" } @@ -9054,70 +9104,70 @@ "functionName": { "name": "mul", "nodeType": "YulIdentifier", - "src": "16749:3:1" + "src": "16855:3:1" }, "nodeType": "YulFunctionCall", - "src": "16749:17:1" + "src": "16855:17:1" } ], "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "16740:3:1" + "src": "16846:3:1" }, "nodeType": "YulFunctionCall", - "src": "16740:27:1" + "src": "16846:27:1" }, "variables": [ { "name": "tail", "nodeType": "YulTypedName", - "src": "16732:4:1", + "src": "16838:4:1", "type": "" } ] }, { "nodeType": "YulVariableDeclaration", - "src": "16776:80:1", + "src": "16882:80:1", "value": { "arguments": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "16850:5:1" + "src": "16956:5:1" } ], "functionName": { "name": "array_dataslot_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", "nodeType": "YulIdentifier", - "src": "16791:58:1" + "src": "16897:58:1" }, "nodeType": "YulFunctionCall", - "src": "16791:65:1" + "src": "16897:65:1" }, "variables": [ { "name": "baseRef", "nodeType": "YulTypedName", - "src": "16780:7:1", + "src": "16886:7:1", "type": "" } ] }, { "nodeType": "YulVariableDeclaration", - "src": "16865:21:1", + "src": "16971:21:1", "value": { "name": "baseRef", "nodeType": "YulIdentifier", - "src": "16879:7:1" + "src": "16985:7:1" }, "variables": [ { "name": "srcPtr", "nodeType": "YulTypedName", - "src": "16869:6:1", + "src": "16975:6:1", "type": "" } ] @@ -9125,7 +9175,7 @@ { "body": { "nodeType": "YulBlock", - "src": "16955:333:1", + "src": "17061:333:1", "statements": [ { "expression": { @@ -9133,142 +9183,142 @@ { "name": "pos", "nodeType": "YulIdentifier", - "src": "16976:3:1" + "src": "17082:3:1" }, { "arguments": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "16985:4:1" + "src": "17091:4:1" }, { "name": "headStart", "nodeType": "YulIdentifier", - "src": "16991:9:1" + "src": "17097:9:1" } ], "functionName": { "name": "sub", "nodeType": "YulIdentifier", - "src": "16981:3:1" + "src": "17087:3:1" }, "nodeType": "YulFunctionCall", - "src": "16981:20:1" + "src": "17087:20:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "16969:6:1" + "src": "17075:6:1" }, "nodeType": "YulFunctionCall", - "src": "16969:33:1" + "src": "17075:33:1" }, "nodeType": "YulExpressionStatement", - "src": "16969:33:1" + "src": "17075:33:1" }, { "nodeType": "YulVariableDeclaration", - "src": "17015:34:1", + "src": "17121:34:1", "value": { "arguments": [ { "name": "srcPtr", "nodeType": "YulIdentifier", - "src": "17042:6:1" + "src": "17148:6:1" } ], "functionName": { "name": "mload", "nodeType": "YulIdentifier", - "src": "17036:5:1" + "src": "17142:5:1" }, "nodeType": "YulFunctionCall", - "src": "17036:13:1" + "src": "17142:13:1" }, "variables": [ { "name": "elementValue0", "nodeType": "YulTypedName", - "src": "17019:13:1", + "src": "17125:13:1", "type": "" } ] }, { "nodeType": "YulAssignment", - "src": "17062:90:1", + "src": "17168:90:1", "value": { "arguments": [ { "name": "elementValue0", "nodeType": "YulIdentifier", - "src": "17132:13:1" + "src": "17238:13:1" }, { "name": "tail", "nodeType": "YulIdentifier", - "src": "17147:4:1" + "src": "17253:4:1" } ], "functionName": { "name": "abi_encodeUpdatedPos_t_bytes_memory_ptr_to_t_bytes_memory_ptr", "nodeType": "YulIdentifier", - "src": "17070:61:1" + "src": "17176:61:1" }, "nodeType": "YulFunctionCall", - "src": "17070:82:1" + "src": "17176:82:1" }, "variableNames": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "17062:4:1" + "src": "17168:4:1" } ] }, { "nodeType": "YulAssignment", - "src": "17165:79:1", + "src": "17271:79:1", "value": { "arguments": [ { "name": "srcPtr", "nodeType": "YulIdentifier", - "src": "17237:6:1" + "src": "17343:6:1" } ], "functionName": { "name": "array_nextElement_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", "nodeType": "YulIdentifier", - "src": "17175:61:1" + "src": "17281:61:1" }, "nodeType": "YulFunctionCall", - "src": "17175:69:1" + "src": "17281:69:1" }, "variableNames": [ { "name": "srcPtr", "nodeType": "YulIdentifier", - "src": "17165:6:1" + "src": "17271:6:1" } ] }, { "nodeType": "YulAssignment", - "src": "17257:21:1", + "src": "17363:21:1", "value": { "arguments": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "17268:3:1" + "src": "17374:3:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "17273:4:1", + "src": "17379:4:1", "type": "", "value": "0x20" } @@ -9276,16 +9326,16 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "17264:3:1" + "src": "17370:3:1" }, "nodeType": "YulFunctionCall", - "src": "17264:14:1" + "src": "17370:14:1" }, "variableNames": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "17257:3:1" + "src": "17363:3:1" } ] } @@ -9296,41 +9346,41 @@ { "name": "i", "nodeType": "YulIdentifier", - "src": "16917:1:1" + "src": "17023:1:1" }, { "name": "length", "nodeType": "YulIdentifier", - "src": "16920:6:1" + "src": "17026:6:1" } ], "functionName": { "name": "lt", "nodeType": "YulIdentifier", - "src": "16914:2:1" + "src": "17020:2:1" }, "nodeType": "YulFunctionCall", - "src": "16914:13:1" + "src": "17020:13:1" }, "nodeType": "YulForLoop", "post": { "nodeType": "YulBlock", - "src": "16928:18:1", + "src": "17034:18:1", "statements": [ { "nodeType": "YulAssignment", - "src": "16930:14:1", + "src": "17036:14:1", "value": { "arguments": [ { "name": "i", "nodeType": "YulIdentifier", - "src": "16939:1:1" + "src": "17045:1:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "16942:1:1", + "src": "17048:1:1", "type": "", "value": "1" } @@ -9338,16 +9388,16 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "16935:3:1" + "src": "17041:3:1" }, "nodeType": "YulFunctionCall", - "src": "16935:9:1" + "src": "17041:9:1" }, "variableNames": [ { "name": "i", "nodeType": "YulIdentifier", - "src": "16930:1:1" + "src": "17036:1:1" } ] } @@ -9355,15 +9405,15 @@ }, "pre": { "nodeType": "YulBlock", - "src": "16899:14:1", + "src": "17005:14:1", "statements": [ { "nodeType": "YulVariableDeclaration", - "src": "16901:10:1", + "src": "17007:10:1", "value": { "kind": "number", "nodeType": "YulLiteral", - "src": "16910:1:1", + "src": "17016:1:1", "type": "", "value": "0" }, @@ -9371,44 +9421,44 @@ { "name": "i", "nodeType": "YulTypedName", - "src": "16905:1:1", + "src": "17011:1:1", "type": "" } ] } ] }, - "src": "16895:393:1" + "src": "17001:393:1" }, { "nodeType": "YulAssignment", - "src": "17297:11:1", + "src": "17403:11:1", "value": { "name": "tail", "nodeType": "YulIdentifier", - "src": "17304:4:1" + "src": "17410:4:1" }, "variableNames": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "17297:3:1" + "src": "17403:3:1" } ] }, { "nodeType": "YulAssignment", - "src": "17317:10:1", + "src": "17423:10:1", "value": { "name": "pos", "nodeType": "YulIdentifier", - "src": "17324:3:1" + "src": "17430:3:1" }, "variableNames": [ { "name": "end", "nodeType": "YulIdentifier", - "src": "17317:3:1" + "src": "17423:3:1" } ] } @@ -9420,13 +9470,13 @@ { "name": "value", "nodeType": "YulTypedName", - "src": "16481:5:1", + "src": "16587:5:1", "type": "" }, { "name": "pos", "nodeType": "YulTypedName", - "src": "16488:3:1", + "src": "16594:3:1", "type": "" } ], @@ -9434,31 +9484,31 @@ { "name": "end", "nodeType": "YulTypedName", - "src": "16497:3:1", + "src": "16603:3:1", "type": "" } ], - "src": "16370:963:1" + "src": "16476:963:1" }, { "body": { "nodeType": "YulBlock", - "src": "17549:533:1", + "src": "17655:533:1", "statements": [ { "nodeType": "YulVariableDeclaration", - "src": "17559:26:1", + "src": "17665:26:1", "value": { "arguments": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "17575:3:1" + "src": "17681:3:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "17580:4:1", + "src": "17686:4:1", "type": "", "value": "0x40" } @@ -9466,27 +9516,27 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "17571:3:1" + "src": "17677:3:1" }, "nodeType": "YulFunctionCall", - "src": "17571:14:1" + "src": "17677:14:1" }, "variables": [ { "name": "tail", "nodeType": "YulTypedName", - "src": "17563:4:1", + "src": "17669:4:1", "type": "" } ] }, { "nodeType": "YulBlock", - "src": "17595:163:1", + "src": "17701:163:1", "statements": [ { "nodeType": "YulVariableDeclaration", - "src": "17633:43:1", + "src": "17739:43:1", "value": { "arguments": [ { @@ -9494,12 +9544,12 @@ { "name": "value", "nodeType": "YulIdentifier", - "src": "17663:5:1" + "src": "17769:5:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "17670:4:1", + "src": "17776:4:1", "type": "", "value": "0x00" } @@ -9507,25 +9557,25 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "17659:3:1" + "src": "17765:3:1" }, "nodeType": "YulFunctionCall", - "src": "17659:16:1" + "src": "17765:16:1" } ], "functionName": { "name": "mload", "nodeType": "YulIdentifier", - "src": "17653:5:1" + "src": "17759:5:1" }, "nodeType": "YulFunctionCall", - "src": "17653:23:1" + "src": "17759:23:1" }, "variables": [ { "name": "memberValue0", "nodeType": "YulTypedName", - "src": "17637:12:1", + "src": "17743:12:1", "type": "" } ] @@ -9536,19 +9586,19 @@ { "name": "memberValue0", "nodeType": "YulIdentifier", - "src": "17719:12:1" + "src": "17825:12:1" }, { "arguments": [ { "name": "pos", "nodeType": "YulIdentifier", - "src": "17737:3:1" + "src": "17843:3:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "17742:4:1", + "src": "17848:4:1", "type": "", "value": "0x00" } @@ -9556,32 +9606,32 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "17733:3:1" + "src": "17839:3:1" }, "nodeType": "YulFunctionCall", - "src": "17733:14:1" + "src": "17839:14:1" } ], "functionName": { "name": "abi_encode_t_uint8_to_t_uint8", "nodeType": "YulIdentifier", - "src": "17689:29:1" + "src": "17795:29:1" }, "nodeType": "YulFunctionCall", - "src": "17689:59:1" + "src": "17795:59:1" }, "nodeType": "YulExpressionStatement", - "src": "17689:59:1" + "src": "17795:59:1" } ] }, { "nodeType": "YulBlock", - "src": "17768:287:1", + "src": "17874:287:1", "statements": [ { "nodeType": "YulVariableDeclaration", - "src": "17807:43:1", + "src": "17913:43:1", "value": { "arguments": [ { @@ -9589,12 +9639,12 @@ { "name": "value", "nodeType": "YulIdentifier", - "src": "17837:5:1" + "src": "17943:5:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "17844:4:1", + "src": "17950:4:1", "type": "", "value": "0x20" } @@ -9602,25 +9652,25 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "17833:3:1" + "src": "17939:3:1" }, "nodeType": "YulFunctionCall", - "src": "17833:16:1" + "src": "17939:16:1" } ], "functionName": { "name": "mload", "nodeType": "YulIdentifier", - "src": "17827:5:1" + "src": "17933:5:1" }, "nodeType": "YulFunctionCall", - "src": "17827:23:1" + "src": "17933:23:1" }, "variables": [ { "name": "memberValue0", "nodeType": "YulTypedName", - "src": "17811:12:1", + "src": "17917:12:1", "type": "" } ] @@ -9633,12 +9683,12 @@ { "name": "pos", "nodeType": "YulIdentifier", - "src": "17875:3:1" + "src": "17981:3:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "17880:4:1", + "src": "17986:4:1", "type": "", "value": "0x20" } @@ -9646,73 +9696,73 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "17871:3:1" + "src": "17977:3:1" }, "nodeType": "YulFunctionCall", - "src": "17871:14:1" + "src": "17977:14:1" }, { "arguments": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "17891:4:1" + "src": "17997:4:1" }, { "name": "pos", "nodeType": "YulIdentifier", - "src": "17897:3:1" + "src": "18003:3:1" } ], "functionName": { "name": "sub", "nodeType": "YulIdentifier", - "src": "17887:3:1" + "src": "17993:3:1" }, "nodeType": "YulFunctionCall", - "src": "17887:14:1" + "src": "17993:14:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "17864:6:1" + "src": "17970:6:1" }, "nodeType": "YulFunctionCall", - "src": "17864:38:1" + "src": "17970:38:1" }, "nodeType": "YulExpressionStatement", - "src": "17864:38:1" + "src": "17970:38:1" }, { "nodeType": "YulAssignment", - "src": "17915:129:1", + "src": "18021:129:1", "value": { "arguments": [ { "name": "memberValue0", "nodeType": "YulIdentifier", - "src": "18025:12:1" + "src": "18131:12:1" }, { "name": "tail", "nodeType": "YulIdentifier", - "src": "18039:4:1" + "src": "18145:4:1" } ], "functionName": { "name": "abi_encode_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_to_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr", "nodeType": "YulIdentifier", - "src": "17923:101:1" + "src": "18029:101:1" }, "nodeType": "YulFunctionCall", - "src": "17923:121:1" + "src": "18029:121:1" }, "variableNames": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "17915:4:1" + "src": "18021:4:1" } ] } @@ -9720,17 +9770,17 @@ }, { "nodeType": "YulAssignment", - "src": "18065:11:1", + "src": "18171:11:1", "value": { "name": "tail", "nodeType": "YulIdentifier", - "src": "18072:4:1" + "src": "18178:4:1" }, "variableNames": [ { "name": "end", "nodeType": "YulIdentifier", - "src": "18065:3:1" + "src": "18171:3:1" } ] } @@ -9742,13 +9792,13 @@ { "name": "value", "nodeType": "YulTypedName", - "src": "17528:5:1", + "src": "17634:5:1", "type": "" }, { "name": "pos", "nodeType": "YulTypedName", - "src": "17535:3:1", + "src": "17641:3:1", "type": "" } ], @@ -9756,31 +9806,31 @@ { "name": "end", "nodeType": "YulTypedName", - "src": "17544:3:1", + "src": "17650:3:1", "type": "" } ], - "src": "17419:663:1" + "src": "17525:663:1" }, { "body": { "nodeType": "YulBlock", - "src": "18364:622:1", + "src": "18470:622:1", "statements": [ { "nodeType": "YulAssignment", - "src": "18374:27:1", + "src": "18480:27:1", "value": { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "18386:9:1" + "src": "18492:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "18397:3:1", + "src": "18503:3:1", "type": "", "value": "160" } @@ -9788,16 +9838,16 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "18382:3:1" + "src": "18488:3:1" }, "nodeType": "YulFunctionCall", - "src": "18382:19:1" + "src": "18488:19:1" }, "variableNames": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "18374:4:1" + "src": "18480:4:1" } ] }, @@ -9807,19 +9857,19 @@ { "name": "value0", "nodeType": "YulIdentifier", - "src": "18451:6:1" + "src": "18557:6:1" }, { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "18464:9:1" + "src": "18570:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "18475:1:1", + "src": "18581:1:1", "type": "", "value": "0" } @@ -9827,22 +9877,22 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "18460:3:1" + "src": "18566:3:1" }, "nodeType": "YulFunctionCall", - "src": "18460:17:1" + "src": "18566:17:1" } ], "functionName": { "name": "abi_encode_t_uint8_to_t_uint8_fromStack", "nodeType": "YulIdentifier", - "src": "18411:39:1" + "src": "18517:39:1" }, "nodeType": "YulFunctionCall", - "src": "18411:67:1" + "src": "18517:67:1" }, "nodeType": "YulExpressionStatement", - "src": "18411:67:1" + "src": "18517:67:1" }, { "expression": { @@ -9850,19 +9900,19 @@ { "name": "value1", "nodeType": "YulIdentifier", - "src": "18530:6:1" + "src": "18636:6:1" }, { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "18543:9:1" + "src": "18649:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "18554:2:1", + "src": "18660:2:1", "type": "", "value": "32" } @@ -9870,22 +9920,22 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "18539:3:1" + "src": "18645:3:1" }, "nodeType": "YulFunctionCall", - "src": "18539:18:1" + "src": "18645:18:1" } ], "functionName": { "name": "abi_encode_t_uint16_to_t_uint16_fromStack", "nodeType": "YulIdentifier", - "src": "18488:41:1" + "src": "18594:41:1" }, "nodeType": "YulFunctionCall", - "src": "18488:70:1" + "src": "18594:70:1" }, "nodeType": "YulExpressionStatement", - "src": "18488:70:1" + "src": "18594:70:1" }, { "expression": { @@ -9895,12 +9945,12 @@ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "18579:9:1" + "src": "18685:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "18590:2:1", + "src": "18696:2:1", "type": "", "value": "64" } @@ -9908,73 +9958,73 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "18575:3:1" + "src": "18681:3:1" }, "nodeType": "YulFunctionCall", - "src": "18575:18:1" + "src": "18681:18:1" }, { "arguments": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "18599:4:1" + "src": "18705:4:1" }, { "name": "headStart", "nodeType": "YulIdentifier", - "src": "18605:9:1" + "src": "18711:9:1" } ], "functionName": { "name": "sub", "nodeType": "YulIdentifier", - "src": "18595:3:1" + "src": "18701:3:1" }, "nodeType": "YulFunctionCall", - "src": "18595:20:1" + "src": "18701:20:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "18568:6:1" + "src": "18674:6:1" }, "nodeType": "YulFunctionCall", - "src": "18568:48:1" + "src": "18674:48:1" }, "nodeType": "YulExpressionStatement", - "src": "18568:48:1" + "src": "18674:48:1" }, { "nodeType": "YulAssignment", - "src": "18625:122:1", + "src": "18731:122:1", "value": { "arguments": [ { "name": "value2", "nodeType": "YulIdentifier", - "src": "18733:6:1" + "src": "18839:6:1" }, { "name": "tail", "nodeType": "YulIdentifier", - "src": "18742:4:1" + "src": "18848:4:1" } ], "functionName": { "name": "abi_encode_t_struct$_Multilocation_$8_memory_ptr_to_t_struct$_Multilocation_$8_memory_ptr_fromStack", "nodeType": "YulIdentifier", - "src": "18633:99:1" + "src": "18739:99:1" }, "nodeType": "YulFunctionCall", - "src": "18633:114:1" + "src": "18739:114:1" }, "variableNames": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "18625:4:1" + "src": "18731:4:1" } ] }, @@ -9984,19 +10034,19 @@ { "name": "value3", "nodeType": "YulIdentifier", - "src": "18799:6:1" + "src": "18905:6:1" }, { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "18812:9:1" + "src": "18918:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "18823:2:1", + "src": "18929:2:1", "type": "", "value": "96" } @@ -10004,22 +10054,22 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "18808:3:1" + "src": "18914:3:1" }, "nodeType": "YulFunctionCall", - "src": "18808:18:1" + "src": "18914:18:1" } ], "functionName": { "name": "abi_encode_t_uint64_to_t_uint64_fromStack", "nodeType": "YulIdentifier", - "src": "18757:41:1" + "src": "18863:41:1" }, "nodeType": "YulFunctionCall", - "src": "18757:70:1" + "src": "18863:70:1" }, "nodeType": "YulExpressionStatement", - "src": "18757:70:1" + "src": "18863:70:1" }, { "expression": { @@ -10029,12 +10079,12 @@ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "18848:9:1" + "src": "18954:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "18859:3:1", + "src": "18965:3:1", "type": "", "value": "128" } @@ -10042,73 +10092,73 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "18844:3:1" + "src": "18950:3:1" }, "nodeType": "YulFunctionCall", - "src": "18844:19:1" + "src": "18950:19:1" }, { "arguments": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "18869:4:1" + "src": "18975:4:1" }, { "name": "headStart", "nodeType": "YulIdentifier", - "src": "18875:9:1" + "src": "18981:9:1" } ], "functionName": { "name": "sub", "nodeType": "YulIdentifier", - "src": "18865:3:1" + "src": "18971:3:1" }, "nodeType": "YulFunctionCall", - "src": "18865:20:1" + "src": "18971:20:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "18837:6:1" + "src": "18943:6:1" }, "nodeType": "YulFunctionCall", - "src": "18837:49:1" + "src": "18943:49:1" }, "nodeType": "YulExpressionStatement", - "src": "18837:49:1" + "src": "18943:49:1" }, { "nodeType": "YulAssignment", - "src": "18895:84:1", + "src": "19001:84:1", "value": { "arguments": [ { "name": "value4", "nodeType": "YulIdentifier", - "src": "18965:6:1" + "src": "19071:6:1" }, { "name": "tail", "nodeType": "YulIdentifier", - "src": "18974:4:1" + "src": "19080:4:1" } ], "functionName": { "name": "abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr_fromStack", "nodeType": "YulIdentifier", - "src": "18903:61:1" + "src": "19009:61:1" }, "nodeType": "YulFunctionCall", - "src": "18903:76:1" + "src": "19009:76:1" }, "variableNames": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "18895:4:1" + "src": "19001:4:1" } ] } @@ -10120,37 +10170,37 @@ { "name": "headStart", "nodeType": "YulTypedName", - "src": "18304:9:1", + "src": "18410:9:1", "type": "" }, { "name": "value4", "nodeType": "YulTypedName", - "src": "18316:6:1", + "src": "18422:6:1", "type": "" }, { "name": "value3", "nodeType": "YulTypedName", - "src": "18324:6:1", + "src": "18430:6:1", "type": "" }, { "name": "value2", "nodeType": "YulTypedName", - "src": "18332:6:1", + "src": "18438:6:1", "type": "" }, { "name": "value1", "nodeType": "YulTypedName", - "src": "18340:6:1", + "src": "18446:6:1", "type": "" }, { "name": "value0", "nodeType": "YulTypedName", - "src": "18348:6:1", + "src": "18454:6:1", "type": "" } ], @@ -10158,31 +10208,31 @@ { "name": "tail", "nodeType": "YulTypedName", - "src": "18359:4:1", + "src": "18465:4:1", "type": "" } ], - "src": "18088:898:1" + "src": "18194:898:1" }, { "body": { "nodeType": "YulBlock", - "src": "19146:231:1", + "src": "19252:231:1", "statements": [ { "nodeType": "YulAssignment", - "src": "19156:26:1", + "src": "19262:26:1", "value": { "arguments": [ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "19168:9:1" + "src": "19274:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "19179:2:1", + "src": "19285:2:1", "type": "", "value": "32" } @@ -10190,16 +10240,16 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "19164:3:1" + "src": "19270:3:1" }, "nodeType": "YulFunctionCall", - "src": "19164:18:1" + "src": "19270:18:1" }, "variableNames": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "19156:4:1" + "src": "19262:4:1" } ] }, @@ -10211,12 +10261,12 @@ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "19203:9:1" + "src": "19309:9:1" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "19214:1:1", + "src": "19320:1:1", "type": "", "value": "0" } @@ -10224,73 +10274,73 @@ "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "19199:3:1" + "src": "19305:3:1" }, "nodeType": "YulFunctionCall", - "src": "19199:17:1" + "src": "19305:17:1" }, { "arguments": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "19222:4:1" + "src": "19328:4:1" }, { "name": "headStart", "nodeType": "YulIdentifier", - "src": "19228:9:1" + "src": "19334:9:1" } ], "functionName": { "name": "sub", "nodeType": "YulIdentifier", - "src": "19218:3:1" + "src": "19324:3:1" }, "nodeType": "YulFunctionCall", - "src": "19218:20:1" + "src": "19324:20:1" } ], "functionName": { "name": "mstore", "nodeType": "YulIdentifier", - "src": "19192:6:1" + "src": "19298:6:1" }, "nodeType": "YulFunctionCall", - "src": "19192:47:1" + "src": "19298:47:1" }, "nodeType": "YulExpressionStatement", - "src": "19192:47:1" + "src": "19298:47:1" }, { "nodeType": "YulAssignment", - "src": "19248:122:1", + "src": "19354:122:1", "value": { "arguments": [ { "name": "value0", "nodeType": "YulIdentifier", - "src": "19356:6:1" + "src": "19462:6:1" }, { "name": "tail", "nodeType": "YulIdentifier", - "src": "19365:4:1" + "src": "19471:4:1" } ], "functionName": { "name": "abi_encode_t_struct$_Multilocation_$8_memory_ptr_to_t_struct$_Multilocation_$8_memory_ptr_fromStack", "nodeType": "YulIdentifier", - "src": "19256:99:1" + "src": "19362:99:1" }, "nodeType": "YulFunctionCall", - "src": "19256:114:1" + "src": "19362:114:1" }, "variableNames": [ { "name": "tail", "nodeType": "YulIdentifier", - "src": "19248:4:1" + "src": "19354:4:1" } ] } @@ -10302,13 +10352,13 @@ { "name": "headStart", "nodeType": "YulTypedName", - "src": "19118:9:1", + "src": "19224:9:1", "type": "" }, { "name": "value0", "nodeType": "YulTypedName", - "src": "19130:6:1", + "src": "19236:6:1", "type": "" } ], @@ -10316,21 +10366,101 @@ { "name": "tail", "nodeType": "YulTypedName", - "src": "19141:4:1", + "src": "19247:4:1", + "type": "" + } + ], + "src": "19098:385:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "19551:79:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "19561:22:1", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "19576:6:1" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "19570:5:1" + }, + "nodeType": "YulFunctionCall", + "src": "19570:13:1" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "19561:5:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "19618:5:1" + } + ], + "functionName": { + "name": "validator_revert_t_uint64", + "nodeType": "YulIdentifier", + "src": "19592:25:1" + }, + "nodeType": "YulFunctionCall", + "src": "19592:32:1" + }, + "nodeType": "YulExpressionStatement", + "src": "19592:32:1" + } + ] + }, + "name": "abi_decode_t_uint64_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "19529:6:1", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "19537:3:1", "type": "" } ], - "src": "18992:385:1" + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "19545:5:1", + "type": "" + } + ], + "src": "19489:141:1" }, { "body": { "nodeType": "YulBlock", - "src": "19426:79:1", + "src": "19679:79:1", "statements": [ { "body": { "nodeType": "YulBlock", - "src": "19483:16:1", + "src": "19736:16:1", "statements": [ { "expression": { @@ -10338,14 +10468,14 @@ { "kind": "number", "nodeType": "YulLiteral", - "src": "19492:1:1", + "src": "19745:1:1", "type": "", "value": "0" }, { "kind": "number", "nodeType": "YulLiteral", - "src": "19495:1:1", + "src": "19748:1:1", "type": "", "value": "0" } @@ -10353,13 +10483,13 @@ "functionName": { "name": "revert", "nodeType": "YulIdentifier", - "src": "19485:6:1" + "src": "19738:6:1" }, "nodeType": "YulFunctionCall", - "src": "19485:12:1" + "src": "19738:12:1" }, "nodeType": "YulExpressionStatement", - "src": "19485:12:1" + "src": "19738:12:1" } ] }, @@ -10370,44 +10500,44 @@ { "name": "value", "nodeType": "YulIdentifier", - "src": "19449:5:1" + "src": "19702:5:1" }, { "arguments": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "19474:5:1" + "src": "19727:5:1" } ], "functionName": { "name": "cleanup_t_uint256", "nodeType": "YulIdentifier", - "src": "19456:17:1" + "src": "19709:17:1" }, "nodeType": "YulFunctionCall", - "src": "19456:24:1" + "src": "19709:24:1" } ], "functionName": { "name": "eq", "nodeType": "YulIdentifier", - "src": "19446:2:1" + "src": "19699:2:1" }, "nodeType": "YulFunctionCall", - "src": "19446:35:1" + "src": "19699:35:1" } ], "functionName": { "name": "iszero", "nodeType": "YulIdentifier", - "src": "19439:6:1" + "src": "19692:6:1" }, "nodeType": "YulFunctionCall", - "src": "19439:43:1" + "src": "19692:43:1" }, "nodeType": "YulIf", - "src": "19436:63:1" + "src": "19689:63:1" } ] }, @@ -10417,41 +10547,41 @@ { "name": "value", "nodeType": "YulTypedName", - "src": "19419:5:1", + "src": "19672:5:1", "type": "" } ], - "src": "19383:122:1" + "src": "19636:122:1" }, { "body": { "nodeType": "YulBlock", - "src": "19574:80:1", + "src": "19827:80:1", "statements": [ { "nodeType": "YulAssignment", - "src": "19584:22:1", + "src": "19837:22:1", "value": { "arguments": [ { "name": "offset", "nodeType": "YulIdentifier", - "src": "19599:6:1" + "src": "19852:6:1" } ], "functionName": { "name": "mload", "nodeType": "YulIdentifier", - "src": "19593:5:1" + "src": "19846:5:1" }, "nodeType": "YulFunctionCall", - "src": "19593:13:1" + "src": "19846:13:1" }, "variableNames": [ { "name": "value", "nodeType": "YulIdentifier", - "src": "19584:5:1" + "src": "19837:5:1" } ] }, @@ -10461,19 +10591,19 @@ { "name": "value", "nodeType": "YulIdentifier", - "src": "19642:5:1" + "src": "19895:5:1" } ], "functionName": { "name": "validator_revert_t_uint256", "nodeType": "YulIdentifier", - "src": "19615:26:1" + "src": "19868:26:1" }, "nodeType": "YulFunctionCall", - "src": "19615:33:1" + "src": "19868:33:1" }, "nodeType": "YulExpressionStatement", - "src": "19615:33:1" + "src": "19868:33:1" } ] }, @@ -10483,13 +10613,13 @@ { "name": "offset", "nodeType": "YulTypedName", - "src": "19552:6:1", + "src": "19805:6:1", "type": "" }, { "name": "end", "nodeType": "YulTypedName", - "src": "19560:3:1", + "src": "19813:3:1", "type": "" } ], @@ -10497,186 +10627,179 @@ { "name": "value", "nodeType": "YulTypedName", - "src": "19568:5:1", + "src": "19821:5:1", "type": "" } ], - "src": "19511:143:1" + "src": "19764:143:1" }, { "body": { "nodeType": "YulBlock", - "src": "19722:79:1", + "src": "20022:550:1", "statements": [ { - "nodeType": "YulAssignment", - "src": "19732:22:1", - "value": { + "body": { + "nodeType": "YulBlock", + "src": "20068:83:1", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "20070:77:1" + }, + "nodeType": "YulFunctionCall", + "src": "20070:79:1" + }, + "nodeType": "YulExpressionStatement", + "src": "20070:79:1" + } + ] + }, + "condition": { "arguments": [ { - "name": "offset", - "nodeType": "YulIdentifier", - "src": "19747:6:1" + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "20043:7:1" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "20052:9:1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "20039:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "20039:23:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20064:2:1", + "type": "", + "value": "96" } ], "functionName": { - "name": "mload", + "name": "slt", "nodeType": "YulIdentifier", - "src": "19741:5:1" + "src": "20035:3:1" }, "nodeType": "YulFunctionCall", - "src": "19741:13:1" + "src": "20035:32:1" }, - "variableNames": [ - { - "name": "value", - "nodeType": "YulIdentifier", - "src": "19732:5:1" - } - ] + "nodeType": "YulIf", + "src": "20032:119:1" }, { - "expression": { - "arguments": [ - { - "name": "value", - "nodeType": "YulIdentifier", - "src": "19789:5:1" - } - ], - "functionName": { - "name": "validator_revert_t_uint64", - "nodeType": "YulIdentifier", - "src": "19763:25:1" + "nodeType": "YulBlock", + "src": "20161:127:1", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "20176:15:1", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20190:1:1", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "20180:6:1", + "type": "" + } + ] }, - "nodeType": "YulFunctionCall", - "src": "19763:32:1" - }, - "nodeType": "YulExpressionStatement", - "src": "19763:32:1" - } - ] - }, - "name": "abi_decode_t_uint64_fromMemory", - "nodeType": "YulFunctionDefinition", - "parameters": [ - { - "name": "offset", - "nodeType": "YulTypedName", - "src": "19700:6:1", - "type": "" - }, - { - "name": "end", - "nodeType": "YulTypedName", - "src": "19708:3:1", - "type": "" - } - ], - "returnVariables": [ - { - "name": "value", - "nodeType": "YulTypedName", - "src": "19716:5:1", - "type": "" - } - ], - "src": "19660:141:1" - }, - { - "body": { - "nodeType": "YulBlock", - "src": "19900:412:1", - "statements": [ - { - "body": { - "nodeType": "YulBlock", - "src": "19946:83:1", - "statements": [ - { - "expression": { - "arguments": [], - "functionName": { - "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", - "nodeType": "YulIdentifier", - "src": "19948:77:1" - }, - "nodeType": "YulFunctionCall", - "src": "19948:79:1" - }, - "nodeType": "YulExpressionStatement", - "src": "19948:79:1" - } - ] - }, - "condition": { - "arguments": [ - { + { + "nodeType": "YulAssignment", + "src": "20205:73:1", + "value": { "arguments": [ { - "name": "dataEnd", - "nodeType": "YulIdentifier", - "src": "19921:7:1" + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "20250:9:1" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "20261:6:1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20246:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "20246:22:1" }, { - "name": "headStart", + "name": "dataEnd", "nodeType": "YulIdentifier", - "src": "19930:9:1" + "src": "20270:7:1" } ], "functionName": { - "name": "sub", + "name": "abi_decode_t_uint64_fromMemory", "nodeType": "YulIdentifier", - "src": "19917:3:1" + "src": "20215:30:1" }, "nodeType": "YulFunctionCall", - "src": "19917:23:1" + "src": "20215:63:1" }, - { - "kind": "number", - "nodeType": "YulLiteral", - "src": "19942:2:1", - "type": "", - "value": "64" - } - ], - "functionName": { - "name": "slt", - "nodeType": "YulIdentifier", - "src": "19913:3:1" - }, - "nodeType": "YulFunctionCall", - "src": "19913:32:1" - }, - "nodeType": "YulIf", - "src": "19910:119:1" + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "20205:6:1" + } + ] + } + ] }, { "nodeType": "YulBlock", - "src": "20039:128:1", + "src": "20298:129:1", "statements": [ { "nodeType": "YulVariableDeclaration", - "src": "20054:15:1", + "src": "20313:16:1", "value": { "kind": "number", "nodeType": "YulLiteral", - "src": "20068:1:1", + "src": "20327:2:1", "type": "", - "value": "0" + "value": "32" }, "variables": [ { "name": "offset", "nodeType": "YulTypedName", - "src": "20058:6:1", + "src": "20317:6:1", "type": "" } ] }, { "nodeType": "YulAssignment", - "src": "20083:74:1", + "src": "20343:74:1", "value": { "arguments": [ { @@ -10684,41 +10807,41 @@ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "20129:9:1" + "src": "20389:9:1" }, { "name": "offset", "nodeType": "YulIdentifier", - "src": "20140:6:1" + "src": "20400:6:1" } ], "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "20125:3:1" + "src": "20385:3:1" }, "nodeType": "YulFunctionCall", - "src": "20125:22:1" + "src": "20385:22:1" }, { "name": "dataEnd", "nodeType": "YulIdentifier", - "src": "20149:7:1" + "src": "20409:7:1" } ], "functionName": { "name": "abi_decode_t_uint256_fromMemory", "nodeType": "YulIdentifier", - "src": "20093:31:1" + "src": "20353:31:1" }, "nodeType": "YulFunctionCall", - "src": "20093:64:1" + "src": "20353:64:1" }, "variableNames": [ { - "name": "value0", + "name": "value1", "nodeType": "YulIdentifier", - "src": "20083:6:1" + "src": "20343:6:1" } ] } @@ -10726,30 +10849,30 @@ }, { "nodeType": "YulBlock", - "src": "20177:128:1", + "src": "20437:128:1", "statements": [ { "nodeType": "YulVariableDeclaration", - "src": "20192:16:1", + "src": "20452:16:1", "value": { "kind": "number", "nodeType": "YulLiteral", - "src": "20206:2:1", + "src": "20466:2:1", "type": "", - "value": "32" + "value": "64" }, "variables": [ { "name": "offset", "nodeType": "YulTypedName", - "src": "20196:6:1", + "src": "20456:6:1", "type": "" } ] }, { "nodeType": "YulAssignment", - "src": "20222:73:1", + "src": "20482:73:1", "value": { "arguments": [ { @@ -10757,41 +10880,41 @@ { "name": "headStart", "nodeType": "YulIdentifier", - "src": "20267:9:1" + "src": "20527:9:1" }, { "name": "offset", "nodeType": "YulIdentifier", - "src": "20278:6:1" + "src": "20538:6:1" } ], "functionName": { "name": "add", "nodeType": "YulIdentifier", - "src": "20263:3:1" + "src": "20523:3:1" }, "nodeType": "YulFunctionCall", - "src": "20263:22:1" + "src": "20523:22:1" }, { "name": "dataEnd", "nodeType": "YulIdentifier", - "src": "20287:7:1" + "src": "20547:7:1" } ], "functionName": { "name": "abi_decode_t_uint64_fromMemory", "nodeType": "YulIdentifier", - "src": "20232:30:1" + "src": "20492:30:1" }, "nodeType": "YulFunctionCall", - "src": "20232:63:1" + "src": "20492:63:1" }, "variableNames": [ { - "name": "value1", + "name": "value2", "nodeType": "YulIdentifier", - "src": "20222:6:1" + "src": "20482:6:1" } ] } @@ -10799,19 +10922,19 @@ } ] }, - "name": "abi_decode_tuple_t_uint256t_uint64_fromMemory", + "name": "abi_decode_tuple_t_uint64t_uint256t_uint64_fromMemory", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "headStart", "nodeType": "YulTypedName", - "src": "19862:9:1", + "src": "19976:9:1", "type": "" }, { "name": "dataEnd", "nodeType": "YulTypedName", - "src": "19873:7:1", + "src": "19987:7:1", "type": "" } ], @@ -10819,21 +10942,27 @@ { "name": "value0", "nodeType": "YulTypedName", - "src": "19885:6:1", + "src": "19999:6:1", "type": "" }, { "name": "value1", "nodeType": "YulTypedName", - "src": "19893:6:1", + "src": "20007:6:1", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "20015:6:1", "type": "" } ], - "src": "19807:505:1" + "src": "19913:659:1" } ] }, - "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint8(value) -> cleaned {\n cleaned := and(value, 0xff)\n }\n\n function validator_revert_t_uint8(value) {\n if iszero(eq(value, cleanup_t_uint8(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint8(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint8(value)\n }\n\n function cleanup_t_uint16(value) -> cleaned {\n cleaned := and(value, 0xffff)\n }\n\n function validator_revert_t_uint16(value) {\n if iszero(eq(value, cleanup_t_uint16(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint16(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint16(value)\n }\n\n function cleanup_t_uint160(value) -> cleaned {\n cleaned := and(value, 0xffffffffffffffffffffffffffffffffffffffff)\n }\n\n function cleanup_t_address(value) -> cleaned {\n cleaned := cleanup_t_uint160(value)\n }\n\n function validator_revert_t_address(value) {\n if iszero(eq(value, cleanup_t_address(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_address(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_address(value)\n }\n\n function cleanup_t_uint64(value) -> cleaned {\n cleaned := and(value, 0xffffffffffffffff)\n }\n\n function validator_revert_t_uint64(value) {\n if iszero(eq(value, cleanup_t_uint64(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint64(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint64(value)\n }\n\n function revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d() {\n revert(0, 0)\n }\n\n function revert_error_987264b3b1d58a9c7f8255e93e81c77d86d6299019c33110a076957a3e06e2ae() {\n revert(0, 0)\n }\n\n function round_up_to_mul_of_32(value) -> result {\n result := and(add(value, 31), not(31))\n }\n\n function panic_error_0x41() {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n\n function finalize_allocation(memPtr, size) {\n let newFreePtr := add(memPtr, round_up_to_mul_of_32(size))\n // protect against overflow\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n\n function allocate_memory(size) -> memPtr {\n memPtr := allocate_unbounded()\n finalize_allocation(memPtr, size)\n }\n\n function array_allocation_size_t_bytes_memory_ptr(length) -> size {\n // Make sure we can allocate memory without overflow\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n\n size := round_up_to_mul_of_32(length)\n\n // add length slot\n size := add(size, 0x20)\n\n }\n\n function copy_calldata_to_memory(src, dst, length) {\n calldatacopy(dst, src, length)\n // clear end\n mstore(add(dst, length), 0)\n }\n\n function abi_decode_available_length_t_bytes_memory_ptr(src, length, end) -> array {\n array := allocate_memory(array_allocation_size_t_bytes_memory_ptr(length))\n mstore(array, length)\n let dst := add(array, 0x20)\n if gt(add(src, length), end) { revert_error_987264b3b1d58a9c7f8255e93e81c77d86d6299019c33110a076957a3e06e2ae() }\n copy_calldata_to_memory(src, dst, length)\n }\n\n // bytes\n function abi_decode_t_bytes_memory_ptr(offset, end) -> array {\n if iszero(slt(add(offset, 0x1f), end)) { revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d() }\n let length := calldataload(offset)\n array := abi_decode_available_length_t_bytes_memory_ptr(add(offset, 0x20), length, end)\n }\n\n function abi_decode_tuple_t_uint8t_uint16t_addresst_uint64t_bytes_memory_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4 {\n if slt(sub(dataEnd, headStart), 160) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint8(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 32\n\n value1 := abi_decode_t_uint16(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 64\n\n value2 := abi_decode_t_address(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 96\n\n value3 := abi_decode_t_uint64(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := calldataload(add(headStart, 128))\n if gt(offset, 0xffffffffffffffff) { revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() }\n\n value4 := abi_decode_t_bytes_memory_ptr(add(headStart, offset), dataEnd)\n }\n\n }\n\n function identity(value) -> ret {\n ret := value\n }\n\n function convert_t_uint160_to_t_uint160(value) -> converted {\n converted := cleanup_t_uint160(identity(cleanup_t_uint160(value)))\n }\n\n function convert_t_uint160_to_t_address(value) -> converted {\n converted := convert_t_uint160_to_t_uint160(value)\n }\n\n function convert_t_contract$_XcmTransactor_$57_to_t_address(value) -> converted {\n converted := convert_t_uint160_to_t_address(value)\n }\n\n function abi_encode_t_contract$_XcmTransactor_$57_to_t_address_fromStack(value, pos) {\n mstore(pos, convert_t_contract$_XcmTransactor_$57_to_t_address(value))\n }\n\n function abi_encode_tuple_t_contract$_XcmTransactor_$57__to_t_address__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_contract$_XcmTransactor_$57_to_t_address_fromStack(value0, add(headStart, 0))\n\n }\n\n function abi_decode_tuple_t_uint16(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint16(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_address_to_t_address_fromStack(value, pos) {\n mstore(pos, cleanup_t_address(value))\n }\n\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_address_to_t_address_fromStack(value0, add(headStart, 0))\n\n }\n\n function revert_error_3538a459e4a0eb828f1aed5ebe5dc96fe59620a31d9b33e41259bb820cae769f() {\n revert(0, 0)\n }\n\n function revert_error_5e8f644817bc4960744f35c15999b6eff64ae702f94b1c46297cfd4e1aec2421() {\n revert(0, 0)\n }\n\n function array_allocation_size_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(length) -> size {\n // Make sure we can allocate memory without overflow\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n\n size := mul(length, 0x20)\n\n // add length slot\n size := add(size, 0x20)\n\n }\n\n function revert_error_81385d8c0b31fffe14be1da910c8bd3a80be4cfa248e04f42ec0faea3132a8ef() {\n revert(0, 0)\n }\n\n // bytes[]\n function abi_decode_available_length_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(offset, length, end) -> array {\n array := allocate_memory(array_allocation_size_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(length))\n let dst := array\n\n mstore(array, length)\n dst := add(array, 0x20)\n\n let srcEnd := add(offset, mul(length, 0x20))\n if gt(srcEnd, end) {\n revert_error_81385d8c0b31fffe14be1da910c8bd3a80be4cfa248e04f42ec0faea3132a8ef()\n }\n for { let src := offset } lt(src, srcEnd) { src := add(src, 0x20) }\n {\n\n let innerOffset := calldataload(src)\n if gt(innerOffset, 0xffffffffffffffff) { revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d() }\n let elementPos := add(offset, innerOffset)\n\n mstore(dst, abi_decode_t_bytes_memory_ptr(elementPos, end))\n dst := add(dst, 0x20)\n }\n }\n\n // bytes[]\n function abi_decode_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(offset, end) -> array {\n if iszero(slt(add(offset, 0x1f), end)) { revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d() }\n let length := calldataload(offset)\n array := abi_decode_available_length_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(add(offset, 0x20), length, end)\n }\n\n // struct XcmTransactor.Multilocation\n function abi_decode_t_struct$_Multilocation_$8_memory_ptr(headStart, end) -> value {\n if slt(sub(end, headStart), 0x40) { revert_error_3538a459e4a0eb828f1aed5ebe5dc96fe59620a31d9b33e41259bb820cae769f() }\n value := allocate_memory(0x40)\n\n {\n // parents\n\n let offset := 0\n\n mstore(add(value, 0x00), abi_decode_t_uint8(add(headStart, offset), end))\n\n }\n\n {\n // interior\n\n let offset := calldataload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert_error_5e8f644817bc4960744f35c15999b6eff64ae702f94b1c46297cfd4e1aec2421() }\n\n mstore(add(value, 0x20), abi_decode_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(add(headStart, offset), end))\n\n }\n\n }\n\n function abi_decode_tuple_t_uint8t_uint16t_struct$_Multilocation_$8_memory_ptrt_uint64t_bytes_memory_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4 {\n if slt(sub(dataEnd, headStart), 160) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint8(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 32\n\n value1 := abi_decode_t_uint16(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() }\n\n value2 := abi_decode_t_struct$_Multilocation_$8_memory_ptr(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 96\n\n value3 := abi_decode_t_uint64(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := calldataload(add(headStart, 128))\n if gt(offset, 0xffffffffffffffff) { revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() }\n\n value4 := abi_decode_t_bytes_memory_ptr(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_decode_tuple_t_struct$_Multilocation_$8_memory_ptr(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := calldataload(add(headStart, 0))\n if gt(offset, 0xffffffffffffffff) { revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() }\n\n value0 := abi_decode_t_struct$_Multilocation_$8_memory_ptr(add(headStart, offset), dataEnd)\n }\n\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_t_uint64_to_t_uint64_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint64(value))\n }\n\n function abi_encode_tuple_t_uint256_t_uint64__to_t_uint256_t_uint64__fromStack_reversed(headStart , value1, value0) -> tail {\n tail := add(headStart, 64)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n abi_encode_t_uint64_to_t_uint64_fromStack(value1, add(headStart, 32))\n\n }\n\n function abi_encode_t_uint8_to_t_uint8_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint8(value))\n }\n\n function abi_encode_t_uint16_to_t_uint16_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint16(value))\n }\n\n function array_length_t_bytes_memory_ptr(value) -> length {\n\n length := mload(value)\n\n }\n\n function array_storeLengthForEncoding_t_bytes_memory_ptr_fromStack(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function copy_memory_to_memory(src, dst, length) {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length)\n {\n // clear end\n mstore(add(dst, length), 0)\n }\n }\n\n function abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr_fromStack(value, pos) -> end {\n let length := array_length_t_bytes_memory_ptr(value)\n pos := array_storeLengthForEncoding_t_bytes_memory_ptr_fromStack(pos, length)\n copy_memory_to_memory(add(value, 0x20), pos, length)\n end := add(pos, round_up_to_mul_of_32(length))\n }\n\n function abi_encode_tuple_t_uint8_t_uint16_t_address_t_uint64_t_bytes_memory_ptr__to_t_uint8_t_uint16_t_address_t_uint64_t_bytes_memory_ptr__fromStack_reversed(headStart , value4, value3, value2, value1, value0) -> tail {\n tail := add(headStart, 160)\n\n abi_encode_t_uint8_to_t_uint8_fromStack(value0, add(headStart, 0))\n\n abi_encode_t_uint16_to_t_uint16_fromStack(value1, add(headStart, 32))\n\n abi_encode_t_address_to_t_address_fromStack(value2, add(headStart, 64))\n\n abi_encode_t_uint64_to_t_uint64_fromStack(value3, add(headStart, 96))\n\n mstore(add(headStart, 128), sub(tail, headStart))\n tail := abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr_fromStack(value4, tail)\n\n }\n\n function abi_encode_tuple_t_uint16__to_t_uint16__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint16_to_t_uint16_fromStack(value0, add(headStart, 0))\n\n }\n\n function abi_decode_t_address_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_address(value)\n }\n\n function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_address_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint8_to_t_uint8(value, pos) {\n mstore(pos, cleanup_t_uint8(value))\n }\n\n function array_length_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(value) -> length {\n\n length := mload(value)\n\n }\n\n function array_storeLengthForEncoding_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function array_dataslot_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(ptr) -> data {\n data := ptr\n\n data := add(ptr, 0x20)\n\n }\n\n function array_storeLengthForEncoding_t_bytes_memory_ptr(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr(value, pos) -> end {\n let length := array_length_t_bytes_memory_ptr(value)\n pos := array_storeLengthForEncoding_t_bytes_memory_ptr(pos, length)\n copy_memory_to_memory(add(value, 0x20), pos, length)\n end := add(pos, round_up_to_mul_of_32(length))\n }\n\n function abi_encodeUpdatedPos_t_bytes_memory_ptr_to_t_bytes_memory_ptr(value0, pos) -> updatedPos {\n updatedPos := abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr(value0, pos)\n }\n\n function array_nextElement_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(ptr) -> next {\n next := add(ptr, 0x20)\n }\n\n // bytes[] -> bytes[]\n function abi_encode_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_to_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(value, pos) -> end {\n let length := array_length_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(value)\n pos := array_storeLengthForEncoding_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(pos, length)\n let headStart := pos\n let tail := add(pos, mul(length, 0x20))\n let baseRef := array_dataslot_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(value)\n let srcPtr := baseRef\n for { let i := 0 } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, sub(tail, headStart))\n let elementValue0 := mload(srcPtr)\n tail := abi_encodeUpdatedPos_t_bytes_memory_ptr_to_t_bytes_memory_ptr(elementValue0, tail)\n srcPtr := array_nextElement_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(srcPtr)\n pos := add(pos, 0x20)\n }\n pos := tail\n end := pos\n }\n\n // struct XcmTransactor.Multilocation -> struct XcmTransactor.Multilocation\n function abi_encode_t_struct$_Multilocation_$8_memory_ptr_to_t_struct$_Multilocation_$8_memory_ptr_fromStack(value, pos) -> end {\n let tail := add(pos, 0x40)\n\n {\n // parents\n\n let memberValue0 := mload(add(value, 0x00))\n abi_encode_t_uint8_to_t_uint8(memberValue0, add(pos, 0x00))\n }\n\n {\n // interior\n\n let memberValue0 := mload(add(value, 0x20))\n\n mstore(add(pos, 0x20), sub(tail, pos))\n tail := abi_encode_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_to_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(memberValue0, tail)\n\n }\n\n end := tail\n }\n\n function abi_encode_tuple_t_uint8_t_uint16_t_struct$_Multilocation_$8_memory_ptr_t_uint64_t_bytes_memory_ptr__to_t_uint8_t_uint16_t_struct$_Multilocation_$8_memory_ptr_t_uint64_t_bytes_memory_ptr__fromStack_reversed(headStart , value4, value3, value2, value1, value0) -> tail {\n tail := add(headStart, 160)\n\n abi_encode_t_uint8_to_t_uint8_fromStack(value0, add(headStart, 0))\n\n abi_encode_t_uint16_to_t_uint16_fromStack(value1, add(headStart, 32))\n\n mstore(add(headStart, 64), sub(tail, headStart))\n tail := abi_encode_t_struct$_Multilocation_$8_memory_ptr_to_t_struct$_Multilocation_$8_memory_ptr_fromStack(value2, tail)\n\n abi_encode_t_uint64_to_t_uint64_fromStack(value3, add(headStart, 96))\n\n mstore(add(headStart, 128), sub(tail, headStart))\n tail := abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr_fromStack(value4, tail)\n\n }\n\n function abi_encode_tuple_t_struct$_Multilocation_$8_memory_ptr__to_t_struct$_Multilocation_$8_memory_ptr__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_struct$_Multilocation_$8_memory_ptr_to_t_struct$_Multilocation_$8_memory_ptr_fromStack(value0, tail)\n\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_t_uint64_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint64(value)\n }\n\n function abi_decode_tuple_t_uint256t_uint64_fromMemory(headStart, dataEnd) -> value0, value1 {\n if slt(sub(dataEnd, headStart), 64) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 32\n\n value1 := abi_decode_t_uint64_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n}\n", + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint8(value) -> cleaned {\n cleaned := and(value, 0xff)\n }\n\n function validator_revert_t_uint8(value) {\n if iszero(eq(value, cleanup_t_uint8(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint8(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint8(value)\n }\n\n function cleanup_t_uint16(value) -> cleaned {\n cleaned := and(value, 0xffff)\n }\n\n function validator_revert_t_uint16(value) {\n if iszero(eq(value, cleanup_t_uint16(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint16(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint16(value)\n }\n\n function cleanup_t_uint160(value) -> cleaned {\n cleaned := and(value, 0xffffffffffffffffffffffffffffffffffffffff)\n }\n\n function cleanup_t_address(value) -> cleaned {\n cleaned := cleanup_t_uint160(value)\n }\n\n function validator_revert_t_address(value) {\n if iszero(eq(value, cleanup_t_address(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_address(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_address(value)\n }\n\n function cleanup_t_uint64(value) -> cleaned {\n cleaned := and(value, 0xffffffffffffffff)\n }\n\n function validator_revert_t_uint64(value) {\n if iszero(eq(value, cleanup_t_uint64(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint64(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint64(value)\n }\n\n function revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d() {\n revert(0, 0)\n }\n\n function revert_error_987264b3b1d58a9c7f8255e93e81c77d86d6299019c33110a076957a3e06e2ae() {\n revert(0, 0)\n }\n\n function round_up_to_mul_of_32(value) -> result {\n result := and(add(value, 31), not(31))\n }\n\n function panic_error_0x41() {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n\n function finalize_allocation(memPtr, size) {\n let newFreePtr := add(memPtr, round_up_to_mul_of_32(size))\n // protect against overflow\n if or(gt(newFreePtr, 0xffffffffffffffff), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n }\n\n function allocate_memory(size) -> memPtr {\n memPtr := allocate_unbounded()\n finalize_allocation(memPtr, size)\n }\n\n function array_allocation_size_t_bytes_memory_ptr(length) -> size {\n // Make sure we can allocate memory without overflow\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n\n size := round_up_to_mul_of_32(length)\n\n // add length slot\n size := add(size, 0x20)\n\n }\n\n function copy_calldata_to_memory(src, dst, length) {\n calldatacopy(dst, src, length)\n // clear end\n mstore(add(dst, length), 0)\n }\n\n function abi_decode_available_length_t_bytes_memory_ptr(src, length, end) -> array {\n array := allocate_memory(array_allocation_size_t_bytes_memory_ptr(length))\n mstore(array, length)\n let dst := add(array, 0x20)\n if gt(add(src, length), end) { revert_error_987264b3b1d58a9c7f8255e93e81c77d86d6299019c33110a076957a3e06e2ae() }\n copy_calldata_to_memory(src, dst, length)\n }\n\n // bytes\n function abi_decode_t_bytes_memory_ptr(offset, end) -> array {\n if iszero(slt(add(offset, 0x1f), end)) { revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d() }\n let length := calldataload(offset)\n array := abi_decode_available_length_t_bytes_memory_ptr(add(offset, 0x20), length, end)\n }\n\n function abi_decode_tuple_t_uint8t_uint16t_addresst_uint64t_bytes_memory_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4 {\n if slt(sub(dataEnd, headStart), 160) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint8(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 32\n\n value1 := abi_decode_t_uint16(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 64\n\n value2 := abi_decode_t_address(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 96\n\n value3 := abi_decode_t_uint64(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := calldataload(add(headStart, 128))\n if gt(offset, 0xffffffffffffffff) { revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() }\n\n value4 := abi_decode_t_bytes_memory_ptr(add(headStart, offset), dataEnd)\n }\n\n }\n\n function identity(value) -> ret {\n ret := value\n }\n\n function convert_t_uint160_to_t_uint160(value) -> converted {\n converted := cleanup_t_uint160(identity(cleanup_t_uint160(value)))\n }\n\n function convert_t_uint160_to_t_address(value) -> converted {\n converted := convert_t_uint160_to_t_uint160(value)\n }\n\n function convert_t_contract$_XcmTransactor_$59_to_t_address(value) -> converted {\n converted := convert_t_uint160_to_t_address(value)\n }\n\n function abi_encode_t_contract$_XcmTransactor_$59_to_t_address_fromStack(value, pos) {\n mstore(pos, convert_t_contract$_XcmTransactor_$59_to_t_address(value))\n }\n\n function abi_encode_tuple_t_contract$_XcmTransactor_$59__to_t_address__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_contract$_XcmTransactor_$59_to_t_address_fromStack(value0, add(headStart, 0))\n\n }\n\n function abi_decode_tuple_t_uint16(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint16(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_address_to_t_address_fromStack(value, pos) {\n mstore(pos, cleanup_t_address(value))\n }\n\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_address_to_t_address_fromStack(value0, add(headStart, 0))\n\n }\n\n function revert_error_3538a459e4a0eb828f1aed5ebe5dc96fe59620a31d9b33e41259bb820cae769f() {\n revert(0, 0)\n }\n\n function revert_error_5e8f644817bc4960744f35c15999b6eff64ae702f94b1c46297cfd4e1aec2421() {\n revert(0, 0)\n }\n\n function array_allocation_size_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(length) -> size {\n // Make sure we can allocate memory without overflow\n if gt(length, 0xffffffffffffffff) { panic_error_0x41() }\n\n size := mul(length, 0x20)\n\n // add length slot\n size := add(size, 0x20)\n\n }\n\n function revert_error_81385d8c0b31fffe14be1da910c8bd3a80be4cfa248e04f42ec0faea3132a8ef() {\n revert(0, 0)\n }\n\n // bytes[]\n function abi_decode_available_length_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(offset, length, end) -> array {\n array := allocate_memory(array_allocation_size_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(length))\n let dst := array\n\n mstore(array, length)\n dst := add(array, 0x20)\n\n let srcEnd := add(offset, mul(length, 0x20))\n if gt(srcEnd, end) {\n revert_error_81385d8c0b31fffe14be1da910c8bd3a80be4cfa248e04f42ec0faea3132a8ef()\n }\n for { let src := offset } lt(src, srcEnd) { src := add(src, 0x20) }\n {\n\n let innerOffset := calldataload(src)\n if gt(innerOffset, 0xffffffffffffffff) { revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d() }\n let elementPos := add(offset, innerOffset)\n\n mstore(dst, abi_decode_t_bytes_memory_ptr(elementPos, end))\n dst := add(dst, 0x20)\n }\n }\n\n // bytes[]\n function abi_decode_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(offset, end) -> array {\n if iszero(slt(add(offset, 0x1f), end)) { revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d() }\n let length := calldataload(offset)\n array := abi_decode_available_length_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(add(offset, 0x20), length, end)\n }\n\n // struct XcmTransactor.Multilocation\n function abi_decode_t_struct$_Multilocation_$8_memory_ptr(headStart, end) -> value {\n if slt(sub(end, headStart), 0x40) { revert_error_3538a459e4a0eb828f1aed5ebe5dc96fe59620a31d9b33e41259bb820cae769f() }\n value := allocate_memory(0x40)\n\n {\n // parents\n\n let offset := 0\n\n mstore(add(value, 0x00), abi_decode_t_uint8(add(headStart, offset), end))\n\n }\n\n {\n // interior\n\n let offset := calldataload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert_error_5e8f644817bc4960744f35c15999b6eff64ae702f94b1c46297cfd4e1aec2421() }\n\n mstore(add(value, 0x20), abi_decode_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(add(headStart, offset), end))\n\n }\n\n }\n\n function abi_decode_tuple_t_uint8t_uint16t_struct$_Multilocation_$8_memory_ptrt_uint64t_bytes_memory_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4 {\n if slt(sub(dataEnd, headStart), 160) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint8(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 32\n\n value1 := abi_decode_t_uint16(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := calldataload(add(headStart, 64))\n if gt(offset, 0xffffffffffffffff) { revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() }\n\n value2 := abi_decode_t_struct$_Multilocation_$8_memory_ptr(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 96\n\n value3 := abi_decode_t_uint64(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := calldataload(add(headStart, 128))\n if gt(offset, 0xffffffffffffffff) { revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() }\n\n value4 := abi_decode_t_bytes_memory_ptr(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_decode_tuple_t_struct$_Multilocation_$8_memory_ptr(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := calldataload(add(headStart, 0))\n if gt(offset, 0xffffffffffffffff) { revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() }\n\n value0 := abi_decode_t_struct$_Multilocation_$8_memory_ptr(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint64_to_t_uint64_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint64(value))\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint64_t_uint256_t_uint64__to_t_uint64_t_uint256_t_uint64__fromStack_reversed(headStart , value2, value1, value0) -> tail {\n tail := add(headStart, 96)\n\n abi_encode_t_uint64_to_t_uint64_fromStack(value0, add(headStart, 0))\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value1, add(headStart, 32))\n\n abi_encode_t_uint64_to_t_uint64_fromStack(value2, add(headStart, 64))\n\n }\n\n function abi_encode_t_uint8_to_t_uint8_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint8(value))\n }\n\n function abi_encode_t_uint16_to_t_uint16_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint16(value))\n }\n\n function array_length_t_bytes_memory_ptr(value) -> length {\n\n length := mload(value)\n\n }\n\n function array_storeLengthForEncoding_t_bytes_memory_ptr_fromStack(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function copy_memory_to_memory(src, dst, length) {\n let i := 0\n for { } lt(i, length) { i := add(i, 32) }\n {\n mstore(add(dst, i), mload(add(src, i)))\n }\n if gt(i, length)\n {\n // clear end\n mstore(add(dst, length), 0)\n }\n }\n\n function abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr_fromStack(value, pos) -> end {\n let length := array_length_t_bytes_memory_ptr(value)\n pos := array_storeLengthForEncoding_t_bytes_memory_ptr_fromStack(pos, length)\n copy_memory_to_memory(add(value, 0x20), pos, length)\n end := add(pos, round_up_to_mul_of_32(length))\n }\n\n function abi_encode_tuple_t_uint8_t_uint16_t_address_t_uint64_t_bytes_memory_ptr__to_t_uint8_t_uint16_t_address_t_uint64_t_bytes_memory_ptr__fromStack_reversed(headStart , value4, value3, value2, value1, value0) -> tail {\n tail := add(headStart, 160)\n\n abi_encode_t_uint8_to_t_uint8_fromStack(value0, add(headStart, 0))\n\n abi_encode_t_uint16_to_t_uint16_fromStack(value1, add(headStart, 32))\n\n abi_encode_t_address_to_t_address_fromStack(value2, add(headStart, 64))\n\n abi_encode_t_uint64_to_t_uint64_fromStack(value3, add(headStart, 96))\n\n mstore(add(headStart, 128), sub(tail, headStart))\n tail := abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr_fromStack(value4, tail)\n\n }\n\n function abi_encode_tuple_t_uint16__to_t_uint16__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint16_to_t_uint16_fromStack(value0, add(headStart, 0))\n\n }\n\n function abi_decode_t_address_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_address(value)\n }\n\n function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_address_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint8_to_t_uint8(value, pos) {\n mstore(pos, cleanup_t_uint8(value))\n }\n\n function array_length_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(value) -> length {\n\n length := mload(value)\n\n }\n\n function array_storeLengthForEncoding_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function array_dataslot_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(ptr) -> data {\n data := ptr\n\n data := add(ptr, 0x20)\n\n }\n\n function array_storeLengthForEncoding_t_bytes_memory_ptr(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr(value, pos) -> end {\n let length := array_length_t_bytes_memory_ptr(value)\n pos := array_storeLengthForEncoding_t_bytes_memory_ptr(pos, length)\n copy_memory_to_memory(add(value, 0x20), pos, length)\n end := add(pos, round_up_to_mul_of_32(length))\n }\n\n function abi_encodeUpdatedPos_t_bytes_memory_ptr_to_t_bytes_memory_ptr(value0, pos) -> updatedPos {\n updatedPos := abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr(value0, pos)\n }\n\n function array_nextElement_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(ptr) -> next {\n next := add(ptr, 0x20)\n }\n\n // bytes[] -> bytes[]\n function abi_encode_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_to_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(value, pos) -> end {\n let length := array_length_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(value)\n pos := array_storeLengthForEncoding_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(pos, length)\n let headStart := pos\n let tail := add(pos, mul(length, 0x20))\n let baseRef := array_dataslot_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(value)\n let srcPtr := baseRef\n for { let i := 0 } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, sub(tail, headStart))\n let elementValue0 := mload(srcPtr)\n tail := abi_encodeUpdatedPos_t_bytes_memory_ptr_to_t_bytes_memory_ptr(elementValue0, tail)\n srcPtr := array_nextElement_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(srcPtr)\n pos := add(pos, 0x20)\n }\n pos := tail\n end := pos\n }\n\n // struct XcmTransactor.Multilocation -> struct XcmTransactor.Multilocation\n function abi_encode_t_struct$_Multilocation_$8_memory_ptr_to_t_struct$_Multilocation_$8_memory_ptr_fromStack(value, pos) -> end {\n let tail := add(pos, 0x40)\n\n {\n // parents\n\n let memberValue0 := mload(add(value, 0x00))\n abi_encode_t_uint8_to_t_uint8(memberValue0, add(pos, 0x00))\n }\n\n {\n // interior\n\n let memberValue0 := mload(add(value, 0x20))\n\n mstore(add(pos, 0x20), sub(tail, pos))\n tail := abi_encode_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_to_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr(memberValue0, tail)\n\n }\n\n end := tail\n }\n\n function abi_encode_tuple_t_uint8_t_uint16_t_struct$_Multilocation_$8_memory_ptr_t_uint64_t_bytes_memory_ptr__to_t_uint8_t_uint16_t_struct$_Multilocation_$8_memory_ptr_t_uint64_t_bytes_memory_ptr__fromStack_reversed(headStart , value4, value3, value2, value1, value0) -> tail {\n tail := add(headStart, 160)\n\n abi_encode_t_uint8_to_t_uint8_fromStack(value0, add(headStart, 0))\n\n abi_encode_t_uint16_to_t_uint16_fromStack(value1, add(headStart, 32))\n\n mstore(add(headStart, 64), sub(tail, headStart))\n tail := abi_encode_t_struct$_Multilocation_$8_memory_ptr_to_t_struct$_Multilocation_$8_memory_ptr_fromStack(value2, tail)\n\n abi_encode_t_uint64_to_t_uint64_fromStack(value3, add(headStart, 96))\n\n mstore(add(headStart, 128), sub(tail, headStart))\n tail := abi_encode_t_bytes_memory_ptr_to_t_bytes_memory_ptr_fromStack(value4, tail)\n\n }\n\n function abi_encode_tuple_t_struct$_Multilocation_$8_memory_ptr__to_t_struct$_Multilocation_$8_memory_ptr__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_struct$_Multilocation_$8_memory_ptr_to_t_struct$_Multilocation_$8_memory_ptr_fromStack(value0, tail)\n\n }\n\n function abi_decode_t_uint64_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint64(value)\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint64t_uint256t_uint64_fromMemory(headStart, dataEnd) -> value0, value1, value2 {\n if slt(sub(dataEnd, headStart), 96) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint64_fromMemory(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 32\n\n value1 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 64\n\n value2 := abi_decode_t_uint64_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n}\n", "id": 1, "language": "Yul", "name": "#utility.yul" @@ -10841,15 +10970,15 @@ ], "immutableReferences": {}, "linkReferences": {}, - "object": "608060405234801561001057600080fd5b50600436106100575760003560e01c8063267d40621461005c57806361fc548f1461007857806371b0edfa146100965780639f89f03e146100c6578063f87f493f146100e2575b600080fd5b6100766004803603810190610071919061063d565b610113565b005b6100806101ad565b60405161008d9190610733565b60405180910390f35b6100b060048036038101906100ab919061074e565b6101d1565b6040516100bd919061078a565b60405180910390f35b6100e060048036038101906100db9190610901565b610284565b005b6100fc60048036038101906100f791906109b4565b61031e565b60405161010a929190610a25565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663267d406286868686866040518663ffffffff1660e01b8152600401610174959493929190610af4565b600060405180830381600087803b15801561018e57600080fd5b505af11580156101a2573d6000803e3d6000fd5b505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166371b0edfa836040518263ffffffff1660e01b815260040161022d9190610b4e565b60206040518083038186803b15801561024557600080fd5b505afa158015610259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027d9190610b7e565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639f89f03e86868686866040518663ffffffff1660e01b81526004016102e5959493929190610d03565b600060405180830381600087803b1580156102ff57600080fd5b505af1158015610313573d6000803e3d6000fd5b505050505050505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f87f493f846040518263ffffffff1660e01b815260040161037a9190610d64565b604080518083038186803b15801561039157600080fd5b505afa1580156103a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c99190610dc7565b91509150915091565b6000604051905090565b600080fd5b600080fd5b600060ff82169050919050565b6103fc816103e6565b811461040757600080fd5b50565b600081359050610419816103f3565b92915050565b600061ffff82169050919050565b6104368161041f565b811461044157600080fd5b50565b6000813590506104538161042d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061048482610459565b9050919050565b61049481610479565b811461049f57600080fd5b50565b6000813590506104b18161048b565b92915050565b600067ffffffffffffffff82169050919050565b6104d4816104b7565b81146104df57600080fd5b50565b6000813590506104f1816104cb565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61054a82610501565b810181811067ffffffffffffffff8211171561056957610568610512565b5b80604052505050565b600061057c6103d2565b90506105888282610541565b919050565b600067ffffffffffffffff8211156105a8576105a7610512565b5b6105b182610501565b9050602081019050919050565b82818337600083830152505050565b60006105e06105db8461058d565b610572565b9050828152602081018484840111156105fc576105fb6104fc565b5b6106078482856105be565b509392505050565b600082601f830112610624576106236104f7565b5b81356106348482602086016105cd565b91505092915050565b600080600080600060a08688031215610659576106586103dc565b5b60006106678882890161040a565b955050602061067888828901610444565b9450506040610689888289016104a2565b935050606061069a888289016104e2565b925050608086013567ffffffffffffffff8111156106bb576106ba6103e1565b5b6106c78882890161060f565b9150509295509295909350565b6000819050919050565b60006106f96106f46106ef84610459565b6106d4565b610459565b9050919050565b600061070b826106de565b9050919050565b600061071d82610700565b9050919050565b61072d81610712565b82525050565b60006020820190506107486000830184610724565b92915050565b600060208284031215610764576107636103dc565b5b600061077284828501610444565b91505092915050565b61078481610479565b82525050565b600060208201905061079f600083018461077b565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff8211156107ca576107c9610512565b5b602082029050602081019050919050565b600080fd5b60006107f36107ee846107af565b610572565b90508083825260208201905060208402830185811115610816576108156107db565b5b835b8181101561085d57803567ffffffffffffffff81111561083b5761083a6104f7565b5b808601610848898261060f565b85526020850194505050602081019050610818565b5050509392505050565b600082601f83011261087c5761087b6104f7565b5b813561088c8482602086016107e0565b91505092915050565b6000604082840312156108ab576108aa6107a5565b5b6108b56040610572565b905060006108c58482850161040a565b600083015250602082013567ffffffffffffffff8111156108e9576108e86107aa565b5b6108f584828501610867565b60208301525092915050565b600080600080600060a0868803121561091d5761091c6103dc565b5b600061092b8882890161040a565b955050602061093c88828901610444565b945050604086013567ffffffffffffffff81111561095d5761095c6103e1565b5b61096988828901610895565b935050606061097a888289016104e2565b925050608086013567ffffffffffffffff81111561099b5761099a6103e1565b5b6109a78882890161060f565b9150509295509295909350565b6000602082840312156109ca576109c96103dc565b5b600082013567ffffffffffffffff8111156109e8576109e76103e1565b5b6109f484828501610895565b91505092915050565b6000819050919050565b610a10816109fd565b82525050565b610a1f816104b7565b82525050565b6000604082019050610a3a6000830185610a07565b610a476020830184610a16565b9392505050565b610a57816103e6565b82525050565b610a668161041f565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610aa6578082015181840152602081019050610a8b565b83811115610ab5576000848401525b50505050565b6000610ac682610a6c565b610ad08185610a77565b9350610ae0818560208601610a88565b610ae981610501565b840191505092915050565b600060a082019050610b096000830188610a4e565b610b166020830187610a5d565b610b23604083018661077b565b610b306060830185610a16565b8181036080830152610b428184610abb565b90509695505050505050565b6000602082019050610b636000830184610a5d565b92915050565b600081519050610b788161048b565b92915050565b600060208284031215610b9457610b936103dc565b5b6000610ba284828501610b69565b91505092915050565b610bb4816103e6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000610c0282610a6c565b610c0c8185610be6565b9350610c1c818560208601610a88565b610c2581610501565b840191505092915050565b6000610c3c8383610bf7565b905092915050565b6000602082019050919050565b6000610c5c82610bba565b610c668185610bc5565b935083602082028501610c7885610bd6565b8060005b85811015610cb45784840389528151610c958582610c30565b9450610ca083610c44565b925060208a01995050600181019050610c7c565b50829750879550505050505092915050565b6000604083016000830151610cde6000860182610bab565b5060208301518482036020860152610cf68282610c51565b9150508091505092915050565b600060a082019050610d186000830188610a4e565b610d256020830187610a5d565b8181036040830152610d378186610cc6565b9050610d466060830185610a16565b8181036080830152610d588184610abb565b90509695505050505050565b60006020820190508181036000830152610d7e8184610cc6565b905092915050565b610d8f816109fd565b8114610d9a57600080fd5b50565b600081519050610dac81610d86565b92915050565b600081519050610dc1816104cb565b92915050565b60008060408385031215610dde57610ddd6103dc565b5b6000610dec85828601610d9d565b9250506020610dfd85828601610db2565b915050925092905056fea2646970667358221220f4c38984c6cc29dbcc2eaba10fd373f554e43032ce961ef414eb2edc3748591664736f6c63430008090033", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x57 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x267D4062 EQ PUSH2 0x5C JUMPI DUP1 PUSH4 0x61FC548F EQ PUSH2 0x78 JUMPI DUP1 PUSH4 0x71B0EDFA EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0x9F89F03E EQ PUSH2 0xC6 JUMPI DUP1 PUSH4 0xF87F493F EQ PUSH2 0xE2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x76 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x71 SWAP2 SWAP1 PUSH2 0x63D JUMP JUMPDEST PUSH2 0x113 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x80 PUSH2 0x1AD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8D SWAP2 SWAP1 PUSH2 0x733 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xB0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xAB SWAP2 SWAP1 PUSH2 0x74E JUMP JUMPDEST PUSH2 0x1D1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBD SWAP2 SWAP1 PUSH2 0x78A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xDB SWAP2 SWAP1 PUSH2 0x901 JUMP JUMPDEST PUSH2 0x284 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFC PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xF7 SWAP2 SWAP1 PUSH2 0x9B4 JUMP JUMPDEST PUSH2 0x31E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10A SWAP3 SWAP2 SWAP1 PUSH2 0xA25 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x267D4062 DUP7 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x174 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xAF4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x71B0EDFA DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22D SWAP2 SWAP1 PUSH2 0xB4E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x245 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x259 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x27D SWAP2 SWAP1 PUSH2 0xB7E JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x9F89F03E DUP7 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2E5 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xD03 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x313 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF87F493F DUP5 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x37A SWAP2 SWAP1 PUSH2 0xD64 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x391 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3A5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3C9 SWAP2 SWAP1 PUSH2 0xDC7 JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x3FC DUP2 PUSH2 0x3E6 JUMP JUMPDEST DUP2 EQ PUSH2 0x407 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x419 DUP2 PUSH2 0x3F3 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x436 DUP2 PUSH2 0x41F JUMP JUMPDEST DUP2 EQ PUSH2 0x441 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x453 DUP2 PUSH2 0x42D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x484 DUP3 PUSH2 0x459 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x494 DUP2 PUSH2 0x479 JUMP JUMPDEST DUP2 EQ PUSH2 0x49F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x4B1 DUP2 PUSH2 0x48B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x4D4 DUP2 PUSH2 0x4B7 JUMP JUMPDEST DUP2 EQ PUSH2 0x4DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x4F1 DUP2 PUSH2 0x4CB JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x54A DUP3 PUSH2 0x501 JUMP JUMPDEST DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x569 JUMPI PUSH2 0x568 PUSH2 0x512 JUMP JUMPDEST JUMPDEST DUP1 PUSH1 0x40 MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x57C PUSH2 0x3D2 JUMP JUMPDEST SWAP1 POP PUSH2 0x588 DUP3 DUP3 PUSH2 0x541 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5A8 JUMPI PUSH2 0x5A7 PUSH2 0x512 JUMP JUMPDEST JUMPDEST PUSH2 0x5B1 DUP3 PUSH2 0x501 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY PUSH1 0x0 DUP4 DUP4 ADD MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5E0 PUSH2 0x5DB DUP5 PUSH2 0x58D JUMP JUMPDEST PUSH2 0x572 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP5 DUP5 DUP5 ADD GT ISZERO PUSH2 0x5FC JUMPI PUSH2 0x5FB PUSH2 0x4FC JUMP JUMPDEST JUMPDEST PUSH2 0x607 DUP5 DUP3 DUP6 PUSH2 0x5BE JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x624 JUMPI PUSH2 0x623 PUSH2 0x4F7 JUMP JUMPDEST JUMPDEST DUP2 CALLDATALOAD PUSH2 0x634 DUP5 DUP3 PUSH1 0x20 DUP7 ADD PUSH2 0x5CD JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x659 JUMPI PUSH2 0x658 PUSH2 0x3DC JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x667 DUP9 DUP3 DUP10 ADD PUSH2 0x40A JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x678 DUP9 DUP3 DUP10 ADD PUSH2 0x444 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x689 DUP9 DUP3 DUP10 ADD PUSH2 0x4A2 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x69A DUP9 DUP3 DUP10 ADD PUSH2 0x4E2 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6BB JUMPI PUSH2 0x6BA PUSH2 0x3E1 JUMP JUMPDEST JUMPDEST PUSH2 0x6C7 DUP9 DUP3 DUP10 ADD PUSH2 0x60F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6F9 PUSH2 0x6F4 PUSH2 0x6EF DUP5 PUSH2 0x459 JUMP JUMPDEST PUSH2 0x6D4 JUMP JUMPDEST PUSH2 0x459 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x70B DUP3 PUSH2 0x6DE JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x71D DUP3 PUSH2 0x700 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x72D DUP2 PUSH2 0x712 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x748 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x724 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x764 JUMPI PUSH2 0x763 PUSH2 0x3DC JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x772 DUP5 DUP3 DUP6 ADD PUSH2 0x444 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x784 DUP2 PUSH2 0x479 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x79F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x77B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x7CA JUMPI PUSH2 0x7C9 PUSH2 0x512 JUMP JUMPDEST JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7F3 PUSH2 0x7EE DUP5 PUSH2 0x7AF JUMP JUMPDEST PUSH2 0x572 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH1 0x20 DUP5 MUL DUP4 ADD DUP6 DUP2 GT ISZERO PUSH2 0x816 JUMPI PUSH2 0x815 PUSH2 0x7DB JUMP JUMPDEST JUMPDEST DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x85D JUMPI DUP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x83B JUMPI PUSH2 0x83A PUSH2 0x4F7 JUMP JUMPDEST JUMPDEST DUP1 DUP7 ADD PUSH2 0x848 DUP10 DUP3 PUSH2 0x60F JUMP JUMPDEST DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP5 POP POP POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x818 JUMP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x87C JUMPI PUSH2 0x87B PUSH2 0x4F7 JUMP JUMPDEST JUMPDEST DUP2 CALLDATALOAD PUSH2 0x88C DUP5 DUP3 PUSH1 0x20 DUP7 ADD PUSH2 0x7E0 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8AB JUMPI PUSH2 0x8AA PUSH2 0x7A5 JUMP JUMPDEST JUMPDEST PUSH2 0x8B5 PUSH1 0x40 PUSH2 0x572 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x8C5 DUP5 DUP3 DUP6 ADD PUSH2 0x40A JUMP JUMPDEST PUSH1 0x0 DUP4 ADD MSTORE POP PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8E9 JUMPI PUSH2 0x8E8 PUSH2 0x7AA JUMP JUMPDEST JUMPDEST PUSH2 0x8F5 DUP5 DUP3 DUP6 ADD PUSH2 0x867 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x91D JUMPI PUSH2 0x91C PUSH2 0x3DC JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x92B DUP9 DUP3 DUP10 ADD PUSH2 0x40A JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x93C DUP9 DUP3 DUP10 ADD PUSH2 0x444 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x95D JUMPI PUSH2 0x95C PUSH2 0x3E1 JUMP JUMPDEST JUMPDEST PUSH2 0x969 DUP9 DUP3 DUP10 ADD PUSH2 0x895 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x97A DUP9 DUP3 DUP10 ADD PUSH2 0x4E2 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x99B JUMPI PUSH2 0x99A PUSH2 0x3E1 JUMP JUMPDEST JUMPDEST PUSH2 0x9A7 DUP9 DUP3 DUP10 ADD PUSH2 0x60F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x9CA JUMPI PUSH2 0x9C9 PUSH2 0x3DC JUMP JUMPDEST JUMPDEST PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x9E8 JUMPI PUSH2 0x9E7 PUSH2 0x3E1 JUMP JUMPDEST JUMPDEST PUSH2 0x9F4 DUP5 DUP3 DUP6 ADD PUSH2 0x895 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xA10 DUP2 PUSH2 0x9FD JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0xA1F DUP2 PUSH2 0x4B7 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0xA3A PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0xA07 JUMP JUMPDEST PUSH2 0xA47 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xA16 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xA57 DUP2 PUSH2 0x3E6 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0xA66 DUP2 PUSH2 0x41F JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xAA6 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xA8B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xAB5 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAC6 DUP3 PUSH2 0xA6C JUMP JUMPDEST PUSH2 0xAD0 DUP2 DUP6 PUSH2 0xA77 JUMP JUMPDEST SWAP4 POP PUSH2 0xAE0 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0xA88 JUMP JUMPDEST PUSH2 0xAE9 DUP2 PUSH2 0x501 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD SWAP1 POP PUSH2 0xB09 PUSH1 0x0 DUP4 ADD DUP9 PUSH2 0xA4E JUMP JUMPDEST PUSH2 0xB16 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0xA5D JUMP JUMPDEST PUSH2 0xB23 PUSH1 0x40 DUP4 ADD DUP7 PUSH2 0x77B JUMP JUMPDEST PUSH2 0xB30 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0xA16 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0xB42 DUP2 DUP5 PUSH2 0xABB JUMP JUMPDEST SWAP1 POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0xB63 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xA5D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xB78 DUP2 PUSH2 0x48B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB94 JUMPI PUSH2 0xB93 PUSH2 0x3DC JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xBA2 DUP5 DUP3 DUP6 ADD PUSH2 0xB69 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xBB4 DUP2 PUSH2 0x3E6 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC02 DUP3 PUSH2 0xA6C JUMP JUMPDEST PUSH2 0xC0C DUP2 DUP6 PUSH2 0xBE6 JUMP JUMPDEST SWAP4 POP PUSH2 0xC1C DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0xA88 JUMP JUMPDEST PUSH2 0xC25 DUP2 PUSH2 0x501 JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC3C DUP4 DUP4 PUSH2 0xBF7 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC5C DUP3 PUSH2 0xBBA JUMP JUMPDEST PUSH2 0xC66 DUP2 DUP6 PUSH2 0xBC5 JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0xC78 DUP6 PUSH2 0xBD6 JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0xCB4 JUMPI DUP5 DUP5 SUB DUP10 MSTORE DUP2 MLOAD PUSH2 0xC95 DUP6 DUP3 PUSH2 0xC30 JUMP JUMPDEST SWAP5 POP PUSH2 0xCA0 DUP4 PUSH2 0xC44 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP11 ADD SWAP10 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0xC7C JUMP JUMPDEST POP DUP3 SWAP8 POP DUP8 SWAP6 POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0xCDE PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0xBAB JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0xCF6 DUP3 DUP3 PUSH2 0xC51 JUMP JUMPDEST SWAP2 POP POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD SWAP1 POP PUSH2 0xD18 PUSH1 0x0 DUP4 ADD DUP9 PUSH2 0xA4E JUMP JUMPDEST PUSH2 0xD25 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0xA5D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xD37 DUP2 DUP7 PUSH2 0xCC6 JUMP JUMPDEST SWAP1 POP PUSH2 0xD46 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0xA16 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0xD58 DUP2 DUP5 PUSH2 0xABB JUMP JUMPDEST SWAP1 POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0xD7E DUP2 DUP5 PUSH2 0xCC6 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xD8F DUP2 PUSH2 0x9FD JUMP JUMPDEST DUP2 EQ PUSH2 0xD9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xDAC DUP2 PUSH2 0xD86 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xDC1 DUP2 PUSH2 0x4CB JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xDDE JUMPI PUSH2 0xDDD PUSH2 0x3DC JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xDEC DUP6 DUP3 DUP7 ADD PUSH2 0xD9D JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xDFD DUP6 DUP3 DUP7 ADD PUSH2 0xDB2 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DELEGATECALL 0xC3 DUP10 DUP5 0xC6 0xCC 0x29 0xDB 0xCC 0x2E 0xAB LOG1 0xF 0xD3 PUSH20 0xF554E43032CE961EF414EB2EDC3748591664736F PUSH13 0x63430008090033000000000000 ", - "sourceMap": "2633:1652:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3849:430;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2757:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2862:225;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3364:467;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3097:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;3849:430;4081:13;;;;;;;;;;:41;;;4140:10;4168:5;4191:11;4220:6;4244:10;4081:187;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3849:430;;;;;:::o;2757:94::-;;;;;;;;;;;;:::o;2862:225::-;2933:7;3039:13;;;;;;;;;;;:30;;;3070:5;3039:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3032:44;;2862:225;;;:::o;3364:467::-;3621:13;;;;;;;;;;:55;;;3694:10;3722:5;3745:9;3772:6;3796:10;3621:199;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:467;;;;;:::o;3097:257::-;3187:7;3196:6;3301:13;;;;;;;;;;:27;;;3329:13;3301:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3294:49;;;;3097:257;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:86;369:7;409:4;402:5;398:16;387:27;;334:86;;;:::o;426:118::-;497:22;513:5;497:22;:::i;:::-;490:5;487:33;477:61;;534:1;531;524:12;477:61;426:118;:::o;550:135::-;594:5;632:6;619:20;610:29;;648:31;673:5;648:31;:::i;:::-;550:135;;;;:::o;691:89::-;727:7;767:6;760:5;756:18;745:29;;691:89;;;:::o;786:120::-;858:23;875:5;858:23;:::i;:::-;851:5;848:34;838:62;;896:1;893;886:12;838:62;786:120;:::o;912:137::-;957:5;995:6;982:20;973:29;;1011:32;1037:5;1011:32;:::i;:::-;912:137;;;;:::o;1055:126::-;1092:7;1132:42;1125:5;1121:54;1110:65;;1055:126;;;:::o;1187:96::-;1224:7;1253:24;1271:5;1253:24;:::i;:::-;1242:35;;1187:96;;;:::o;1289:122::-;1362:24;1380:5;1362:24;:::i;:::-;1355:5;1352:35;1342:63;;1401:1;1398;1391:12;1342:63;1289:122;:::o;1417:139::-;1463:5;1501:6;1488:20;1479:29;;1517:33;1544:5;1517:33;:::i;:::-;1417:139;;;;:::o;1562:101::-;1598:7;1638:18;1631:5;1627:30;1616:41;;1562:101;;;:::o;1669:120::-;1741:23;1758:5;1741:23;:::i;:::-;1734:5;1731:34;1721:62;;1779:1;1776;1769:12;1721:62;1669:120;:::o;1795:137::-;1840:5;1878:6;1865:20;1856:29;;1894:32;1920:5;1894:32;:::i;:::-;1795:137;;;;:::o;1938:117::-;2047:1;2044;2037:12;2061:117;2170:1;2167;2160:12;2184:102;2225:6;2276:2;2272:7;2267:2;2260:5;2256:14;2252:28;2242:38;;2184:102;;;:::o;2292:180::-;2340:77;2337:1;2330:88;2437:4;2434:1;2427:15;2461:4;2458:1;2451:15;2478:281;2561:27;2583:4;2561:27;:::i;:::-;2553:6;2549:40;2691:6;2679:10;2676:22;2655:18;2643:10;2640:34;2637:62;2634:88;;;2702:18;;:::i;:::-;2634:88;2742:10;2738:2;2731:22;2521:238;2478:281;;:::o;2765:129::-;2799:6;2826:20;;:::i;:::-;2816:30;;2855:33;2883:4;2875:6;2855:33;:::i;:::-;2765:129;;;:::o;2900:307::-;2961:4;3051:18;3043:6;3040:30;3037:56;;;3073:18;;:::i;:::-;3037:56;3111:29;3133:6;3111:29;:::i;:::-;3103:37;;3195:4;3189;3185:15;3177:23;;2900:307;;;:::o;3213:154::-;3297:6;3292:3;3287;3274:30;3359:1;3350:6;3345:3;3341:16;3334:27;3213:154;;;:::o;3373:410::-;3450:5;3475:65;3491:48;3532:6;3491:48;:::i;:::-;3475:65;:::i;:::-;3466:74;;3563:6;3556:5;3549:21;3601:4;3594:5;3590:16;3639:3;3630:6;3625:3;3621:16;3618:25;3615:112;;;3646:79;;:::i;:::-;3615:112;3736:41;3770:6;3765:3;3760;3736:41;:::i;:::-;3456:327;3373:410;;;;;:::o;3802:338::-;3857:5;3906:3;3899:4;3891:6;3887:17;3883:27;3873:122;;3914:79;;:::i;:::-;3873:122;4031:6;4018:20;4056:78;4130:3;4122:6;4115:4;4107:6;4103:17;4056:78;:::i;:::-;4047:87;;3863:277;3802:338;;;;:::o;4146:1081::-;4246:6;4254;4262;4270;4278;4327:3;4315:9;4306:7;4302:23;4298:33;4295:120;;;4334:79;;:::i;:::-;4295:120;4454:1;4479:51;4522:7;4513:6;4502:9;4498:22;4479:51;:::i;:::-;4469:61;;4425:115;4579:2;4605:52;4649:7;4640:6;4629:9;4625:22;4605:52;:::i;:::-;4595:62;;4550:117;4706:2;4732:53;4777:7;4768:6;4757:9;4753:22;4732:53;:::i;:::-;4722:63;;4677:118;4834:2;4860:52;4904:7;4895:6;4884:9;4880:22;4860:52;:::i;:::-;4850:62;;4805:117;4989:3;4978:9;4974:19;4961:33;5021:18;5013:6;5010:30;5007:117;;;5043:79;;:::i;:::-;5007:117;5148:62;5202:7;5193:6;5182:9;5178:22;5148:62;:::i;:::-;5138:72;;4932:288;4146:1081;;;;;;;;:::o;5233:60::-;5261:3;5282:5;5275:12;;5233:60;;;:::o;5299:142::-;5349:9;5382:53;5400:34;5409:24;5427:5;5409:24;:::i;:::-;5400:34;:::i;:::-;5382:53;:::i;:::-;5369:66;;5299:142;;;:::o;5447:126::-;5497:9;5530:37;5561:5;5530:37;:::i;:::-;5517:50;;5447:126;;;:::o;5579:146::-;5649:9;5682:37;5713:5;5682:37;:::i;:::-;5669:50;;5579:146;;;:::o;5731:171::-;5838:57;5889:5;5838:57;:::i;:::-;5833:3;5826:70;5731:171;;:::o;5908:262::-;6021:4;6059:2;6048:9;6044:18;6036:26;;6072:91;6160:1;6149:9;6145:17;6136:6;6072:91;:::i;:::-;5908:262;;;;:::o;6176:327::-;6234:6;6283:2;6271:9;6262:7;6258:23;6254:32;6251:119;;;6289:79;;:::i;:::-;6251:119;6409:1;6434:52;6478:7;6469:6;6458:9;6454:22;6434:52;:::i;:::-;6424:62;;6380:116;6176:327;;;;:::o;6509:118::-;6596:24;6614:5;6596:24;:::i;:::-;6591:3;6584:37;6509:118;;:::o;6633:222::-;6726:4;6764:2;6753:9;6749:18;6741:26;;6777:71;6845:1;6834:9;6830:17;6821:6;6777:71;:::i;:::-;6633:222;;;;:::o;6861:117::-;6970:1;6967;6960:12;6984:117;7093:1;7090;7083:12;7107:320;7193:4;7283:18;7275:6;7272:30;7269:56;;;7305:18;;:::i;:::-;7269:56;7355:4;7347:6;7343:17;7335:25;;7415:4;7409;7405:15;7397:23;;7107:320;;;:::o;7433:117::-;7542:1;7539;7532:12;7571:942;7676:5;7701:90;7717:73;7783:6;7717:73;:::i;:::-;7701:90;:::i;:::-;7692:99;;7811:5;7840:6;7833:5;7826:21;7874:4;7867:5;7863:16;7856:23;;7927:4;7919:6;7915:17;7907:6;7903:30;7956:3;7948:6;7945:15;7942:122;;;7975:79;;:::i;:::-;7942:122;8090:6;8073:434;8107:6;8102:3;8099:15;8073:434;;;8196:3;8183:17;8232:18;8219:11;8216:35;8213:122;;;8254:79;;:::i;:::-;8213:122;8378:11;8370:6;8366:24;8416:46;8458:3;8446:10;8416:46;:::i;:::-;8411:3;8404:59;8492:4;8487:3;8483:14;8476:21;;8149:358;;8133:4;8128:3;8124:14;8117:21;;8073:434;;;8077:21;7682:831;;7571:942;;;;;:::o;8534:388::-;8614:5;8663:3;8656:4;8648:6;8644:17;8640:27;8630:122;;8671:79;;:::i;:::-;8630:122;8788:6;8775:20;8813:103;8912:3;8904:6;8897:4;8889:6;8885:17;8813:103;:::i;:::-;8804:112;;8620:302;8534:388;;;;:::o;8970:776::-;9047:5;9091:4;9079:9;9074:3;9070:19;9066:30;9063:117;;;9099:79;;:::i;:::-;9063:117;9198:21;9214:4;9198:21;:::i;:::-;9189:30;;9281:1;9321:47;9364:3;9355:6;9344:9;9340:22;9321:47;:::i;:::-;9314:4;9307:5;9303:16;9296:73;9229:151;9471:2;9460:9;9456:18;9443:32;9502:18;9494:6;9491:30;9488:117;;;9524:79;;:::i;:::-;9488:117;9644:83;9723:3;9714:6;9703:9;9699:22;9644:83;:::i;:::-;9637:4;9630:5;9626:16;9619:109;9390:349;8970:776;;;;:::o;9752:1297::-;9880:6;9888;9896;9904;9912;9961:3;9949:9;9940:7;9936:23;9932:33;9929:120;;;9968:79;;:::i;:::-;9929:120;10088:1;10113:51;10156:7;10147:6;10136:9;10132:22;10113:51;:::i;:::-;10103:61;;10059:115;10213:2;10239:52;10283:7;10274:6;10263:9;10259:22;10239:52;:::i;:::-;10229:62;;10184:117;10368:2;10357:9;10353:18;10340:32;10399:18;10391:6;10388:30;10385:117;;;10421:79;;:::i;:::-;10385:117;10526:81;10599:7;10590:6;10579:9;10575:22;10526:81;:::i;:::-;10516:91;;10311:306;10656:2;10682:52;10726:7;10717:6;10706:9;10702:22;10682:52;:::i;:::-;10672:62;;10627:117;10811:3;10800:9;10796:19;10783:33;10843:18;10835:6;10832:30;10829:117;;;10865:79;;:::i;:::-;10829:117;10970:62;11024:7;11015:6;11004:9;11000:22;10970:62;:::i;:::-;10960:72;;10754:288;9752:1297;;;;;;;;:::o;11055:545::-;11142:6;11191:2;11179:9;11170:7;11166:23;11162:32;11159:119;;;11197:79;;:::i;:::-;11159:119;11345:1;11334:9;11330:17;11317:31;11375:18;11367:6;11364:30;11361:117;;;11397:79;;:::i;:::-;11361:117;11502:81;11575:7;11566:6;11555:9;11551:22;11502:81;:::i;:::-;11492:91;;11288:305;11055:545;;;;:::o;11606:77::-;11643:7;11672:5;11661:16;;11606:77;;;:::o;11689:118::-;11776:24;11794:5;11776:24;:::i;:::-;11771:3;11764:37;11689:118;;:::o;11813:115::-;11898:23;11915:5;11898:23;:::i;:::-;11893:3;11886:36;11813:115;;:::o;11934:328::-;12053:4;12091:2;12080:9;12076:18;12068:26;;12104:71;12172:1;12161:9;12157:17;12148:6;12104:71;:::i;:::-;12185:70;12251:2;12240:9;12236:18;12227:6;12185:70;:::i;:::-;11934:328;;;;;:::o;12268:112::-;12351:22;12367:5;12351:22;:::i;:::-;12346:3;12339:35;12268:112;;:::o;12386:115::-;12471:23;12488:5;12471:23;:::i;:::-;12466:3;12459:36;12386:115;;:::o;12507:98::-;12558:6;12592:5;12586:12;12576:22;;12507:98;;;:::o;12611:168::-;12694:11;12728:6;12723:3;12716:19;12768:4;12763:3;12759:14;12744:29;;12611:168;;;;:::o;12785:307::-;12853:1;12863:113;12877:6;12874:1;12871:13;12863:113;;;12962:1;12957:3;12953:11;12947:18;12943:1;12938:3;12934:11;12927:39;12899:2;12896:1;12892:10;12887:15;;12863:113;;;12994:6;12991:1;12988:13;12985:101;;;13074:1;13065:6;13060:3;13056:16;13049:27;12985:101;12834:258;12785:307;;;:::o;13098:360::-;13184:3;13212:38;13244:5;13212:38;:::i;:::-;13266:70;13329:6;13324:3;13266:70;:::i;:::-;13259:77;;13345:52;13390:6;13385:3;13378:4;13371:5;13367:16;13345:52;:::i;:::-;13422:29;13444:6;13422:29;:::i;:::-;13417:3;13413:39;13406:46;;13188:270;13098:360;;;;:::o;13464:735::-;13679:4;13717:3;13706:9;13702:19;13694:27;;13731:67;13795:1;13784:9;13780:17;13771:6;13731:67;:::i;:::-;13808:70;13874:2;13863:9;13859:18;13850:6;13808:70;:::i;:::-;13888:72;13956:2;13945:9;13941:18;13932:6;13888:72;:::i;:::-;13970:70;14036:2;14025:9;14021:18;14012:6;13970:70;:::i;:::-;14088:9;14082:4;14078:20;14072:3;14061:9;14057:19;14050:49;14116:76;14187:4;14178:6;14116:76;:::i;:::-;14108:84;;13464:735;;;;;;;;:::o;14205:218::-;14296:4;14334:2;14323:9;14319:18;14311:26;;14347:69;14413:1;14402:9;14398:17;14389:6;14347:69;:::i;:::-;14205:218;;;;:::o;14429:143::-;14486:5;14517:6;14511:13;14502:22;;14533:33;14560:5;14533:33;:::i;:::-;14429:143;;;;:::o;14578:351::-;14648:6;14697:2;14685:9;14676:7;14672:23;14668:32;14665:119;;;14703:79;;:::i;:::-;14665:119;14823:1;14848:64;14904:7;14895:6;14884:9;14880:22;14848:64;:::i;:::-;14838:74;;14794:128;14578:351;;;;:::o;14935:102::-;15008:22;15024:5;15008:22;:::i;:::-;15003:3;14996:35;14935:102;;:::o;15043:123::-;15119:6;15153:5;15147:12;15137:22;;15043:123;;;:::o;15172:183::-;15270:11;15304:6;15299:3;15292:19;15344:4;15339:3;15335:14;15320:29;;15172:183;;;;:::o;15361:141::-;15437:4;15460:3;15452:11;;15490:4;15485:3;15481:14;15473:22;;15361:141;;;:::o;15508:158::-;15581:11;15615:6;15610:3;15603:19;15655:4;15650:3;15646:14;15631:29;;15508:158;;;;:::o;15672:340::-;15748:3;15776:38;15808:5;15776:38;:::i;:::-;15830:60;15883:6;15878:3;15830:60;:::i;:::-;15823:67;;15899:52;15944:6;15939:3;15932:4;15925:5;15921:16;15899:52;:::i;:::-;15976:29;15998:6;15976:29;:::i;:::-;15971:3;15967:39;15960:46;;15752:260;15672:340;;;;:::o;16018:192::-;16105:10;16140:64;16200:3;16192:6;16140:64;:::i;:::-;16126:78;;16018:192;;;;:::o;16216:122::-;16295:4;16327;16322:3;16318:14;16310:22;;16216:122;;;:::o;16370:963::-;16497:3;16526:63;16583:5;16526:63;:::i;:::-;16605:85;16683:6;16678:3;16605:85;:::i;:::-;16598:92;;16716:3;16761:4;16753:6;16749:17;16744:3;16740:27;16791:65;16850:5;16791:65;:::i;:::-;16879:7;16910:1;16895:393;16920:6;16917:1;16914:13;16895:393;;;16991:9;16985:4;16981:20;16976:3;16969:33;17042:6;17036:13;17070:82;17147:4;17132:13;17070:82;:::i;:::-;17062:90;;17175:69;17237:6;17175:69;:::i;:::-;17165:79;;17273:4;17268:3;17264:14;17257:21;;16955:333;16942:1;16939;16935:9;16930:14;;16895:393;;;16899:14;17304:4;17297:11;;17324:3;17317:10;;16502:831;;;;;16370:963;;;;:::o;17419:663::-;17544:3;17580:4;17575:3;17571:14;17670:4;17663:5;17659:16;17653:23;17689:59;17742:4;17737:3;17733:14;17719:12;17689:59;:::i;:::-;17595:163;17844:4;17837:5;17833:16;17827:23;17897:3;17891:4;17887:14;17880:4;17875:3;17871:14;17864:38;17923:121;18039:4;18025:12;17923:121;:::i;:::-;17915:129;;17768:287;18072:4;18065:11;;17549:533;17419:663;;;;:::o;18088:898::-;18359:4;18397:3;18386:9;18382:19;18374:27;;18411:67;18475:1;18464:9;18460:17;18451:6;18411:67;:::i;:::-;18488:70;18554:2;18543:9;18539:18;18530:6;18488:70;:::i;:::-;18605:9;18599:4;18595:20;18590:2;18579:9;18575:18;18568:48;18633:114;18742:4;18733:6;18633:114;:::i;:::-;18625:122;;18757:70;18823:2;18812:9;18808:18;18799:6;18757:70;:::i;:::-;18875:9;18869:4;18865:20;18859:3;18848:9;18844:19;18837:49;18903:76;18974:4;18965:6;18903:76;:::i;:::-;18895:84;;18088:898;;;;;;;;:::o;18992:385::-;19141:4;19179:2;19168:9;19164:18;19156:26;;19228:9;19222:4;19218:20;19214:1;19203:9;19199:17;19192:47;19256:114;19365:4;19356:6;19256:114;:::i;:::-;19248:122;;18992:385;;;;:::o;19383:122::-;19456:24;19474:5;19456:24;:::i;:::-;19449:5;19446:35;19436:63;;19495:1;19492;19485:12;19436:63;19383:122;:::o;19511:143::-;19568:5;19599:6;19593:13;19584:22;;19615:33;19642:5;19615:33;:::i;:::-;19511:143;;;;:::o;19660:141::-;19716:5;19747:6;19741:13;19732:22;;19763:32;19789:5;19763:32;:::i;:::-;19660:141;;;;:::o;19807:505::-;19885:6;19893;19942:2;19930:9;19921:7;19917:23;19913:32;19910:119;;;19948:79;;:::i;:::-;19910:119;20068:1;20093:64;20149:7;20140:6;20129:9;20125:22;20093:64;:::i;:::-;20083:74;;20039:128;20206:2;20232:63;20287:7;20278:6;20267:9;20263:22;20232:63;:::i;:::-;20222:73;;20177:128;19807:505;;;;;:::o" + "object": "608060405234801561001057600080fd5b50600436106100575760003560e01c8063267d40621461005c57806361fc548f1461007857806371b0edfa146100965780639f89f03e146100c6578063f87f493f146100e2575b600080fd5b61007660048036038101906100719190610628565b610114565b005b6100806101ae565b60405161008d919061071e565b60405180910390f35b6100b060048036038101906100ab9190610739565b6101d2565b6040516100bd9190610775565b60405180910390f35b6100e060048036038101906100db91906108ec565b610276565b005b6100fc60048036038101906100f7919061099f565b610310565b60405161010b93929190610a10565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663267d406286868686866040518663ffffffff1660e01b8152600401610175959493929190610aed565b600060405180830381600087803b15801561018f57600080fd5b505af11580156101a3573d6000803e3d6000fd5b505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166371b0edfa836040518263ffffffff1660e01b815260040161022e9190610b47565b602060405180830381865afa15801561024b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026f9190610b77565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639f89f03e86868686866040518663ffffffff1660e01b81526004016102d7959493929190610cfc565b600060405180830381600087803b1580156102f157600080fd5b505af1158015610305573d6000803e3d6000fd5b505050505050505050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f87f493f856040518263ffffffff1660e01b815260040161036f9190610d5d565b606060405180830381865afa15801561038c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b09190610dc0565b9250925092509193909250565b6000604051905090565b600080fd5b600080fd5b600060ff82169050919050565b6103e7816103d1565b81146103f257600080fd5b50565b600081359050610404816103de565b92915050565b600061ffff82169050919050565b6104218161040a565b811461042c57600080fd5b50565b60008135905061043e81610418565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061046f82610444565b9050919050565b61047f81610464565b811461048a57600080fd5b50565b60008135905061049c81610476565b92915050565b600067ffffffffffffffff82169050919050565b6104bf816104a2565b81146104ca57600080fd5b50565b6000813590506104dc816104b6565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610535826104ec565b810181811067ffffffffffffffff82111715610554576105536104fd565b5b80604052505050565b60006105676103bd565b9050610573828261052c565b919050565b600067ffffffffffffffff821115610593576105926104fd565b5b61059c826104ec565b9050602081019050919050565b82818337600083830152505050565b60006105cb6105c684610578565b61055d565b9050828152602081018484840111156105e7576105e66104e7565b5b6105f28482856105a9565b509392505050565b600082601f83011261060f5761060e6104e2565b5b813561061f8482602086016105b8565b91505092915050565b600080600080600060a08688031215610644576106436103c7565b5b6000610652888289016103f5565b95505060206106638882890161042f565b94505060406106748882890161048d565b9350506060610685888289016104cd565b925050608086013567ffffffffffffffff8111156106a6576106a56103cc565b5b6106b2888289016105fa565b9150509295509295909350565b6000819050919050565b60006106e46106df6106da84610444565b6106bf565b610444565b9050919050565b60006106f6826106c9565b9050919050565b6000610708826106eb565b9050919050565b610718816106fd565b82525050565b6000602082019050610733600083018461070f565b92915050565b60006020828403121561074f5761074e6103c7565b5b600061075d8482850161042f565b91505092915050565b61076f81610464565b82525050565b600060208201905061078a6000830184610766565b92915050565b600080fd5b600080fd5b600067ffffffffffffffff8211156107b5576107b46104fd565b5b602082029050602081019050919050565b600080fd5b60006107de6107d98461079a565b61055d565b90508083825260208201905060208402830185811115610801576108006107c6565b5b835b8181101561084857803567ffffffffffffffff811115610826576108256104e2565b5b80860161083389826105fa565b85526020850194505050602081019050610803565b5050509392505050565b600082601f830112610867576108666104e2565b5b81356108778482602086016107cb565b91505092915050565b60006040828403121561089657610895610790565b5b6108a0604061055d565b905060006108b0848285016103f5565b600083015250602082013567ffffffffffffffff8111156108d4576108d3610795565b5b6108e084828501610852565b60208301525092915050565b600080600080600060a08688031215610908576109076103c7565b5b6000610916888289016103f5565b95505060206109278882890161042f565b945050604086013567ffffffffffffffff811115610948576109476103cc565b5b61095488828901610880565b9350506060610965888289016104cd565b925050608086013567ffffffffffffffff811115610986576109856103cc565b5b610992888289016105fa565b9150509295509295909350565b6000602082840312156109b5576109b46103c7565b5b600082013567ffffffffffffffff8111156109d3576109d26103cc565b5b6109df84828501610880565b91505092915050565b6109f1816104a2565b82525050565b6000819050919050565b610a0a816109f7565b82525050565b6000606082019050610a2560008301866109e8565b610a326020830185610a01565b610a3f60408301846109e8565b949350505050565b610a50816103d1565b82525050565b610a5f8161040a565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610a9f578082015181840152602081019050610a84565b83811115610aae576000848401525b50505050565b6000610abf82610a65565b610ac98185610a70565b9350610ad9818560208601610a81565b610ae2816104ec565b840191505092915050565b600060a082019050610b026000830188610a47565b610b0f6020830187610a56565b610b1c6040830186610766565b610b2960608301856109e8565b8181036080830152610b3b8184610ab4565b90509695505050505050565b6000602082019050610b5c6000830184610a56565b92915050565b600081519050610b7181610476565b92915050565b600060208284031215610b8d57610b8c6103c7565b5b6000610b9b84828501610b62565b91505092915050565b610bad816103d1565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000610bfb82610a65565b610c058185610bdf565b9350610c15818560208601610a81565b610c1e816104ec565b840191505092915050565b6000610c358383610bf0565b905092915050565b6000602082019050919050565b6000610c5582610bb3565b610c5f8185610bbe565b935083602082028501610c7185610bcf565b8060005b85811015610cad5784840389528151610c8e8582610c29565b9450610c9983610c3d565b925060208a01995050600181019050610c75565b50829750879550505050505092915050565b6000604083016000830151610cd76000860182610ba4565b5060208301518482036020860152610cef8282610c4a565b9150508091505092915050565b600060a082019050610d116000830188610a47565b610d1e6020830187610a56565b8181036040830152610d308186610cbf565b9050610d3f60608301856109e8565b8181036080830152610d518184610ab4565b90509695505050505050565b60006020820190508181036000830152610d778184610cbf565b905092915050565b600081519050610d8e816104b6565b92915050565b610d9d816109f7565b8114610da857600080fd5b50565b600081519050610dba81610d94565b92915050565b600080600060608486031215610dd957610dd86103c7565b5b6000610de786828701610d7f565b9350506020610df886828701610dab565b9250506040610e0986828701610d7f565b915050925092509256fea26469706673582212200c97281bd15caba3cc6efa4a076e6f49a63c3b3c013798a44e77679bfec3fec964736f6c634300080a0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x57 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x267D4062 EQ PUSH2 0x5C JUMPI DUP1 PUSH4 0x61FC548F EQ PUSH2 0x78 JUMPI DUP1 PUSH4 0x71B0EDFA EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0x9F89F03E EQ PUSH2 0xC6 JUMPI DUP1 PUSH4 0xF87F493F EQ PUSH2 0xE2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x76 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x71 SWAP2 SWAP1 PUSH2 0x628 JUMP JUMPDEST PUSH2 0x114 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x80 PUSH2 0x1AE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8D SWAP2 SWAP1 PUSH2 0x71E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xB0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xAB SWAP2 SWAP1 PUSH2 0x739 JUMP JUMPDEST PUSH2 0x1D2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBD SWAP2 SWAP1 PUSH2 0x775 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xDB SWAP2 SWAP1 PUSH2 0x8EC JUMP JUMPDEST PUSH2 0x276 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFC PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xF7 SWAP2 SWAP1 PUSH2 0x99F JUMP JUMPDEST PUSH2 0x310 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xA10 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x267D4062 DUP7 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x175 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xAED JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x71B0EDFA DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22E SWAP2 SWAP1 PUSH2 0xB47 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x24B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x26F SWAP2 SWAP1 PUSH2 0xB77 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x9F89F03E DUP7 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xCFC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x305 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF87F493F DUP6 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x36F SWAP2 SWAP1 PUSH2 0xD5D JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x38C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3B0 SWAP2 SWAP1 PUSH2 0xDC0 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0xFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x3E7 DUP2 PUSH2 0x3D1 JUMP JUMPDEST DUP2 EQ PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x404 DUP2 PUSH2 0x3DE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x421 DUP2 PUSH2 0x40A JUMP JUMPDEST DUP2 EQ PUSH2 0x42C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x43E DUP2 PUSH2 0x418 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x46F DUP3 PUSH2 0x444 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x47F DUP2 PUSH2 0x464 JUMP JUMPDEST DUP2 EQ PUSH2 0x48A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x49C DUP2 PUSH2 0x476 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x4BF DUP2 PUSH2 0x4A2 JUMP JUMPDEST DUP2 EQ PUSH2 0x4CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x4DC DUP2 PUSH2 0x4B6 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x535 DUP3 PUSH2 0x4EC JUMP JUMPDEST DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x554 JUMPI PUSH2 0x553 PUSH2 0x4FD JUMP JUMPDEST JUMPDEST DUP1 PUSH1 0x40 MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x567 PUSH2 0x3BD JUMP JUMPDEST SWAP1 POP PUSH2 0x573 DUP3 DUP3 PUSH2 0x52C JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x593 JUMPI PUSH2 0x592 PUSH2 0x4FD JUMP JUMPDEST JUMPDEST PUSH2 0x59C DUP3 PUSH2 0x4EC JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY PUSH1 0x0 DUP4 DUP4 ADD MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5CB PUSH2 0x5C6 DUP5 PUSH2 0x578 JUMP JUMPDEST PUSH2 0x55D JUMP JUMPDEST SWAP1 POP DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP5 DUP5 DUP5 ADD GT ISZERO PUSH2 0x5E7 JUMPI PUSH2 0x5E6 PUSH2 0x4E7 JUMP JUMPDEST JUMPDEST PUSH2 0x5F2 DUP5 DUP3 DUP6 PUSH2 0x5A9 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x60F JUMPI PUSH2 0x60E PUSH2 0x4E2 JUMP JUMPDEST JUMPDEST DUP2 CALLDATALOAD PUSH2 0x61F DUP5 DUP3 PUSH1 0x20 DUP7 ADD PUSH2 0x5B8 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x644 JUMPI PUSH2 0x643 PUSH2 0x3C7 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x652 DUP9 DUP3 DUP10 ADD PUSH2 0x3F5 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x663 DUP9 DUP3 DUP10 ADD PUSH2 0x42F JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x674 DUP9 DUP3 DUP10 ADD PUSH2 0x48D JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x685 DUP9 DUP3 DUP10 ADD PUSH2 0x4CD JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6A6 JUMPI PUSH2 0x6A5 PUSH2 0x3CC JUMP JUMPDEST JUMPDEST PUSH2 0x6B2 DUP9 DUP3 DUP10 ADD PUSH2 0x5FA JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6E4 PUSH2 0x6DF PUSH2 0x6DA DUP5 PUSH2 0x444 JUMP JUMPDEST PUSH2 0x6BF JUMP JUMPDEST PUSH2 0x444 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6F6 DUP3 PUSH2 0x6C9 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x708 DUP3 PUSH2 0x6EB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x718 DUP2 PUSH2 0x6FD JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x733 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x70F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x74F JUMPI PUSH2 0x74E PUSH2 0x3C7 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x75D DUP5 DUP3 DUP6 ADD PUSH2 0x42F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x76F DUP2 PUSH2 0x464 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x78A PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x766 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x7B5 JUMPI PUSH2 0x7B4 PUSH2 0x4FD JUMP JUMPDEST JUMPDEST PUSH1 0x20 DUP3 MUL SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7DE PUSH2 0x7D9 DUP5 PUSH2 0x79A JUMP JUMPDEST PUSH2 0x55D JUMP JUMPDEST SWAP1 POP DUP1 DUP4 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH1 0x20 DUP5 MUL DUP4 ADD DUP6 DUP2 GT ISZERO PUSH2 0x801 JUMPI PUSH2 0x800 PUSH2 0x7C6 JUMP JUMPDEST JUMPDEST DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x848 JUMPI DUP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x826 JUMPI PUSH2 0x825 PUSH2 0x4E2 JUMP JUMPDEST JUMPDEST DUP1 DUP7 ADD PUSH2 0x833 DUP10 DUP3 PUSH2 0x5FA JUMP JUMPDEST DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP5 POP POP POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x803 JUMP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x867 JUMPI PUSH2 0x866 PUSH2 0x4E2 JUMP JUMPDEST JUMPDEST DUP2 CALLDATALOAD PUSH2 0x877 DUP5 DUP3 PUSH1 0x20 DUP7 ADD PUSH2 0x7CB JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x896 JUMPI PUSH2 0x895 PUSH2 0x790 JUMP JUMPDEST JUMPDEST PUSH2 0x8A0 PUSH1 0x40 PUSH2 0x55D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x8B0 DUP5 DUP3 DUP6 ADD PUSH2 0x3F5 JUMP JUMPDEST PUSH1 0x0 DUP4 ADD MSTORE POP PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8D4 JUMPI PUSH2 0x8D3 PUSH2 0x795 JUMP JUMPDEST JUMPDEST PUSH2 0x8E0 DUP5 DUP3 DUP6 ADD PUSH2 0x852 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x908 JUMPI PUSH2 0x907 PUSH2 0x3C7 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x916 DUP9 DUP3 DUP10 ADD PUSH2 0x3F5 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x927 DUP9 DUP3 DUP10 ADD PUSH2 0x42F JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x948 JUMPI PUSH2 0x947 PUSH2 0x3CC JUMP JUMPDEST JUMPDEST PUSH2 0x954 DUP9 DUP3 DUP10 ADD PUSH2 0x880 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x965 DUP9 DUP3 DUP10 ADD PUSH2 0x4CD JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x986 JUMPI PUSH2 0x985 PUSH2 0x3CC JUMP JUMPDEST JUMPDEST PUSH2 0x992 DUP9 DUP3 DUP10 ADD PUSH2 0x5FA JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x9B5 JUMPI PUSH2 0x9B4 PUSH2 0x3C7 JUMP JUMPDEST JUMPDEST PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x9D3 JUMPI PUSH2 0x9D2 PUSH2 0x3CC JUMP JUMPDEST JUMPDEST PUSH2 0x9DF DUP5 DUP3 DUP6 ADD PUSH2 0x880 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x9F1 DUP2 PUSH2 0x4A2 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xA0A DUP2 PUSH2 0x9F7 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 ADD SWAP1 POP PUSH2 0xA25 PUSH1 0x0 DUP4 ADD DUP7 PUSH2 0x9E8 JUMP JUMPDEST PUSH2 0xA32 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xA01 JUMP JUMPDEST PUSH2 0xA3F PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x9E8 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xA50 DUP2 PUSH2 0x3D1 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0xA5F DUP2 PUSH2 0x40A JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA9F JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xA84 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xAAE JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xABF DUP3 PUSH2 0xA65 JUMP JUMPDEST PUSH2 0xAC9 DUP2 DUP6 PUSH2 0xA70 JUMP JUMPDEST SWAP4 POP PUSH2 0xAD9 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0xA81 JUMP JUMPDEST PUSH2 0xAE2 DUP2 PUSH2 0x4EC JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD SWAP1 POP PUSH2 0xB02 PUSH1 0x0 DUP4 ADD DUP9 PUSH2 0xA47 JUMP JUMPDEST PUSH2 0xB0F PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0xA56 JUMP JUMPDEST PUSH2 0xB1C PUSH1 0x40 DUP4 ADD DUP7 PUSH2 0x766 JUMP JUMPDEST PUSH2 0xB29 PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x9E8 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0xB3B DUP2 DUP5 PUSH2 0xAB4 JUMP JUMPDEST SWAP1 POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0xB5C PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xA56 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xB71 DUP2 PUSH2 0x476 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB8D JUMPI PUSH2 0xB8C PUSH2 0x3C7 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xB9B DUP5 DUP3 DUP6 ADD PUSH2 0xB62 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xBAD DUP2 PUSH2 0x3D1 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBFB DUP3 PUSH2 0xA65 JUMP JUMPDEST PUSH2 0xC05 DUP2 DUP6 PUSH2 0xBDF JUMP JUMPDEST SWAP4 POP PUSH2 0xC15 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0xA81 JUMP JUMPDEST PUSH2 0xC1E DUP2 PUSH2 0x4EC JUMP JUMPDEST DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC35 DUP4 DUP4 PUSH2 0xBF0 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC55 DUP3 PUSH2 0xBB3 JUMP JUMPDEST PUSH2 0xC5F DUP2 DUP6 PUSH2 0xBBE JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0xC71 DUP6 PUSH2 0xBCF JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0xCAD JUMPI DUP5 DUP5 SUB DUP10 MSTORE DUP2 MLOAD PUSH2 0xC8E DUP6 DUP3 PUSH2 0xC29 JUMP JUMPDEST SWAP5 POP PUSH2 0xC99 DUP4 PUSH2 0xC3D JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP11 ADD SWAP10 POP POP PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0xC75 JUMP JUMPDEST POP DUP3 SWAP8 POP DUP8 SWAP6 POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP4 ADD PUSH1 0x0 DUP4 ADD MLOAD PUSH2 0xCD7 PUSH1 0x0 DUP7 ADD DUP3 PUSH2 0xBA4 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x20 DUP7 ADD MSTORE PUSH2 0xCEF DUP3 DUP3 PUSH2 0xC4A JUMP JUMPDEST SWAP2 POP POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA0 DUP3 ADD SWAP1 POP PUSH2 0xD11 PUSH1 0x0 DUP4 ADD DUP9 PUSH2 0xA47 JUMP JUMPDEST PUSH2 0xD1E PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0xA56 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xD30 DUP2 DUP7 PUSH2 0xCBF JUMP JUMPDEST SWAP1 POP PUSH2 0xD3F PUSH1 0x60 DUP4 ADD DUP6 PUSH2 0x9E8 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0xD51 DUP2 DUP5 PUSH2 0xAB4 JUMP JUMPDEST SWAP1 POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0xD77 DUP2 DUP5 PUSH2 0xCBF JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xD8E DUP2 PUSH2 0x4B6 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xD9D DUP2 PUSH2 0x9F7 JUMP JUMPDEST DUP2 EQ PUSH2 0xDA8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xDBA DUP2 PUSH2 0xD94 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xDD9 JUMPI PUSH2 0xDD8 PUSH2 0x3C7 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xDE7 DUP7 DUP3 DUP8 ADD PUSH2 0xD7F JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0xDF8 DUP7 DUP3 DUP8 ADD PUSH2 0xDAB JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0xE09 DUP7 DUP3 DUP8 ADD PUSH2 0xD7F JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC SWAP8 0x28 SHL 0xD1 0x5C 0xAB LOG3 0xCC PUSH15 0xFA4A076E6F49A63C3B3C013798A44E PUSH24 0x679BFEC3FEC964736F6C634300080A003300000000000000 ", + "sourceMap": "2664:1682:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3910:430;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2788:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2893:225;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3425:467;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3128:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;3910:430;4142:13;;;;;;;;;;:41;;;4201:10;4229:5;4252:11;4281:6;4305:10;4142:187;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3910:430;;;;;:::o;2788:94::-;;;;;;;;;;;;:::o;2893:225::-;2964:7;3070:13;;;;;;;;;;;:30;;;3101:5;3070:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3063:44;;2893:225;;;:::o;3425:467::-;3682:13;;;;;;;;;;:55;;;3755:10;3783:5;3806:9;3833:6;3857:10;3682:199;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3425:467;;;;;:::o;3128:287::-;3240:6;3248:7;3257:6;3362:13;;;;;;;;;;;:27;;;3390:13;3362:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3355:49;;;;;;3128:287;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:86;369:7;409:4;402:5;398:16;387:27;;334:86;;;:::o;426:118::-;497:22;513:5;497:22;:::i;:::-;490:5;487:33;477:61;;534:1;531;524:12;477:61;426:118;:::o;550:135::-;594:5;632:6;619:20;610:29;;648:31;673:5;648:31;:::i;:::-;550:135;;;;:::o;691:89::-;727:7;767:6;760:5;756:18;745:29;;691:89;;;:::o;786:120::-;858:23;875:5;858:23;:::i;:::-;851:5;848:34;838:62;;896:1;893;886:12;838:62;786:120;:::o;912:137::-;957:5;995:6;982:20;973:29;;1011:32;1037:5;1011:32;:::i;:::-;912:137;;;;:::o;1055:126::-;1092:7;1132:42;1125:5;1121:54;1110:65;;1055:126;;;:::o;1187:96::-;1224:7;1253:24;1271:5;1253:24;:::i;:::-;1242:35;;1187:96;;;:::o;1289:122::-;1362:24;1380:5;1362:24;:::i;:::-;1355:5;1352:35;1342:63;;1401:1;1398;1391:12;1342:63;1289:122;:::o;1417:139::-;1463:5;1501:6;1488:20;1479:29;;1517:33;1544:5;1517:33;:::i;:::-;1417:139;;;;:::o;1562:101::-;1598:7;1638:18;1631:5;1627:30;1616:41;;1562:101;;;:::o;1669:120::-;1741:23;1758:5;1741:23;:::i;:::-;1734:5;1731:34;1721:62;;1779:1;1776;1769:12;1721:62;1669:120;:::o;1795:137::-;1840:5;1878:6;1865:20;1856:29;;1894:32;1920:5;1894:32;:::i;:::-;1795:137;;;;:::o;1938:117::-;2047:1;2044;2037:12;2061:117;2170:1;2167;2160:12;2184:102;2225:6;2276:2;2272:7;2267:2;2260:5;2256:14;2252:28;2242:38;;2184:102;;;:::o;2292:180::-;2340:77;2337:1;2330:88;2437:4;2434:1;2427:15;2461:4;2458:1;2451:15;2478:281;2561:27;2583:4;2561:27;:::i;:::-;2553:6;2549:40;2691:6;2679:10;2676:22;2655:18;2643:10;2640:34;2637:62;2634:88;;;2702:18;;:::i;:::-;2634:88;2742:10;2738:2;2731:22;2521:238;2478:281;;:::o;2765:129::-;2799:6;2826:20;;:::i;:::-;2816:30;;2855:33;2883:4;2875:6;2855:33;:::i;:::-;2765:129;;;:::o;2900:307::-;2961:4;3051:18;3043:6;3040:30;3037:56;;;3073:18;;:::i;:::-;3037:56;3111:29;3133:6;3111:29;:::i;:::-;3103:37;;3195:4;3189;3185:15;3177:23;;2900:307;;;:::o;3213:154::-;3297:6;3292:3;3287;3274:30;3359:1;3350:6;3345:3;3341:16;3334:27;3213:154;;;:::o;3373:410::-;3450:5;3475:65;3491:48;3532:6;3491:48;:::i;:::-;3475:65;:::i;:::-;3466:74;;3563:6;3556:5;3549:21;3601:4;3594:5;3590:16;3639:3;3630:6;3625:3;3621:16;3618:25;3615:112;;;3646:79;;:::i;:::-;3615:112;3736:41;3770:6;3765:3;3760;3736:41;:::i;:::-;3456:327;3373:410;;;;;:::o;3802:338::-;3857:5;3906:3;3899:4;3891:6;3887:17;3883:27;3873:122;;3914:79;;:::i;:::-;3873:122;4031:6;4018:20;4056:78;4130:3;4122:6;4115:4;4107:6;4103:17;4056:78;:::i;:::-;4047:87;;3863:277;3802:338;;;;:::o;4146:1081::-;4246:6;4254;4262;4270;4278;4327:3;4315:9;4306:7;4302:23;4298:33;4295:120;;;4334:79;;:::i;:::-;4295:120;4454:1;4479:51;4522:7;4513:6;4502:9;4498:22;4479:51;:::i;:::-;4469:61;;4425:115;4579:2;4605:52;4649:7;4640:6;4629:9;4625:22;4605:52;:::i;:::-;4595:62;;4550:117;4706:2;4732:53;4777:7;4768:6;4757:9;4753:22;4732:53;:::i;:::-;4722:63;;4677:118;4834:2;4860:52;4904:7;4895:6;4884:9;4880:22;4860:52;:::i;:::-;4850:62;;4805:117;4989:3;4978:9;4974:19;4961:33;5021:18;5013:6;5010:30;5007:117;;;5043:79;;:::i;:::-;5007:117;5148:62;5202:7;5193:6;5182:9;5178:22;5148:62;:::i;:::-;5138:72;;4932:288;4146:1081;;;;;;;;:::o;5233:60::-;5261:3;5282:5;5275:12;;5233:60;;;:::o;5299:142::-;5349:9;5382:53;5400:34;5409:24;5427:5;5409:24;:::i;:::-;5400:34;:::i;:::-;5382:53;:::i;:::-;5369:66;;5299:142;;;:::o;5447:126::-;5497:9;5530:37;5561:5;5530:37;:::i;:::-;5517:50;;5447:126;;;:::o;5579:146::-;5649:9;5682:37;5713:5;5682:37;:::i;:::-;5669:50;;5579:146;;;:::o;5731:171::-;5838:57;5889:5;5838:57;:::i;:::-;5833:3;5826:70;5731:171;;:::o;5908:262::-;6021:4;6059:2;6048:9;6044:18;6036:26;;6072:91;6160:1;6149:9;6145:17;6136:6;6072:91;:::i;:::-;5908:262;;;;:::o;6176:327::-;6234:6;6283:2;6271:9;6262:7;6258:23;6254:32;6251:119;;;6289:79;;:::i;:::-;6251:119;6409:1;6434:52;6478:7;6469:6;6458:9;6454:22;6434:52;:::i;:::-;6424:62;;6380:116;6176:327;;;;:::o;6509:118::-;6596:24;6614:5;6596:24;:::i;:::-;6591:3;6584:37;6509:118;;:::o;6633:222::-;6726:4;6764:2;6753:9;6749:18;6741:26;;6777:71;6845:1;6834:9;6830:17;6821:6;6777:71;:::i;:::-;6633:222;;;;:::o;6861:117::-;6970:1;6967;6960:12;6984:117;7093:1;7090;7083:12;7107:320;7193:4;7283:18;7275:6;7272:30;7269:56;;;7305:18;;:::i;:::-;7269:56;7355:4;7347:6;7343:17;7335:25;;7415:4;7409;7405:15;7397:23;;7107:320;;;:::o;7433:117::-;7542:1;7539;7532:12;7571:942;7676:5;7701:90;7717:73;7783:6;7717:73;:::i;:::-;7701:90;:::i;:::-;7692:99;;7811:5;7840:6;7833:5;7826:21;7874:4;7867:5;7863:16;7856:23;;7927:4;7919:6;7915:17;7907:6;7903:30;7956:3;7948:6;7945:15;7942:122;;;7975:79;;:::i;:::-;7942:122;8090:6;8073:434;8107:6;8102:3;8099:15;8073:434;;;8196:3;8183:17;8232:18;8219:11;8216:35;8213:122;;;8254:79;;:::i;:::-;8213:122;8378:11;8370:6;8366:24;8416:46;8458:3;8446:10;8416:46;:::i;:::-;8411:3;8404:59;8492:4;8487:3;8483:14;8476:21;;8149:358;;8133:4;8128:3;8124:14;8117:21;;8073:434;;;8077:21;7682:831;;7571:942;;;;;:::o;8534:388::-;8614:5;8663:3;8656:4;8648:6;8644:17;8640:27;8630:122;;8671:79;;:::i;:::-;8630:122;8788:6;8775:20;8813:103;8912:3;8904:6;8897:4;8889:6;8885:17;8813:103;:::i;:::-;8804:112;;8620:302;8534:388;;;;:::o;8970:776::-;9047:5;9091:4;9079:9;9074:3;9070:19;9066:30;9063:117;;;9099:79;;:::i;:::-;9063:117;9198:21;9214:4;9198:21;:::i;:::-;9189:30;;9281:1;9321:47;9364:3;9355:6;9344:9;9340:22;9321:47;:::i;:::-;9314:4;9307:5;9303:16;9296:73;9229:151;9471:2;9460:9;9456:18;9443:32;9502:18;9494:6;9491:30;9488:117;;;9524:79;;:::i;:::-;9488:117;9644:83;9723:3;9714:6;9703:9;9699:22;9644:83;:::i;:::-;9637:4;9630:5;9626:16;9619:109;9390:349;8970:776;;;;:::o;9752:1297::-;9880:6;9888;9896;9904;9912;9961:3;9949:9;9940:7;9936:23;9932:33;9929:120;;;9968:79;;:::i;:::-;9929:120;10088:1;10113:51;10156:7;10147:6;10136:9;10132:22;10113:51;:::i;:::-;10103:61;;10059:115;10213:2;10239:52;10283:7;10274:6;10263:9;10259:22;10239:52;:::i;:::-;10229:62;;10184:117;10368:2;10357:9;10353:18;10340:32;10399:18;10391:6;10388:30;10385:117;;;10421:79;;:::i;:::-;10385:117;10526:81;10599:7;10590:6;10579:9;10575:22;10526:81;:::i;:::-;10516:91;;10311:306;10656:2;10682:52;10726:7;10717:6;10706:9;10702:22;10682:52;:::i;:::-;10672:62;;10627:117;10811:3;10800:9;10796:19;10783:33;10843:18;10835:6;10832:30;10829:117;;;10865:79;;:::i;:::-;10829:117;10970:62;11024:7;11015:6;11004:9;11000:22;10970:62;:::i;:::-;10960:72;;10754:288;9752:1297;;;;;;;;:::o;11055:545::-;11142:6;11191:2;11179:9;11170:7;11166:23;11162:32;11159:119;;;11197:79;;:::i;:::-;11159:119;11345:1;11334:9;11330:17;11317:31;11375:18;11367:6;11364:30;11361:117;;;11397:79;;:::i;:::-;11361:117;11502:81;11575:7;11566:6;11555:9;11551:22;11502:81;:::i;:::-;11492:91;;11288:305;11055:545;;;;:::o;11606:115::-;11691:23;11708:5;11691:23;:::i;:::-;11686:3;11679:36;11606:115;;:::o;11727:77::-;11764:7;11793:5;11782:16;;11727:77;;;:::o;11810:118::-;11897:24;11915:5;11897:24;:::i;:::-;11892:3;11885:37;11810:118;;:::o;11934:434::-;12079:4;12117:2;12106:9;12102:18;12094:26;;12130:69;12196:1;12185:9;12181:17;12172:6;12130:69;:::i;:::-;12209:72;12277:2;12266:9;12262:18;12253:6;12209:72;:::i;:::-;12291:70;12357:2;12346:9;12342:18;12333:6;12291:70;:::i;:::-;11934:434;;;;;;:::o;12374:112::-;12457:22;12473:5;12457:22;:::i;:::-;12452:3;12445:35;12374:112;;:::o;12492:115::-;12577:23;12594:5;12577:23;:::i;:::-;12572:3;12565:36;12492:115;;:::o;12613:98::-;12664:6;12698:5;12692:12;12682:22;;12613:98;;;:::o;12717:168::-;12800:11;12834:6;12829:3;12822:19;12874:4;12869:3;12865:14;12850:29;;12717:168;;;;:::o;12891:307::-;12959:1;12969:113;12983:6;12980:1;12977:13;12969:113;;;13068:1;13063:3;13059:11;13053:18;13049:1;13044:3;13040:11;13033:39;13005:2;13002:1;12998:10;12993:15;;12969:113;;;13100:6;13097:1;13094:13;13091:101;;;13180:1;13171:6;13166:3;13162:16;13155:27;13091:101;12940:258;12891:307;;;:::o;13204:360::-;13290:3;13318:38;13350:5;13318:38;:::i;:::-;13372:70;13435:6;13430:3;13372:70;:::i;:::-;13365:77;;13451:52;13496:6;13491:3;13484:4;13477:5;13473:16;13451:52;:::i;:::-;13528:29;13550:6;13528:29;:::i;:::-;13523:3;13519:39;13512:46;;13294:270;13204:360;;;;:::o;13570:735::-;13785:4;13823:3;13812:9;13808:19;13800:27;;13837:67;13901:1;13890:9;13886:17;13877:6;13837:67;:::i;:::-;13914:70;13980:2;13969:9;13965:18;13956:6;13914:70;:::i;:::-;13994:72;14062:2;14051:9;14047:18;14038:6;13994:72;:::i;:::-;14076:70;14142:2;14131:9;14127:18;14118:6;14076:70;:::i;:::-;14194:9;14188:4;14184:20;14178:3;14167:9;14163:19;14156:49;14222:76;14293:4;14284:6;14222:76;:::i;:::-;14214:84;;13570:735;;;;;;;;:::o;14311:218::-;14402:4;14440:2;14429:9;14425:18;14417:26;;14453:69;14519:1;14508:9;14504:17;14495:6;14453:69;:::i;:::-;14311:218;;;;:::o;14535:143::-;14592:5;14623:6;14617:13;14608:22;;14639:33;14666:5;14639:33;:::i;:::-;14535:143;;;;:::o;14684:351::-;14754:6;14803:2;14791:9;14782:7;14778:23;14774:32;14771:119;;;14809:79;;:::i;:::-;14771:119;14929:1;14954:64;15010:7;15001:6;14990:9;14986:22;14954:64;:::i;:::-;14944:74;;14900:128;14684:351;;;;:::o;15041:102::-;15114:22;15130:5;15114:22;:::i;:::-;15109:3;15102:35;15041:102;;:::o;15149:123::-;15225:6;15259:5;15253:12;15243:22;;15149:123;;;:::o;15278:183::-;15376:11;15410:6;15405:3;15398:19;15450:4;15445:3;15441:14;15426:29;;15278:183;;;;:::o;15467:141::-;15543:4;15566:3;15558:11;;15596:4;15591:3;15587:14;15579:22;;15467:141;;;:::o;15614:158::-;15687:11;15721:6;15716:3;15709:19;15761:4;15756:3;15752:14;15737:29;;15614:158;;;;:::o;15778:340::-;15854:3;15882:38;15914:5;15882:38;:::i;:::-;15936:60;15989:6;15984:3;15936:60;:::i;:::-;15929:67;;16005:52;16050:6;16045:3;16038:4;16031:5;16027:16;16005:52;:::i;:::-;16082:29;16104:6;16082:29;:::i;:::-;16077:3;16073:39;16066:46;;15858:260;15778:340;;;;:::o;16124:192::-;16211:10;16246:64;16306:3;16298:6;16246:64;:::i;:::-;16232:78;;16124:192;;;;:::o;16322:122::-;16401:4;16433;16428:3;16424:14;16416:22;;16322:122;;;:::o;16476:963::-;16603:3;16632:63;16689:5;16632:63;:::i;:::-;16711:85;16789:6;16784:3;16711:85;:::i;:::-;16704:92;;16822:3;16867:4;16859:6;16855:17;16850:3;16846:27;16897:65;16956:5;16897:65;:::i;:::-;16985:7;17016:1;17001:393;17026:6;17023:1;17020:13;17001:393;;;17097:9;17091:4;17087:20;17082:3;17075:33;17148:6;17142:13;17176:82;17253:4;17238:13;17176:82;:::i;:::-;17168:90;;17281:69;17343:6;17281:69;:::i;:::-;17271:79;;17379:4;17374:3;17370:14;17363:21;;17061:333;17048:1;17045;17041:9;17036:14;;17001:393;;;17005:14;17410:4;17403:11;;17430:3;17423:10;;16608:831;;;;;16476:963;;;;:::o;17525:663::-;17650:3;17686:4;17681:3;17677:14;17776:4;17769:5;17765:16;17759:23;17795:59;17848:4;17843:3;17839:14;17825:12;17795:59;:::i;:::-;17701:163;17950:4;17943:5;17939:16;17933:23;18003:3;17997:4;17993:14;17986:4;17981:3;17977:14;17970:38;18029:121;18145:4;18131:12;18029:121;:::i;:::-;18021:129;;17874:287;18178:4;18171:11;;17655:533;17525:663;;;;:::o;18194:898::-;18465:4;18503:3;18492:9;18488:19;18480:27;;18517:67;18581:1;18570:9;18566:17;18557:6;18517:67;:::i;:::-;18594:70;18660:2;18649:9;18645:18;18636:6;18594:70;:::i;:::-;18711:9;18705:4;18701:20;18696:2;18685:9;18681:18;18674:48;18739:114;18848:4;18839:6;18739:114;:::i;:::-;18731:122;;18863:70;18929:2;18918:9;18914:18;18905:6;18863:70;:::i;:::-;18981:9;18975:4;18971:20;18965:3;18954:9;18950:19;18943:49;19009:76;19080:4;19071:6;19009:76;:::i;:::-;19001:84;;18194:898;;;;;;;;:::o;19098:385::-;19247:4;19285:2;19274:9;19270:18;19262:26;;19334:9;19328:4;19324:20;19320:1;19309:9;19305:17;19298:47;19362:114;19471:4;19462:6;19362:114;:::i;:::-;19354:122;;19098:385;;;;:::o;19489:141::-;19545:5;19576:6;19570:13;19561:22;;19592:32;19618:5;19592:32;:::i;:::-;19489:141;;;;:::o;19636:122::-;19709:24;19727:5;19709:24;:::i;:::-;19702:5;19699:35;19689:63;;19748:1;19745;19738:12;19689:63;19636:122;:::o;19764:143::-;19821:5;19852:6;19846:13;19837:22;;19868:33;19895:5;19868:33;:::i;:::-;19764:143;;;;:::o;19913:659::-;19999:6;20007;20015;20064:2;20052:9;20043:7;20039:23;20035:32;20032:119;;;20070:79;;:::i;:::-;20032:119;20190:1;20215:63;20270:7;20261:6;20250:9;20246:22;20215:63;:::i;:::-;20205:73;;20161:127;20327:2;20353:64;20409:7;20400:6;20389:9;20385:22;20353:64;:::i;:::-;20343:74;;20298:129;20466:2;20492:63;20547:7;20538:6;20527:9;20523:22;20492:63;:::i;:::-;20482:73;;20437:128;19913:659;;;;;:::o" }, "gasEstimates": { "creation": { - "codeDepositCost": "729000", - "executionCost": "25027", - "totalCost": "754027" + "codeDepositCost": "731400", + "executionCost": "25033", + "totalCost": "756433" }, "external": { "index_to_account(uint16)": "infinite", @@ -10862,2083 +10991,2030 @@ "legacyAssembly": { ".code": [ { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "80" }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 2633, "end": 4285, "name": "MSTORE", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "MSTORE", "source": 0 }, { - "begin": 2808, - "end": 2850, + "begin": 2839, + "end": 2881, "name": "PUSH", "source": 0, "value": "806" }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 2757, "end": 2851, "name": "DUP1", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "DUP1", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH", "source": 0, "value": "100" }, - { "begin": 2757, "end": 2851, "name": "EXP", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "DUP2", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "SLOAD", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "DUP2", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "EXP", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "DUP2", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "SLOAD", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "DUP2", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH", "source": 0, "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, - { "begin": 2757, "end": 2851, "name": "MUL", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "NOT", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "AND", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "SWAP1", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "DUP4", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "MUL", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "NOT", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "AND", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "SWAP1", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "DUP4", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH", "source": 0, "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, - { "begin": 2757, "end": 2851, "name": "AND", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "MUL", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "OR", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "SWAP1", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "SSTORE", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "POP", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "CALLVALUE", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "DUP1", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "ISZERO", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "AND", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "MUL", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "OR", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "SWAP1", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "SSTORE", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "POP", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "CALLVALUE", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "DUP1", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "ISZERO", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH [tag]", "source": 0, "value": "1" }, - { "begin": 2633, "end": 4285, "name": "JUMPI", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "JUMPI", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 2633, "end": 4285, "name": "DUP1", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "REVERT", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "DUP1", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "REVERT", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "tag", "source": 0, "value": "1" }, - { "begin": 2633, "end": 4285, "name": "JUMPDEST", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "POP", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "JUMPDEST", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "POP", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH #[$]", "source": 0, "value": "0000000000000000000000000000000000000000000000000000000000000000" }, - { "begin": 2633, "end": 4285, "name": "DUP1", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "DUP1", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH [$]", "source": 0, "value": "0000000000000000000000000000000000000000000000000000000000000000" }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 2633, "end": 4285, "name": "CODECOPY", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "CODECOPY", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 2633, "end": 4285, "name": "RETURN", "source": 0 } + { "begin": 2664, "end": 4346, "name": "RETURN", "source": 0 } ], ".data": { "0": { - ".auxdata": "a2646970667358221220f4c38984c6cc29dbcc2eaba10fd373f554e43032ce961ef414eb2edc3748591664736f6c63430008090033", + ".auxdata": "a26469706673582212200c97281bd15caba3cc6efa4a076e6f49a63c3b3c013798a44e77679bfec3fec964736f6c634300080a0033", ".code": [ { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "80" }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 2633, "end": 4285, "name": "MSTORE", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "CALLVALUE", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "DUP1", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "ISZERO", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "MSTORE", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "CALLVALUE", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "DUP1", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "ISZERO", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH [tag]", "source": 0, "value": "1" }, - { "begin": 2633, "end": 4285, "name": "JUMPI", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "JUMPI", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 2633, "end": 4285, "name": "DUP1", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "REVERT", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "DUP1", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "REVERT", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "tag", "source": 0, "value": "1" }, - { "begin": 2633, "end": 4285, "name": "JUMPDEST", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "POP", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "JUMPDEST", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "POP", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "4" }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "CALLDATASIZE", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "LT", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "LT", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH [tag]", "source": 0, "value": "2" }, - { "begin": 2633, "end": 4285, "name": "JUMPI", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "JUMPI", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "0" }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "CALLDATALOAD", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "E0" }, - { "begin": 2633, "end": 4285, "name": "SHR", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "DUP1", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "SHR", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "DUP1", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "267D4062" }, - { "begin": 2633, "end": 4285, "name": "EQ", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "EQ", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH [tag]", "source": 0, "value": "3" }, - { "begin": 2633, "end": 4285, "name": "JUMPI", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "DUP1", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "JUMPI", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "DUP1", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "61FC548F" }, - { "begin": 2633, "end": 4285, "name": "EQ", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "EQ", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH [tag]", "source": 0, "value": "4" }, - { "begin": 2633, "end": 4285, "name": "JUMPI", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "DUP1", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "JUMPI", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "DUP1", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "71B0EDFA" }, - { "begin": 2633, "end": 4285, "name": "EQ", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "EQ", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH [tag]", "source": 0, "value": "5" }, - { "begin": 2633, "end": 4285, "name": "JUMPI", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "DUP1", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "JUMPI", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "DUP1", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "9F89F03E" }, - { "begin": 2633, "end": 4285, "name": "EQ", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "EQ", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH [tag]", "source": 0, "value": "6" }, - { "begin": 2633, "end": 4285, "name": "JUMPI", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "DUP1", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "JUMPI", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "DUP1", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "F87F493F" }, - { "begin": 2633, "end": 4285, "name": "EQ", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "EQ", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH [tag]", "source": 0, "value": "7" }, - { "begin": 2633, "end": 4285, "name": "JUMPI", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "JUMPI", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "tag", "source": 0, "value": "2" }, - { "begin": 2633, "end": 4285, "name": "JUMPDEST", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "JUMPDEST", "source": 0 }, { - "begin": 2633, - "end": 4285, + "begin": 2664, + "end": 4346, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 2633, "end": 4285, "name": "DUP1", "source": 0 }, - { "begin": 2633, "end": 4285, "name": "REVERT", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "DUP1", "source": 0 }, + { "begin": 2664, "end": 4346, "name": "REVERT", "source": 0 }, { - "begin": 3849, - "end": 4279, + "begin": 3910, + "end": 4340, "name": "tag", "source": 0, "value": "3" }, - { "begin": 3849, "end": 4279, "name": "JUMPDEST", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "JUMPDEST", "source": 0 }, { - "begin": 3849, - "end": 4279, + "begin": 3910, + "end": 4340, "name": "PUSH [tag]", "source": 0, "value": "8" }, { - "begin": 3849, - "end": 4279, + "begin": 3910, + "end": 4340, "name": "PUSH", "source": 0, "value": "4" }, - { "begin": 3849, "end": 4279, "name": "DUP1", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "DUP1", "source": 0 }, { - "begin": 3849, - "end": 4279, + "begin": 3910, + "end": 4340, "name": "CALLDATASIZE", "source": 0 }, - { "begin": 3849, "end": 4279, "name": "SUB", "source": 0 }, - { "begin": 3849, "end": 4279, "name": "DUP2", "source": 0 }, - { "begin": 3849, "end": 4279, "name": "ADD", "source": 0 }, - { "begin": 3849, "end": 4279, "name": "SWAP1", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "SUB", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "DUP2", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "ADD", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "SWAP1", "source": 0 }, { - "begin": 3849, - "end": 4279, + "begin": 3910, + "end": 4340, "name": "PUSH [tag]", "source": 0, "value": "9" }, - { "begin": 3849, "end": 4279, "name": "SWAP2", "source": 0 }, - { "begin": 3849, "end": 4279, "name": "SWAP1", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "SWAP2", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "SWAP1", "source": 0 }, { - "begin": 3849, - "end": 4279, + "begin": 3910, + "end": 4340, "name": "PUSH [tag]", "source": 0, "value": "10" }, { - "begin": 3849, - "end": 4279, + "begin": 3910, + "end": 4340, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 3849, - "end": 4279, + "begin": 3910, + "end": 4340, "name": "tag", "source": 0, "value": "9" }, - { "begin": 3849, "end": 4279, "name": "JUMPDEST", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "JUMPDEST", "source": 0 }, { - "begin": 3849, - "end": 4279, + "begin": 3910, + "end": 4340, "name": "PUSH [tag]", "source": 0, "value": "11" }, { - "begin": 3849, - "end": 4279, + "begin": 3910, + "end": 4340, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 3849, - "end": 4279, + "begin": 3910, + "end": 4340, "name": "tag", "source": 0, "value": "8" }, - { "begin": 3849, "end": 4279, "name": "JUMPDEST", "source": 0 }, - { "begin": 3849, "end": 4279, "name": "STOP", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "JUMPDEST", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "STOP", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "tag", "source": 0, "value": "4" }, - { "begin": 2757, "end": 2851, "name": "JUMPDEST", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "JUMPDEST", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH [tag]", "source": 0, "value": "12" }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH [tag]", "source": 0, "value": "13" }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "tag", "source": 0, "value": "12" }, - { "begin": 2757, "end": 2851, "name": "JUMPDEST", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "JUMPDEST", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 2757, "end": 2851, "name": "MLOAD", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "MLOAD", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH [tag]", "source": 0, "value": "14" }, - { "begin": 2757, "end": 2851, "name": "SWAP2", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "SWAP1", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "SWAP2", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "SWAP1", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH [tag]", "source": 0, "value": "15" }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "tag", "source": 0, "value": "14" }, - { "begin": 2757, "end": 2851, "name": "JUMPDEST", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "JUMPDEST", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 2757, "end": 2851, "name": "MLOAD", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "DUP1", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "SWAP2", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "SUB", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "SWAP1", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "RETURN", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "MLOAD", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "DUP1", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "SWAP2", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "SUB", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "SWAP1", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "RETURN", "source": 0 }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "tag", "source": 0, "value": "5" }, - { "begin": 2862, "end": 3087, "name": "JUMPDEST", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "JUMPDEST", "source": 0 }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "PUSH [tag]", "source": 0, "value": "16" }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "PUSH", "source": 0, "value": "4" }, - { "begin": 2862, "end": 3087, "name": "DUP1", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "DUP1", "source": 0 }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "CALLDATASIZE", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "SUB", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "DUP2", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "ADD", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "SWAP1", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "SUB", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "DUP2", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "ADD", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "SWAP1", "source": 0 }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "PUSH [tag]", "source": 0, "value": "17" }, - { "begin": 2862, "end": 3087, "name": "SWAP2", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "SWAP1", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "SWAP2", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "SWAP1", "source": 0 }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "PUSH [tag]", "source": 0, "value": "18" }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "tag", "source": 0, "value": "17" }, - { "begin": 2862, "end": 3087, "name": "JUMPDEST", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "JUMPDEST", "source": 0 }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "PUSH [tag]", "source": 0, "value": "19" }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "tag", "source": 0, "value": "16" }, - { "begin": 2862, "end": 3087, "name": "JUMPDEST", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "JUMPDEST", "source": 0 }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 2862, "end": 3087, "name": "MLOAD", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "MLOAD", "source": 0 }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "PUSH [tag]", "source": 0, "value": "20" }, - { "begin": 2862, "end": 3087, "name": "SWAP2", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "SWAP1", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "SWAP2", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "SWAP1", "source": 0 }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "PUSH [tag]", "source": 0, "value": "21" }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "tag", "source": 0, "value": "20" }, - { "begin": 2862, "end": 3087, "name": "JUMPDEST", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "JUMPDEST", "source": 0 }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 2862, "end": 3087, "name": "MLOAD", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "DUP1", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "SWAP2", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "SUB", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "SWAP1", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "RETURN", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "MLOAD", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "DUP1", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "SWAP2", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "SUB", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "SWAP1", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "RETURN", "source": 0 }, { - "begin": 3364, - "end": 3831, + "begin": 3425, + "end": 3892, "name": "tag", "source": 0, "value": "6" }, - { "begin": 3364, "end": 3831, "name": "JUMPDEST", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "JUMPDEST", "source": 0 }, { - "begin": 3364, - "end": 3831, + "begin": 3425, + "end": 3892, "name": "PUSH [tag]", "source": 0, "value": "22" }, { - "begin": 3364, - "end": 3831, + "begin": 3425, + "end": 3892, "name": "PUSH", "source": 0, "value": "4" }, - { "begin": 3364, "end": 3831, "name": "DUP1", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "DUP1", "source": 0 }, { - "begin": 3364, - "end": 3831, + "begin": 3425, + "end": 3892, "name": "CALLDATASIZE", "source": 0 }, - { "begin": 3364, "end": 3831, "name": "SUB", "source": 0 }, - { "begin": 3364, "end": 3831, "name": "DUP2", "source": 0 }, - { "begin": 3364, "end": 3831, "name": "ADD", "source": 0 }, - { "begin": 3364, "end": 3831, "name": "SWAP1", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "SUB", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "DUP2", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "ADD", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "SWAP1", "source": 0 }, { - "begin": 3364, - "end": 3831, + "begin": 3425, + "end": 3892, "name": "PUSH [tag]", "source": 0, "value": "23" }, - { "begin": 3364, "end": 3831, "name": "SWAP2", "source": 0 }, - { "begin": 3364, "end": 3831, "name": "SWAP1", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "SWAP2", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "SWAP1", "source": 0 }, { - "begin": 3364, - "end": 3831, + "begin": 3425, + "end": 3892, "name": "PUSH [tag]", "source": 0, "value": "24" }, { - "begin": 3364, - "end": 3831, + "begin": 3425, + "end": 3892, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 3364, - "end": 3831, + "begin": 3425, + "end": 3892, "name": "tag", "source": 0, "value": "23" }, - { "begin": 3364, "end": 3831, "name": "JUMPDEST", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "JUMPDEST", "source": 0 }, { - "begin": 3364, - "end": 3831, + "begin": 3425, + "end": 3892, "name": "PUSH [tag]", "source": 0, "value": "25" }, { - "begin": 3364, - "end": 3831, + "begin": 3425, + "end": 3892, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 3364, - "end": 3831, + "begin": 3425, + "end": 3892, "name": "tag", "source": 0, "value": "22" }, - { "begin": 3364, "end": 3831, "name": "JUMPDEST", "source": 0 }, - { "begin": 3364, "end": 3831, "name": "STOP", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "JUMPDEST", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "STOP", "source": 0 }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "tag", "source": 0, "value": "7" }, - { "begin": 3097, "end": 3354, "name": "JUMPDEST", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "JUMPDEST", "source": 0 }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "PUSH [tag]", "source": 0, "value": "26" }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "PUSH", "source": 0, "value": "4" }, - { "begin": 3097, "end": 3354, "name": "DUP1", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "DUP1", "source": 0 }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "CALLDATASIZE", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "SUB", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "DUP2", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "ADD", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "SWAP1", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SUB", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "DUP2", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "ADD", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP1", "source": 0 }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "PUSH [tag]", "source": 0, "value": "27" }, - { "begin": 3097, "end": 3354, "name": "SWAP2", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "SWAP1", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP2", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP1", "source": 0 }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "PUSH [tag]", "source": 0, "value": "28" }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "tag", "source": 0, "value": "27" }, - { "begin": 3097, "end": 3354, "name": "JUMPDEST", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "JUMPDEST", "source": 0 }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "PUSH [tag]", "source": 0, "value": "29" }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "tag", "source": 0, "value": "26" }, - { "begin": 3097, "end": 3354, "name": "JUMPDEST", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "JUMPDEST", "source": 0 }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 3097, "end": 3354, "name": "MLOAD", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "MLOAD", "source": 0 }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "PUSH [tag]", "source": 0, "value": "30" }, - { "begin": 3097, "end": 3354, "name": "SWAP3", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "SWAP2", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "SWAP1", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP4", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP3", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP2", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP1", "source": 0 }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "PUSH [tag]", "source": 0, "value": "31" }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "tag", "source": 0, "value": "30" }, - { "begin": 3097, "end": 3354, "name": "JUMPDEST", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "JUMPDEST", "source": 0 }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 3097, "end": 3354, "name": "MLOAD", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "DUP1", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "SWAP2", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "SUB", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "SWAP1", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "RETURN", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "MLOAD", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "DUP1", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP2", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SUB", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP1", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "RETURN", "source": 0 }, { - "begin": 3849, - "end": 4279, + "begin": 3910, + "end": 4340, "name": "tag", "source": 0, "value": "11" }, - { "begin": 3849, "end": 4279, "name": "JUMPDEST", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "JUMPDEST", "source": 0 }, { - "begin": 4081, - "end": 4094, + "begin": 4142, + "end": 4155, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 4081, "end": 4094, "name": "DUP1", "source": 0 }, - { "begin": 4081, "end": 4094, "name": "SLOAD", "source": 0 }, - { "begin": 4081, "end": 4094, "name": "SWAP1", "source": 0 }, + { "begin": 4142, "end": 4155, "name": "DUP1", "source": 0 }, + { "begin": 4142, "end": 4155, "name": "SLOAD", "source": 0 }, + { "begin": 4142, "end": 4155, "name": "SWAP1", "source": 0 }, { - "begin": 4081, - "end": 4094, + "begin": 4142, + "end": 4155, "name": "PUSH", "source": 0, "value": "100" }, - { "begin": 4081, "end": 4094, "name": "EXP", "source": 0 }, - { "begin": 4081, "end": 4094, "name": "SWAP1", "source": 0 }, - { "begin": 4081, "end": 4094, "name": "DIV", "source": 0 }, + { "begin": 4142, "end": 4155, "name": "EXP", "source": 0 }, + { "begin": 4142, "end": 4155, "name": "SWAP1", "source": 0 }, + { "begin": 4142, "end": 4155, "name": "DIV", "source": 0 }, { - "begin": 4081, - "end": 4094, + "begin": 4142, + "end": 4155, "name": "PUSH", "source": 0, "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, - { "begin": 4081, "end": 4094, "name": "AND", "source": 0 }, + { "begin": 4142, "end": 4155, "name": "AND", "source": 0 }, { - "begin": 4081, - "end": 4122, + "begin": 4142, + "end": 4183, "name": "PUSH", "source": 0, "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, - { "begin": 4081, "end": 4122, "name": "AND", "source": 0 }, + { "begin": 4142, "end": 4183, "name": "AND", "source": 0 }, { - "begin": 4081, - "end": 4122, + "begin": 4142, + "end": 4183, "name": "PUSH", "source": 0, "value": "267D4062" }, - { "begin": 4140, "end": 4150, "name": "DUP7", "source": 0 }, - { "begin": 4168, "end": 4173, "name": "DUP7", "source": 0 }, - { "begin": 4191, "end": 4202, "name": "DUP7", "source": 0 }, - { "begin": 4220, "end": 4226, "name": "DUP7", "source": 0 }, - { "begin": 4244, "end": 4254, "name": "DUP7", "source": 0 }, + { "begin": 4201, "end": 4211, "name": "DUP7", "source": 0 }, + { "begin": 4229, "end": 4234, "name": "DUP7", "source": 0 }, + { "begin": 4252, "end": 4263, "name": "DUP7", "source": 0 }, + { "begin": 4281, "end": 4287, "name": "DUP7", "source": 0 }, + { "begin": 4305, "end": 4315, "name": "DUP7", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 4081, "end": 4268, "name": "MLOAD", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "DUP7", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "MLOAD", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "DUP7", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH", "source": 0, "value": "FFFFFFFF" }, - { "begin": 4081, "end": 4268, "name": "AND", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "AND", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH", "source": 0, "value": "E0" }, - { "begin": 4081, "end": 4268, "name": "SHL", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "DUP2", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "MSTORE", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "SHL", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "DUP2", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "MSTORE", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH", "source": 0, "value": "4" }, - { "begin": 4081, "end": 4268, "name": "ADD", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "ADD", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH [tag]", "source": 0, "value": "33" }, - { "begin": 4081, "end": 4268, "name": "SWAP6", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "SWAP5", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "SWAP4", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "SWAP3", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "SWAP2", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "SWAP1", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "SWAP6", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "SWAP5", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "SWAP4", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "SWAP3", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "SWAP2", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "SWAP1", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH [tag]", "source": 0, "value": "34" }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "tag", "source": 0, "value": "33" }, - { "begin": 4081, "end": 4268, "name": "JUMPDEST", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "JUMPDEST", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH", "source": 0, "value": "0" }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 4081, "end": 4268, "name": "MLOAD", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "DUP1", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "DUP4", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "SUB", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "DUP2", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "MLOAD", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "DUP1", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "DUP4", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "SUB", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "DUP2", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 4081, "end": 4268, "name": "DUP8", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "DUP1", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "DUP8", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "DUP1", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "EXTCODESIZE", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "ISZERO", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "DUP1", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "ISZERO", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "ISZERO", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "DUP1", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "ISZERO", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH [tag]", "source": 0, "value": "35" }, - { "begin": 4081, "end": 4268, "name": "JUMPI", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "JUMPI", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 4081, "end": 4268, "name": "DUP1", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "REVERT", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "DUP1", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "REVERT", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "tag", "source": 0, "value": "35" }, - { "begin": 4081, "end": 4268, "name": "JUMPDEST", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "POP", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "GAS", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "CALL", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "ISZERO", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "DUP1", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "ISZERO", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "JUMPDEST", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "POP", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "GAS", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "CALL", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "ISZERO", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "DUP1", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "ISZERO", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH [tag]", "source": 0, "value": "37" }, - { "begin": 4081, "end": 4268, "name": "JUMPI", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "JUMPI", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "RETURNDATASIZE", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 4081, "end": 4268, "name": "DUP1", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "DUP1", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "RETURNDATACOPY", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "RETURNDATASIZE", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 4081, "end": 4268, "name": "REVERT", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "REVERT", "source": 0 }, { - "begin": 4081, - "end": 4268, + "begin": 4142, + "end": 4329, "name": "tag", "source": 0, "value": "37" }, - { "begin": 4081, "end": 4268, "name": "JUMPDEST", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "POP", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "POP", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "POP", "source": 0 }, - { "begin": 4081, "end": 4268, "name": "POP", "source": 0 }, - { "begin": 3849, "end": 4279, "name": "POP", "source": 0 }, - { "begin": 3849, "end": 4279, "name": "POP", "source": 0 }, - { "begin": 3849, "end": 4279, "name": "POP", "source": 0 }, - { "begin": 3849, "end": 4279, "name": "POP", "source": 0 }, - { "begin": 3849, "end": 4279, "name": "POP", "source": 0 }, - { - "begin": 3849, - "end": 4279, + { "begin": 4142, "end": 4329, "name": "JUMPDEST", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "POP", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "POP", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "POP", "source": 0 }, + { "begin": 4142, "end": 4329, "name": "POP", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "POP", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "POP", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "POP", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "POP", "source": 0 }, + { "begin": 3910, "end": 4340, "name": "POP", "source": 0 }, + { + "begin": 3910, + "end": 4340, "name": "JUMP", "source": 0, "value": "[out]" }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "tag", "source": 0, "value": "13" }, - { "begin": 2757, "end": 2851, "name": "JUMPDEST", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "JUMPDEST", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 2757, "end": 2851, "name": "DUP1", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "SLOAD", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "SWAP1", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "DUP1", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "SLOAD", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "SWAP1", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH", "source": 0, "value": "100" }, - { "begin": 2757, "end": 2851, "name": "EXP", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "SWAP1", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "DIV", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "EXP", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "SWAP1", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "DIV", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "PUSH", "source": 0, "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, - { "begin": 2757, "end": 2851, "name": "AND", "source": 0 }, - { "begin": 2757, "end": 2851, "name": "DUP2", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "AND", "source": 0 }, + { "begin": 2788, "end": 2882, "name": "DUP2", "source": 0 }, { - "begin": 2757, - "end": 2851, + "begin": 2788, + "end": 2882, "name": "JUMP", "source": 0, "value": "[out]" }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "tag", "source": 0, "value": "19" }, - { "begin": 2862, "end": 3087, "name": "JUMPDEST", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "JUMPDEST", "source": 0 }, { - "begin": 2933, - "end": 2940, + "begin": 2964, + "end": 2971, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3039, "end": 3052, "name": "DUP1", "source": 0 }, + { "begin": 3070, "end": 3083, "name": "DUP1", "source": 0 }, { - "begin": 3039, - "end": 3052, + "begin": 3070, + "end": 3083, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3039, "end": 3052, "name": "SWAP1", "source": 0 }, - { "begin": 3039, "end": 3052, "name": "SLOAD", "source": 0 }, - { "begin": 3039, "end": 3052, "name": "SWAP1", "source": 0 }, + { "begin": 3070, "end": 3083, "name": "SWAP1", "source": 0 }, + { "begin": 3070, "end": 3083, "name": "SLOAD", "source": 0 }, + { "begin": 3070, "end": 3083, "name": "SWAP1", "source": 0 }, { - "begin": 3039, - "end": 3052, + "begin": 3070, + "end": 3083, "name": "PUSH", "source": 0, "value": "100" }, - { "begin": 3039, "end": 3052, "name": "EXP", "source": 0 }, - { "begin": 3039, "end": 3052, "name": "SWAP1", "source": 0 }, - { "begin": 3039, "end": 3052, "name": "DIV", "source": 0 }, + { "begin": 3070, "end": 3083, "name": "EXP", "source": 0 }, + { "begin": 3070, "end": 3083, "name": "SWAP1", "source": 0 }, + { "begin": 3070, "end": 3083, "name": "DIV", "source": 0 }, { - "begin": 3039, - "end": 3052, + "begin": 3070, + "end": 3083, "name": "PUSH", "source": 0, "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, - { "begin": 3039, "end": 3052, "name": "AND", "source": 0 }, + { "begin": 3070, "end": 3083, "name": "AND", "source": 0 }, { - "begin": 3039, - "end": 3069, + "begin": 3070, + "end": 3100, "name": "PUSH", "source": 0, "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, - { "begin": 3039, "end": 3069, "name": "AND", "source": 0 }, + { "begin": 3070, "end": 3100, "name": "AND", "source": 0 }, { - "begin": 3039, - "end": 3069, + "begin": 3070, + "end": 3100, "name": "PUSH", "source": 0, "value": "71B0EDFA" }, - { "begin": 3070, "end": 3075, "name": "DUP4", "source": 0 }, + { "begin": 3101, "end": 3106, "name": "DUP4", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 3039, "end": 3076, "name": "MLOAD", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "DUP3", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "MLOAD", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "DUP3", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH", "source": 0, "value": "FFFFFFFF" }, - { "begin": 3039, "end": 3076, "name": "AND", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "AND", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH", "source": 0, "value": "E0" }, - { "begin": 3039, "end": 3076, "name": "SHL", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "DUP2", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "MSTORE", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "SHL", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "DUP2", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "MSTORE", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH", "source": 0, "value": "4" }, - { "begin": 3039, "end": 3076, "name": "ADD", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "ADD", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH [tag]", "source": 0, "value": "39" }, - { "begin": 3039, "end": 3076, "name": "SWAP2", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "SWAP1", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "SWAP2", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "SWAP1", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH [tag]", "source": 0, "value": "40" }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "tag", "source": 0, "value": "39" }, - { "begin": 3039, "end": 3076, "name": "JUMPDEST", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "JUMPDEST", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH", "source": 0, "value": "20" }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 3039, "end": 3076, "name": "MLOAD", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "DUP1", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "DUP4", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "SUB", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "DUP2", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "DUP7", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "DUP1", "source": 0 }, - { - "begin": 3039, - "end": 3076, - "name": "EXTCODESIZE", - "source": 0 - }, - { "begin": 3039, "end": 3076, "name": "ISZERO", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "DUP1", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "ISZERO", "source": 0 }, - { - "begin": 3039, - "end": 3076, - "name": "PUSH [tag]", - "source": 0, - "value": "41" - }, - { "begin": 3039, "end": 3076, "name": "JUMPI", "source": 0 }, - { - "begin": 3039, - "end": 3076, - "name": "PUSH", - "source": 0, - "value": "0" - }, - { "begin": 3039, "end": 3076, "name": "DUP1", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "REVERT", "source": 0 }, - { - "begin": 3039, - "end": 3076, - "name": "tag", - "source": 0, - "value": "41" - }, - { "begin": 3039, "end": 3076, "name": "JUMPDEST", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "POP", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "GAS", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "STATICCALL", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "ISZERO", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "DUP1", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "ISZERO", "source": 0 }, - { - "begin": 3039, - "end": 3076, + { "begin": 3070, "end": 3107, "name": "MLOAD", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "DUP1", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "DUP4", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "SUB", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "DUP2", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "DUP7", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "GAS", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "STATICCALL", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "ISZERO", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "DUP1", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "ISZERO", "source": 0 }, + { + "begin": 3070, + "end": 3107, "name": "PUSH [tag]", "source": 0, - "value": "43" + "value": "42" }, - { "begin": 3039, "end": 3076, "name": "JUMPI", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "JUMPI", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "RETURNDATASIZE", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3039, "end": 3076, "name": "DUP1", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "DUP1", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "RETURNDATACOPY", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "RETURNDATASIZE", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3039, "end": 3076, "name": "REVERT", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "REVERT", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "tag", "source": 0, - "value": "43" + "value": "42" }, - { "begin": 3039, "end": 3076, "name": "JUMPDEST", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "POP", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "POP", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "POP", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "POP", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "JUMPDEST", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "POP", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "POP", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "POP", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "POP", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 3039, "end": 3076, "name": "MLOAD", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "MLOAD", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "RETURNDATASIZE", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH", "source": 0, "value": "1F" }, - { "begin": 3039, "end": 3076, "name": "NOT", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "NOT", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH", "source": 0, "value": "1F" }, - { "begin": 3039, "end": 3076, "name": "DUP3", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "ADD", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "AND", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "DUP3", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "ADD", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "DUP1", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "DUP3", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "ADD", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "AND", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "DUP3", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "ADD", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "DUP1", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 3039, "end": 3076, "name": "MSTORE", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "POP", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "DUP2", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "ADD", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "SWAP1", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "MSTORE", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "POP", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "DUP2", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "ADD", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "SWAP1", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH [tag]", "source": 0, - "value": "44" + "value": "43" }, - { "begin": 3039, "end": 3076, "name": "SWAP2", "source": 0 }, - { "begin": 3039, "end": 3076, "name": "SWAP1", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "SWAP2", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "SWAP1", "source": 0 }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "PUSH [tag]", "source": 0, - "value": "45" + "value": "44" }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 3039, - "end": 3076, + "begin": 3070, + "end": 3107, "name": "tag", "source": 0, - "value": "44" + "value": "43" }, - { "begin": 3039, "end": 3076, "name": "JUMPDEST", "source": 0 }, - { "begin": 3032, "end": 3076, "name": "SWAP1", "source": 0 }, - { "begin": 3032, "end": 3076, "name": "POP", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "SWAP2", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "SWAP1", "source": 0 }, - { "begin": 2862, "end": 3087, "name": "POP", "source": 0 }, + { "begin": 3070, "end": 3107, "name": "JUMPDEST", "source": 0 }, + { "begin": 3063, "end": 3107, "name": "SWAP1", "source": 0 }, + { "begin": 3063, "end": 3107, "name": "POP", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "SWAP2", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "SWAP1", "source": 0 }, + { "begin": 2893, "end": 3118, "name": "POP", "source": 0 }, { - "begin": 2862, - "end": 3087, + "begin": 2893, + "end": 3118, "name": "JUMP", "source": 0, "value": "[out]" }, { - "begin": 3364, - "end": 3831, + "begin": 3425, + "end": 3892, "name": "tag", "source": 0, "value": "25" }, - { "begin": 3364, "end": 3831, "name": "JUMPDEST", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "JUMPDEST", "source": 0 }, { - "begin": 3621, - "end": 3634, + "begin": 3682, + "end": 3695, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3621, "end": 3634, "name": "DUP1", "source": 0 }, - { "begin": 3621, "end": 3634, "name": "SLOAD", "source": 0 }, - { "begin": 3621, "end": 3634, "name": "SWAP1", "source": 0 }, + { "begin": 3682, "end": 3695, "name": "DUP1", "source": 0 }, + { "begin": 3682, "end": 3695, "name": "SLOAD", "source": 0 }, + { "begin": 3682, "end": 3695, "name": "SWAP1", "source": 0 }, { - "begin": 3621, - "end": 3634, + "begin": 3682, + "end": 3695, "name": "PUSH", "source": 0, "value": "100" }, - { "begin": 3621, "end": 3634, "name": "EXP", "source": 0 }, - { "begin": 3621, "end": 3634, "name": "SWAP1", "source": 0 }, - { "begin": 3621, "end": 3634, "name": "DIV", "source": 0 }, + { "begin": 3682, "end": 3695, "name": "EXP", "source": 0 }, + { "begin": 3682, "end": 3695, "name": "SWAP1", "source": 0 }, + { "begin": 3682, "end": 3695, "name": "DIV", "source": 0 }, { - "begin": 3621, - "end": 3634, + "begin": 3682, + "end": 3695, "name": "PUSH", "source": 0, "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, - { "begin": 3621, "end": 3634, "name": "AND", "source": 0 }, + { "begin": 3682, "end": 3695, "name": "AND", "source": 0 }, { - "begin": 3621, - "end": 3676, + "begin": 3682, + "end": 3737, "name": "PUSH", "source": 0, "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, - { "begin": 3621, "end": 3676, "name": "AND", "source": 0 }, + { "begin": 3682, "end": 3737, "name": "AND", "source": 0 }, { - "begin": 3621, - "end": 3676, + "begin": 3682, + "end": 3737, "name": "PUSH", "source": 0, "value": "9F89F03E" }, - { "begin": 3694, "end": 3704, "name": "DUP7", "source": 0 }, - { "begin": 3722, "end": 3727, "name": "DUP7", "source": 0 }, - { "begin": 3745, "end": 3754, "name": "DUP7", "source": 0 }, - { "begin": 3772, "end": 3778, "name": "DUP7", "source": 0 }, - { "begin": 3796, "end": 3806, "name": "DUP7", "source": 0 }, + { "begin": 3755, "end": 3765, "name": "DUP7", "source": 0 }, + { "begin": 3783, "end": 3788, "name": "DUP7", "source": 0 }, + { "begin": 3806, "end": 3815, "name": "DUP7", "source": 0 }, + { "begin": 3833, "end": 3839, "name": "DUP7", "source": 0 }, + { "begin": 3857, "end": 3867, "name": "DUP7", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 3621, "end": 3820, "name": "MLOAD", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "DUP7", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "MLOAD", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "DUP7", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH", "source": 0, "value": "FFFFFFFF" }, - { "begin": 3621, "end": 3820, "name": "AND", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "AND", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH", "source": 0, "value": "E0" }, - { "begin": 3621, "end": 3820, "name": "SHL", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "DUP2", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "MSTORE", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "SHL", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "DUP2", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "MSTORE", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH", "source": 0, "value": "4" }, - { "begin": 3621, "end": 3820, "name": "ADD", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "ADD", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH [tag]", "source": 0, - "value": "47" + "value": "46" }, - { "begin": 3621, "end": 3820, "name": "SWAP6", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "SWAP5", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "SWAP4", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "SWAP3", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "SWAP2", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "SWAP1", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "SWAP6", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "SWAP5", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "SWAP4", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "SWAP3", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "SWAP2", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "SWAP1", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH [tag]", "source": 0, - "value": "48" + "value": "47" }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "tag", "source": 0, - "value": "47" + "value": "46" }, - { "begin": 3621, "end": 3820, "name": "JUMPDEST", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "JUMPDEST", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH", "source": 0, "value": "0" }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 3621, "end": 3820, "name": "MLOAD", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "DUP1", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "DUP4", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "SUB", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "DUP2", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "MLOAD", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "DUP1", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "DUP4", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "SUB", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "DUP2", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3621, "end": 3820, "name": "DUP8", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "DUP1", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "DUP8", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "DUP1", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "EXTCODESIZE", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "ISZERO", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "DUP1", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "ISZERO", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "ISZERO", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "DUP1", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "ISZERO", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH [tag]", "source": 0, - "value": "49" + "value": "48" }, - { "begin": 3621, "end": 3820, "name": "JUMPI", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "JUMPI", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3621, "end": 3820, "name": "DUP1", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "REVERT", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "DUP1", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "REVERT", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "tag", "source": 0, - "value": "49" + "value": "48" }, - { "begin": 3621, "end": 3820, "name": "JUMPDEST", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "POP", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "GAS", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "CALL", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "ISZERO", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "DUP1", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "ISZERO", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "JUMPDEST", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "POP", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "GAS", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "CALL", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "ISZERO", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "DUP1", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "ISZERO", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH [tag]", "source": 0, - "value": "51" + "value": "50" }, - { "begin": 3621, "end": 3820, "name": "JUMPI", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "JUMPI", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "RETURNDATASIZE", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3621, "end": 3820, "name": "DUP1", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "DUP1", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "RETURNDATACOPY", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "RETURNDATASIZE", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3621, "end": 3820, "name": "REVERT", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "REVERT", "source": 0 }, { - "begin": 3621, - "end": 3820, + "begin": 3682, + "end": 3881, "name": "tag", "source": 0, - "value": "51" - }, - { "begin": 3621, "end": 3820, "name": "JUMPDEST", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "POP", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "POP", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "POP", "source": 0 }, - { "begin": 3621, "end": 3820, "name": "POP", "source": 0 }, - { "begin": 3364, "end": 3831, "name": "POP", "source": 0 }, - { "begin": 3364, "end": 3831, "name": "POP", "source": 0 }, - { "begin": 3364, "end": 3831, "name": "POP", "source": 0 }, - { "begin": 3364, "end": 3831, "name": "POP", "source": 0 }, - { "begin": 3364, "end": 3831, "name": "POP", "source": 0 }, - { - "begin": 3364, - "end": 3831, + "value": "50" + }, + { "begin": 3682, "end": 3881, "name": "JUMPDEST", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "POP", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "POP", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "POP", "source": 0 }, + { "begin": 3682, "end": 3881, "name": "POP", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "POP", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "POP", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "POP", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "POP", "source": 0 }, + { "begin": 3425, "end": 3892, "name": "POP", "source": 0 }, + { + "begin": 3425, + "end": 3892, "name": "JUMP", "source": 0, "value": "[out]" }, { - "begin": 3097, - "end": 3354, + "begin": 3128, + "end": 3415, "name": "tag", "source": 0, "value": "29" }, - { "begin": 3097, "end": 3354, "name": "JUMPDEST", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "JUMPDEST", "source": 0 }, + { + "begin": 3240, + "end": 3246, + "name": "PUSH", + "source": 0, + "value": "0" + }, + { "begin": 3248, "end": 3255, "name": "DUP1", "source": 0 }, { - "begin": 3187, - "end": 3194, + "begin": 3257, + "end": 3263, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3196, "end": 3202, "name": "DUP1", "source": 0 }, + { "begin": 3362, "end": 3375, "name": "DUP1", "source": 0 }, { - "begin": 3301, - "end": 3314, + "begin": 3362, + "end": 3375, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3301, "end": 3314, "name": "DUP1", "source": 0 }, - { "begin": 3301, "end": 3314, "name": "SLOAD", "source": 0 }, - { "begin": 3301, "end": 3314, "name": "SWAP1", "source": 0 }, + { "begin": 3362, "end": 3375, "name": "SWAP1", "source": 0 }, + { "begin": 3362, "end": 3375, "name": "SLOAD", "source": 0 }, + { "begin": 3362, "end": 3375, "name": "SWAP1", "source": 0 }, { - "begin": 3301, - "end": 3314, + "begin": 3362, + "end": 3375, "name": "PUSH", "source": 0, "value": "100" }, - { "begin": 3301, "end": 3314, "name": "EXP", "source": 0 }, - { "begin": 3301, "end": 3314, "name": "SWAP1", "source": 0 }, - { "begin": 3301, "end": 3314, "name": "DIV", "source": 0 }, + { "begin": 3362, "end": 3375, "name": "EXP", "source": 0 }, + { "begin": 3362, "end": 3375, "name": "SWAP1", "source": 0 }, + { "begin": 3362, "end": 3375, "name": "DIV", "source": 0 }, { - "begin": 3301, - "end": 3314, + "begin": 3362, + "end": 3375, "name": "PUSH", "source": 0, "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, - { "begin": 3301, "end": 3314, "name": "AND", "source": 0 }, + { "begin": 3362, "end": 3375, "name": "AND", "source": 0 }, { - "begin": 3301, - "end": 3328, + "begin": 3362, + "end": 3389, "name": "PUSH", "source": 0, "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }, - { "begin": 3301, "end": 3328, "name": "AND", "source": 0 }, + { "begin": 3362, "end": 3389, "name": "AND", "source": 0 }, { - "begin": 3301, - "end": 3328, + "begin": 3362, + "end": 3389, "name": "PUSH", "source": 0, "value": "F87F493F" }, - { "begin": 3329, "end": 3342, "name": "DUP5", "source": 0 }, + { "begin": 3390, "end": 3403, "name": "DUP6", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 3301, "end": 3343, "name": "MLOAD", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "DUP3", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "MLOAD", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "DUP3", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH", "source": 0, "value": "FFFFFFFF" }, - { "begin": 3301, "end": 3343, "name": "AND", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "AND", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH", "source": 0, "value": "E0" }, - { "begin": 3301, "end": 3343, "name": "SHL", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "DUP2", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "MSTORE", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "SHL", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "DUP2", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "MSTORE", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH", "source": 0, "value": "4" }, - { "begin": 3301, "end": 3343, "name": "ADD", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "ADD", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH [tag]", "source": 0, - "value": "53" + "value": "52" }, - { "begin": 3301, "end": 3343, "name": "SWAP2", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "SWAP1", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "SWAP2", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "SWAP1", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH [tag]", "source": 0, - "value": "54" + "value": "53" }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "tag", "source": 0, - "value": "53" + "value": "52" }, - { "begin": 3301, "end": 3343, "name": "JUMPDEST", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "JUMPDEST", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH", "source": 0, - "value": "40" - }, - { "begin": 3301, "end": 3343, "name": "DUP1", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "MLOAD", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "DUP1", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "DUP4", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "SUB", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "DUP2", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "DUP7", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "DUP1", "source": 0 }, - { - "begin": 3301, - "end": 3343, - "name": "EXTCODESIZE", - "source": 0 - }, - { "begin": 3301, "end": 3343, "name": "ISZERO", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "DUP1", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "ISZERO", "source": 0 }, - { - "begin": 3301, - "end": 3343, - "name": "PUSH [tag]", - "source": 0, - "value": "55" + "value": "60" }, - { "begin": 3301, "end": 3343, "name": "JUMPI", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH", "source": 0, - "value": "0" - }, - { "begin": 3301, "end": 3343, "name": "DUP1", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "REVERT", "source": 0 }, - { - "begin": 3301, - "end": 3343, - "name": "tag", - "source": 0, - "value": "55" + "value": "40" }, - { "begin": 3301, "end": 3343, "name": "JUMPDEST", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "POP", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "GAS", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "STATICCALL", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "ISZERO", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "DUP1", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "ISZERO", "source": 0 }, - { - "begin": 3301, - "end": 3343, + { "begin": 3362, "end": 3404, "name": "MLOAD", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "DUP1", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "DUP4", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "SUB", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "DUP2", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "DUP7", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "GAS", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "STATICCALL", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "ISZERO", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "DUP1", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "ISZERO", "source": 0 }, + { + "begin": 3362, + "end": 3404, "name": "PUSH [tag]", "source": 0, - "value": "57" + "value": "55" }, - { "begin": 3301, "end": 3343, "name": "JUMPI", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "JUMPI", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "RETURNDATASIZE", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3301, "end": 3343, "name": "DUP1", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "DUP1", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "RETURNDATACOPY", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "RETURNDATASIZE", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH", "source": 0, "value": "0" }, - { "begin": 3301, "end": 3343, "name": "REVERT", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "REVERT", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "tag", "source": 0, - "value": "57" + "value": "55" }, - { "begin": 3301, "end": 3343, "name": "JUMPDEST", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "POP", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "POP", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "POP", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "POP", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "JUMPDEST", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "POP", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "POP", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "POP", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "POP", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 3301, "end": 3343, "name": "MLOAD", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "MLOAD", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "RETURNDATASIZE", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH", "source": 0, "value": "1F" }, - { "begin": 3301, "end": 3343, "name": "NOT", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "NOT", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH", "source": 0, "value": "1F" }, - { "begin": 3301, "end": 3343, "name": "DUP3", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "ADD", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "AND", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "DUP3", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "ADD", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "DUP1", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "DUP3", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "ADD", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "AND", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "DUP3", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "ADD", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "DUP1", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH", "source": 0, "value": "40" }, - { "begin": 3301, "end": 3343, "name": "MSTORE", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "POP", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "DUP2", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "ADD", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "SWAP1", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "MSTORE", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "POP", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "DUP2", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "ADD", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "SWAP1", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH [tag]", "source": 0, - "value": "58" + "value": "56" }, - { "begin": 3301, "end": 3343, "name": "SWAP2", "source": 0 }, - { "begin": 3301, "end": 3343, "name": "SWAP1", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "SWAP2", "source": 0 }, + { "begin": 3362, "end": 3404, "name": "SWAP1", "source": 0 }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "PUSH [tag]", "source": 0, - "value": "59" + "value": "57" }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "JUMP", "source": 0, "value": "[in]" }, { - "begin": 3301, - "end": 3343, + "begin": 3362, + "end": 3404, "name": "tag", "source": 0, - "value": "58" - }, - { "begin": 3301, "end": 3343, "name": "JUMPDEST", "source": 0 }, - { "begin": 3294, "end": 3343, "name": "SWAP2", "source": 0 }, - { "begin": 3294, "end": 3343, "name": "POP", "source": 0 }, - { "begin": 3294, "end": 3343, "name": "SWAP2", "source": 0 }, - { "begin": 3294, "end": 3343, "name": "POP", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "SWAP2", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "POP", "source": 0 }, - { "begin": 3097, "end": 3354, "name": "SWAP2", "source": 0 }, - { - "begin": 3097, - "end": 3354, + "value": "56" + }, + { "begin": 3362, "end": 3404, "name": "JUMPDEST", "source": 0 }, + { "begin": 3355, "end": 3404, "name": "SWAP3", "source": 0 }, + { "begin": 3355, "end": 3404, "name": "POP", "source": 0 }, + { "begin": 3355, "end": 3404, "name": "SWAP3", "source": 0 }, + { "begin": 3355, "end": 3404, "name": "POP", "source": 0 }, + { "begin": 3355, "end": 3404, "name": "SWAP3", "source": 0 }, + { "begin": 3355, "end": 3404, "name": "POP", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP2", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP4", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP1", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "SWAP3", "source": 0 }, + { "begin": 3128, "end": 3415, "name": "POP", "source": 0 }, + { + "begin": 3128, + "end": 3415, "name": "JUMP", "source": 0, "value": "[out]" @@ -12948,7 +13024,7 @@ "end": 82, "name": "tag", "source": 1, - "value": "60" + "value": "58" }, { "begin": 7, "end": 82, "name": "JUMPDEST", "source": 1 }, { @@ -12981,7 +13057,7 @@ "end": 205, "name": "tag", "source": 1, - "value": "61" + "value": "59" }, { "begin": 88, "end": 205, "name": "JUMPDEST", "source": 1 }, { @@ -12998,7 +13074,7 @@ "end": 328, "name": "tag", "source": 1, - "value": "62" + "value": "60" }, { "begin": 211, "end": 328, "name": "JUMPDEST", "source": 1 }, { @@ -13015,7 +13091,7 @@ "end": 420, "name": "tag", "source": 1, - "value": "63" + "value": "61" }, { "begin": 334, "end": 420, "name": "JUMPDEST", "source": 1 }, { @@ -13051,7 +13127,7 @@ "end": 544, "name": "tag", "source": 1, - "value": "64" + "value": "62" }, { "begin": 426, "end": 544, "name": "JUMPDEST", "source": 1 }, { @@ -13059,7 +13135,7 @@ "end": 519, "name": "PUSH [tag]", "source": 1, - "value": "128" + "value": "126" }, { "begin": 513, "end": 518, "name": "DUP2", "source": 1 }, { @@ -13067,7 +13143,7 @@ "end": 519, "name": "PUSH [tag]", "source": 1, - "value": "63" + "value": "61" }, { "begin": 497, @@ -13081,7 +13157,7 @@ "end": 519, "name": "tag", "source": 1, - "value": "128" + "value": "126" }, { "begin": 497, "end": 519, "name": "JUMPDEST", "source": 1 }, { "begin": 490, "end": 495, "name": "DUP2", "source": 1 }, @@ -13091,7 +13167,7 @@ "end": 538, "name": "PUSH [tag]", "source": 1, - "value": "129" + "value": "127" }, { "begin": 477, "end": 538, "name": "JUMPI", "source": 1 }, { @@ -13108,7 +13184,7 @@ "end": 538, "name": "tag", "source": 1, - "value": "129" + "value": "127" }, { "begin": 477, "end": 538, "name": "JUMPDEST", "source": 1 }, { "begin": 426, "end": 544, "name": "POP", "source": 1 }, @@ -13124,7 +13200,7 @@ "end": 685, "name": "tag", "source": 1, - "value": "65" + "value": "63" }, { "begin": 550, "end": 685, "name": "JUMPDEST", "source": 1 }, { @@ -13143,7 +13219,7 @@ "end": 679, "name": "PUSH [tag]", "source": 1, - "value": "131" + "value": "129" }, { "begin": 673, "end": 678, "name": "DUP2", "source": 1 }, { @@ -13151,7 +13227,7 @@ "end": 679, "name": "PUSH [tag]", "source": 1, - "value": "64" + "value": "62" }, { "begin": 648, @@ -13165,7 +13241,7 @@ "end": 679, "name": "tag", "source": 1, - "value": "131" + "value": "129" }, { "begin": 648, "end": 679, "name": "JUMPDEST", "source": 1 }, { "begin": 550, "end": 685, "name": "SWAP3", "source": 1 }, @@ -13184,7 +13260,7 @@ "end": 780, "name": "tag", "source": 1, - "value": "66" + "value": "64" }, { "begin": 691, "end": 780, "name": "JUMPDEST", "source": 1 }, { @@ -13220,7 +13296,7 @@ "end": 906, "name": "tag", "source": 1, - "value": "67" + "value": "65" }, { "begin": 786, "end": 906, "name": "JUMPDEST", "source": 1 }, { @@ -13228,7 +13304,7 @@ "end": 881, "name": "PUSH [tag]", "source": 1, - "value": "134" + "value": "132" }, { "begin": 875, "end": 880, "name": "DUP2", "source": 1 }, { @@ -13236,7 +13312,7 @@ "end": 881, "name": "PUSH [tag]", "source": 1, - "value": "66" + "value": "64" }, { "begin": 858, @@ -13250,7 +13326,7 @@ "end": 881, "name": "tag", "source": 1, - "value": "134" + "value": "132" }, { "begin": 858, "end": 881, "name": "JUMPDEST", "source": 1 }, { "begin": 851, "end": 856, "name": "DUP2", "source": 1 }, @@ -13260,7 +13336,7 @@ "end": 900, "name": "PUSH [tag]", "source": 1, - "value": "135" + "value": "133" }, { "begin": 838, "end": 900, "name": "JUMPI", "source": 1 }, { @@ -13277,7 +13353,7 @@ "end": 900, "name": "tag", "source": 1, - "value": "135" + "value": "133" }, { "begin": 838, "end": 900, "name": "JUMPDEST", "source": 1 }, { "begin": 786, "end": 906, "name": "POP", "source": 1 }, @@ -13293,7 +13369,7 @@ "end": 1049, "name": "tag", "source": 1, - "value": "68" + "value": "66" }, { "begin": 912, "end": 1049, "name": "JUMPDEST", "source": 1 }, { @@ -13317,7 +13393,7 @@ "end": 1043, "name": "PUSH [tag]", "source": 1, - "value": "137" + "value": "135" }, { "begin": 1037, "end": 1042, "name": "DUP2", "source": 1 }, { @@ -13325,7 +13401,7 @@ "end": 1043, "name": "PUSH [tag]", "source": 1, - "value": "67" + "value": "65" }, { "begin": 1011, @@ -13339,7 +13415,7 @@ "end": 1043, "name": "tag", "source": 1, - "value": "137" + "value": "135" }, { "begin": 1011, "end": 1043, "name": "JUMPDEST", "source": 1 }, { "begin": 912, "end": 1049, "name": "SWAP3", "source": 1 }, @@ -13358,7 +13434,7 @@ "end": 1181, "name": "tag", "source": 1, - "value": "69" + "value": "67" }, { "begin": 1055, "end": 1181, "name": "JUMPDEST", "source": 1 }, { @@ -13394,7 +13470,7 @@ "end": 1283, "name": "tag", "source": 1, - "value": "70" + "value": "68" }, { "begin": 1187, "end": 1283, "name": "JUMPDEST", "source": 1 }, { @@ -13409,7 +13485,7 @@ "end": 1277, "name": "PUSH [tag]", "source": 1, - "value": "140" + "value": "138" }, { "begin": 1271, "end": 1276, "name": "DUP3", "source": 1 }, { @@ -13417,7 +13493,7 @@ "end": 1277, "name": "PUSH [tag]", "source": 1, - "value": "69" + "value": "67" }, { "begin": 1253, @@ -13431,7 +13507,7 @@ "end": 1277, "name": "tag", "source": 1, - "value": "140" + "value": "138" }, { "begin": 1253, "end": 1277, "name": "JUMPDEST", "source": 1 }, { "begin": 1242, "end": 1277, "name": "SWAP1", "source": 1 }, @@ -13451,7 +13527,7 @@ "end": 1411, "name": "tag", "source": 1, - "value": "71" + "value": "69" }, { "begin": 1289, "end": 1411, "name": "JUMPDEST", "source": 1 }, { @@ -13459,7 +13535,7 @@ "end": 1386, "name": "PUSH [tag]", "source": 1, - "value": "142" + "value": "140" }, { "begin": 1380, "end": 1385, "name": "DUP2", "source": 1 }, { @@ -13467,7 +13543,7 @@ "end": 1386, "name": "PUSH [tag]", "source": 1, - "value": "70" + "value": "68" }, { "begin": 1362, @@ -13481,7 +13557,7 @@ "end": 1386, "name": "tag", "source": 1, - "value": "142" + "value": "140" }, { "begin": 1362, "end": 1386, "name": "JUMPDEST", "source": 1 }, { "begin": 1355, "end": 1360, "name": "DUP2", "source": 1 }, @@ -13491,7 +13567,7 @@ "end": 1405, "name": "PUSH [tag]", "source": 1, - "value": "143" + "value": "141" }, { "begin": 1342, "end": 1405, "name": "JUMPI", "source": 1 }, { @@ -13508,7 +13584,7 @@ "end": 1405, "name": "tag", "source": 1, - "value": "143" + "value": "141" }, { "begin": 1342, "end": 1405, "name": "JUMPDEST", "source": 1 }, { "begin": 1289, "end": 1411, "name": "POP", "source": 1 }, @@ -13524,7 +13600,7 @@ "end": 1556, "name": "tag", "source": 1, - "value": "72" + "value": "70" }, { "begin": 1417, "end": 1556, "name": "JUMPDEST", "source": 1 }, { @@ -13548,7 +13624,7 @@ "end": 1550, "name": "PUSH [tag]", "source": 1, - "value": "145" + "value": "143" }, { "begin": 1544, "end": 1549, "name": "DUP2", "source": 1 }, { @@ -13556,7 +13632,7 @@ "end": 1550, "name": "PUSH [tag]", "source": 1, - "value": "71" + "value": "69" }, { "begin": 1517, @@ -13570,7 +13646,7 @@ "end": 1550, "name": "tag", "source": 1, - "value": "145" + "value": "143" }, { "begin": 1517, "end": 1550, "name": "JUMPDEST", "source": 1 }, { "begin": 1417, "end": 1556, "name": "SWAP3", "source": 1 }, @@ -13589,7 +13665,7 @@ "end": 1663, "name": "tag", "source": 1, - "value": "73" + "value": "71" }, { "begin": 1562, "end": 1663, "name": "JUMPDEST", "source": 1 }, { @@ -13625,7 +13701,7 @@ "end": 1789, "name": "tag", "source": 1, - "value": "74" + "value": "72" }, { "begin": 1669, "end": 1789, "name": "JUMPDEST", "source": 1 }, { @@ -13633,7 +13709,7 @@ "end": 1764, "name": "PUSH [tag]", "source": 1, - "value": "148" + "value": "146" }, { "begin": 1758, "end": 1763, "name": "DUP2", "source": 1 }, { @@ -13641,7 +13717,7 @@ "end": 1764, "name": "PUSH [tag]", "source": 1, - "value": "73" + "value": "71" }, { "begin": 1741, @@ -13655,7 +13731,7 @@ "end": 1764, "name": "tag", "source": 1, - "value": "148" + "value": "146" }, { "begin": 1741, "end": 1764, "name": "JUMPDEST", "source": 1 }, { "begin": 1734, "end": 1739, "name": "DUP2", "source": 1 }, @@ -13665,7 +13741,7 @@ "end": 1783, "name": "PUSH [tag]", "source": 1, - "value": "149" + "value": "147" }, { "begin": 1721, "end": 1783, "name": "JUMPI", "source": 1 }, { @@ -13682,7 +13758,7 @@ "end": 1783, "name": "tag", "source": 1, - "value": "149" + "value": "147" }, { "begin": 1721, "end": 1783, "name": "JUMPDEST", "source": 1 }, { "begin": 1669, "end": 1789, "name": "POP", "source": 1 }, @@ -13698,7 +13774,7 @@ "end": 1932, "name": "tag", "source": 1, - "value": "75" + "value": "73" }, { "begin": 1795, "end": 1932, "name": "JUMPDEST", "source": 1 }, { @@ -13722,7 +13798,7 @@ "end": 1926, "name": "PUSH [tag]", "source": 1, - "value": "151" + "value": "149" }, { "begin": 1920, "end": 1925, "name": "DUP2", "source": 1 }, { @@ -13730,7 +13806,7 @@ "end": 1926, "name": "PUSH [tag]", "source": 1, - "value": "74" + "value": "72" }, { "begin": 1894, @@ -13744,7 +13820,7 @@ "end": 1926, "name": "tag", "source": 1, - "value": "151" + "value": "149" }, { "begin": 1894, "end": 1926, "name": "JUMPDEST", "source": 1 }, { "begin": 1795, "end": 1932, "name": "SWAP3", "source": 1 }, @@ -13763,7 +13839,7 @@ "end": 2055, "name": "tag", "source": 1, - "value": "76" + "value": "74" }, { "begin": 1938, "end": 2055, "name": "JUMPDEST", "source": 1 }, { @@ -13780,7 +13856,7 @@ "end": 2178, "name": "tag", "source": 1, - "value": "77" + "value": "75" }, { "begin": 2061, "end": 2178, "name": "JUMPDEST", "source": 1 }, { @@ -13797,7 +13873,7 @@ "end": 2286, "name": "tag", "source": 1, - "value": "78" + "value": "76" }, { "begin": 2184, "end": 2286, "name": "JUMPDEST", "source": 1 }, { @@ -13842,7 +13918,7 @@ "end": 2472, "name": "tag", "source": 1, - "value": "79" + "value": "77" }, { "begin": 2292, "end": 2472, "name": "JUMPDEST", "source": 1 }, { @@ -13895,7 +13971,7 @@ "end": 2759, "name": "tag", "source": 1, - "value": "80" + "value": "78" }, { "begin": 2478, "end": 2759, "name": "JUMPDEST", "source": 1 }, { @@ -13903,7 +13979,7 @@ "end": 2588, "name": "PUSH [tag]", "source": 1, - "value": "157" + "value": "155" }, { "begin": 2583, "end": 2587, "name": "DUP3", "source": 1 }, { @@ -13911,7 +13987,7 @@ "end": 2588, "name": "PUSH [tag]", "source": 1, - "value": "78" + "value": "76" }, { "begin": 2561, @@ -13925,7 +14001,7 @@ "end": 2588, "name": "tag", "source": 1, - "value": "157" + "value": "155" }, { "begin": 2561, "end": 2588, "name": "JUMPDEST", "source": 1 }, { "begin": 2553, "end": 2559, "name": "DUP2", "source": 1 }, @@ -13949,7 +14025,7 @@ "end": 2722, "name": "PUSH [tag]", "source": 1, - "value": "158" + "value": "156" }, { "begin": 2634, "end": 2722, "name": "JUMPI", "source": 1 }, { @@ -13957,14 +14033,14 @@ "end": 2720, "name": "PUSH [tag]", "source": 1, - "value": "159" + "value": "157" }, { "begin": 2702, "end": 2720, "name": "PUSH [tag]", "source": 1, - "value": "79" + "value": "77" }, { "begin": 2702, @@ -13978,7 +14054,7 @@ "end": 2720, "name": "tag", "source": 1, - "value": "159" + "value": "157" }, { "begin": 2702, "end": 2720, "name": "JUMPDEST", "source": 1 }, { @@ -13986,7 +14062,7 @@ "end": 2722, "name": "tag", "source": 1, - "value": "158" + "value": "156" }, { "begin": 2634, "end": 2722, "name": "JUMPDEST", "source": 1 }, { "begin": 2742, "end": 2752, "name": "DUP1", "source": 1 }, @@ -14013,7 +14089,7 @@ "end": 2894, "name": "tag", "source": 1, - "value": "81" + "value": "79" }, { "begin": 2765, "end": 2894, "name": "JUMPDEST", "source": 1 }, { @@ -14028,14 +14104,14 @@ "end": 2846, "name": "PUSH [tag]", "source": 1, - "value": "161" + "value": "159" }, { "begin": 2826, "end": 2846, "name": "PUSH [tag]", "source": 1, - "value": "60" + "value": "58" }, { "begin": 2826, @@ -14049,7 +14125,7 @@ "end": 2846, "name": "tag", "source": 1, - "value": "161" + "value": "159" }, { "begin": 2826, "end": 2846, "name": "JUMPDEST", "source": 1 }, { "begin": 2816, "end": 2846, "name": "SWAP1", "source": 1 }, @@ -14059,7 +14135,7 @@ "end": 2888, "name": "PUSH [tag]", "source": 1, - "value": "162" + "value": "160" }, { "begin": 2883, "end": 2887, "name": "DUP3", "source": 1 }, { "begin": 2875, "end": 2881, "name": "DUP3", "source": 1 }, @@ -14068,7 +14144,7 @@ "end": 2888, "name": "PUSH [tag]", "source": 1, - "value": "80" + "value": "78" }, { "begin": 2855, @@ -14082,7 +14158,7 @@ "end": 2888, "name": "tag", "source": 1, - "value": "162" + "value": "160" }, { "begin": 2855, "end": 2888, "name": "JUMPDEST", "source": 1 }, { "begin": 2765, "end": 2894, "name": "SWAP2", "source": 1 }, @@ -14100,7 +14176,7 @@ "end": 3207, "name": "tag", "source": 1, - "value": "82" + "value": "80" }, { "begin": 2900, "end": 3207, "name": "JUMPDEST", "source": 1 }, { @@ -14125,7 +14201,7 @@ "end": 3093, "name": "PUSH [tag]", "source": 1, - "value": "164" + "value": "162" }, { "begin": 3037, "end": 3093, "name": "JUMPI", "source": 1 }, { @@ -14133,14 +14209,14 @@ "end": 3091, "name": "PUSH [tag]", "source": 1, - "value": "165" + "value": "163" }, { "begin": 3073, "end": 3091, "name": "PUSH [tag]", "source": 1, - "value": "79" + "value": "77" }, { "begin": 3073, @@ -14154,7 +14230,7 @@ "end": 3091, "name": "tag", "source": 1, - "value": "165" + "value": "163" }, { "begin": 3073, "end": 3091, "name": "JUMPDEST", "source": 1 }, { @@ -14162,7 +14238,7 @@ "end": 3093, "name": "tag", "source": 1, - "value": "164" + "value": "162" }, { "begin": 3037, "end": 3093, "name": "JUMPDEST", "source": 1 }, { @@ -14170,7 +14246,7 @@ "end": 3140, "name": "PUSH [tag]", "source": 1, - "value": "166" + "value": "164" }, { "begin": 3133, "end": 3139, "name": "DUP3", "source": 1 }, { @@ -14178,7 +14254,7 @@ "end": 3140, "name": "PUSH [tag]", "source": 1, - "value": "78" + "value": "76" }, { "begin": 3111, @@ -14192,7 +14268,7 @@ "end": 3140, "name": "tag", "source": 1, - "value": "166" + "value": "164" }, { "begin": 3111, "end": 3140, "name": "JUMPDEST", "source": 1 }, { "begin": 3103, "end": 3140, "name": "SWAP1", "source": 1 }, @@ -14223,7 +14299,7 @@ "end": 3367, "name": "tag", "source": 1, - "value": "83" + "value": "81" }, { "begin": 3213, "end": 3367, "name": "JUMPDEST", "source": 1 }, { "begin": 3297, "end": 3303, "name": "DUP3", "source": 1 }, @@ -14261,7 +14337,7 @@ "end": 3783, "name": "tag", "source": 1, - "value": "84" + "value": "82" }, { "begin": 3373, "end": 3783, "name": "JUMPDEST", "source": 1 }, { @@ -14276,14 +14352,14 @@ "end": 3540, "name": "PUSH [tag]", "source": 1, - "value": "169" + "value": "167" }, { "begin": 3491, "end": 3539, "name": "PUSH [tag]", "source": 1, - "value": "170" + "value": "168" }, { "begin": 3532, "end": 3538, "name": "DUP5", "source": 1 }, { @@ -14291,7 +14367,7 @@ "end": 3539, "name": "PUSH [tag]", "source": 1, - "value": "82" + "value": "80" }, { "begin": 3491, @@ -14305,7 +14381,7 @@ "end": 3539, "name": "tag", "source": 1, - "value": "170" + "value": "168" }, { "begin": 3491, "end": 3539, "name": "JUMPDEST", "source": 1 }, { @@ -14313,7 +14389,7 @@ "end": 3540, "name": "PUSH [tag]", "source": 1, - "value": "81" + "value": "79" }, { "begin": 3475, @@ -14327,7 +14403,7 @@ "end": 3540, "name": "tag", "source": 1, - "value": "169" + "value": "167" }, { "begin": 3475, "end": 3540, "name": "JUMPDEST", "source": 1 }, { "begin": 3466, "end": 3540, "name": "SWAP1", "source": 1 }, @@ -14355,7 +14431,7 @@ "end": 3727, "name": "PUSH [tag]", "source": 1, - "value": "171" + "value": "169" }, { "begin": 3615, "end": 3727, "name": "JUMPI", "source": 1 }, { @@ -14363,14 +14439,14 @@ "end": 3725, "name": "PUSH [tag]", "source": 1, - "value": "172" + "value": "170" }, { "begin": 3646, "end": 3725, "name": "PUSH [tag]", "source": 1, - "value": "77" + "value": "75" }, { "begin": 3646, @@ -14384,7 +14460,7 @@ "end": 3725, "name": "tag", "source": 1, - "value": "172" + "value": "170" }, { "begin": 3646, "end": 3725, "name": "JUMPDEST", "source": 1 }, { @@ -14392,7 +14468,7 @@ "end": 3727, "name": "tag", "source": 1, - "value": "171" + "value": "169" }, { "begin": 3615, "end": 3727, "name": "JUMPDEST", "source": 1 }, { @@ -14400,7 +14476,7 @@ "end": 3777, "name": "PUSH [tag]", "source": 1, - "value": "173" + "value": "171" }, { "begin": 3770, "end": 3776, "name": "DUP5", "source": 1 }, { "begin": 3765, "end": 3768, "name": "DUP3", "source": 1 }, @@ -14410,7 +14486,7 @@ "end": 3777, "name": "PUSH [tag]", "source": 1, - "value": "83" + "value": "81" }, { "begin": 3736, @@ -14424,7 +14500,7 @@ "end": 3777, "name": "tag", "source": 1, - "value": "173" + "value": "171" }, { "begin": 3736, "end": 3777, "name": "JUMPDEST", "source": 1 }, { "begin": 3456, "end": 3783, "name": "POP", "source": 1 }, @@ -14445,7 +14521,7 @@ "end": 4140, "name": "tag", "source": 1, - "value": "85" + "value": "83" }, { "begin": 3802, "end": 4140, "name": "JUMPDEST", "source": 1 }, { @@ -14471,7 +14547,7 @@ "end": 3995, "name": "PUSH [tag]", "source": 1, - "value": "175" + "value": "173" }, { "begin": 3873, "end": 3995, "name": "JUMPI", "source": 1 }, { @@ -14479,14 +14555,14 @@ "end": 3993, "name": "PUSH [tag]", "source": 1, - "value": "176" + "value": "174" }, { "begin": 3914, "end": 3993, "name": "PUSH [tag]", "source": 1, - "value": "76" + "value": "74" }, { "begin": 3914, @@ -14500,7 +14576,7 @@ "end": 3993, "name": "tag", "source": 1, - "value": "176" + "value": "174" }, { "begin": 3914, "end": 3993, "name": "JUMPDEST", "source": 1 }, { @@ -14508,7 +14584,7 @@ "end": 3995, "name": "tag", "source": 1, - "value": "175" + "value": "173" }, { "begin": 3873, "end": 3995, "name": "JUMPDEST", "source": 1 }, { "begin": 4031, "end": 4037, "name": "DUP2", "source": 1 }, @@ -14523,7 +14599,7 @@ "end": 4134, "name": "PUSH [tag]", "source": 1, - "value": "177" + "value": "175" }, { "begin": 4130, "end": 4133, "name": "DUP5", "source": 1 }, { "begin": 4122, "end": 4128, "name": "DUP3", "source": 1 }, @@ -14541,7 +14617,7 @@ "end": 4134, "name": "PUSH [tag]", "source": 1, - "value": "84" + "value": "82" }, { "begin": 4056, @@ -14555,7 +14631,7 @@ "end": 4134, "name": "tag", "source": 1, - "value": "177" + "value": "175" }, { "begin": 4056, "end": 4134, "name": "JUMPDEST", "source": 1 }, { "begin": 4047, "end": 4134, "name": "SWAP2", "source": 1 }, @@ -14620,7 +14696,7 @@ "end": 4415, "name": "PUSH [tag]", "source": 1, - "value": "179" + "value": "177" }, { "begin": 4295, "end": 4415, "name": "JUMPI", "source": 1 }, { @@ -14628,14 +14704,14 @@ "end": 4413, "name": "PUSH [tag]", "source": 1, - "value": "180" + "value": "178" }, { "begin": 4334, "end": 4413, "name": "PUSH [tag]", "source": 1, - "value": "61" + "value": "59" }, { "begin": 4334, @@ -14649,7 +14725,7 @@ "end": 4413, "name": "tag", "source": 1, - "value": "180" + "value": "178" }, { "begin": 4334, "end": 4413, "name": "JUMPDEST", "source": 1 }, { @@ -14657,7 +14733,7 @@ "end": 4415, "name": "tag", "source": 1, - "value": "179" + "value": "177" }, { "begin": 4295, "end": 4415, "name": "JUMPDEST", "source": 1 }, { @@ -14672,7 +14748,7 @@ "end": 4530, "name": "PUSH [tag]", "source": 1, - "value": "181" + "value": "179" }, { "begin": 4522, "end": 4529, "name": "DUP9", "source": 1 }, { "begin": 4513, "end": 4519, "name": "DUP3", "source": 1 }, @@ -14683,7 +14759,7 @@ "end": 4530, "name": "PUSH [tag]", "source": 1, - "value": "65" + "value": "63" }, { "begin": 4479, @@ -14697,7 +14773,7 @@ "end": 4530, "name": "tag", "source": 1, - "value": "181" + "value": "179" }, { "begin": 4479, "end": 4530, "name": "JUMPDEST", "source": 1 }, { "begin": 4469, "end": 4530, "name": "SWAP6", "source": 1 }, @@ -14715,7 +14791,7 @@ "end": 4657, "name": "PUSH [tag]", "source": 1, - "value": "182" + "value": "180" }, { "begin": 4649, "end": 4656, "name": "DUP9", "source": 1 }, { "begin": 4640, "end": 4646, "name": "DUP3", "source": 1 }, @@ -14726,7 +14802,7 @@ "end": 4657, "name": "PUSH [tag]", "source": 1, - "value": "68" + "value": "66" }, { "begin": 4605, @@ -14740,7 +14816,7 @@ "end": 4657, "name": "tag", "source": 1, - "value": "182" + "value": "180" }, { "begin": 4605, "end": 4657, "name": "JUMPDEST", "source": 1 }, { "begin": 4595, "end": 4657, "name": "SWAP5", "source": 1 }, @@ -14758,7 +14834,7 @@ "end": 4785, "name": "PUSH [tag]", "source": 1, - "value": "183" + "value": "181" }, { "begin": 4777, "end": 4784, "name": "DUP9", "source": 1 }, { "begin": 4768, "end": 4774, "name": "DUP3", "source": 1 }, @@ -14769,7 +14845,7 @@ "end": 4785, "name": "PUSH [tag]", "source": 1, - "value": "72" + "value": "70" }, { "begin": 4732, @@ -14783,7 +14859,7 @@ "end": 4785, "name": "tag", "source": 1, - "value": "183" + "value": "181" }, { "begin": 4732, "end": 4785, "name": "JUMPDEST", "source": 1 }, { "begin": 4722, "end": 4785, "name": "SWAP4", "source": 1 }, @@ -14801,7 +14877,7 @@ "end": 4912, "name": "PUSH [tag]", "source": 1, - "value": "184" + "value": "182" }, { "begin": 4904, "end": 4911, "name": "DUP9", "source": 1 }, { "begin": 4895, "end": 4901, "name": "DUP3", "source": 1 }, @@ -14812,7 +14888,7 @@ "end": 4912, "name": "PUSH [tag]", "source": 1, - "value": "75" + "value": "73" }, { "begin": 4860, @@ -14826,7 +14902,7 @@ "end": 4912, "name": "tag", "source": 1, - "value": "184" + "value": "182" }, { "begin": 4860, "end": 4912, "name": "JUMPDEST", "source": 1 }, { "begin": 4850, "end": 4912, "name": "SWAP3", "source": 1 }, @@ -14862,7 +14938,7 @@ "end": 5124, "name": "PUSH [tag]", "source": 1, - "value": "185" + "value": "183" }, { "begin": 5007, "end": 5124, "name": "JUMPI", "source": 1 }, { @@ -14870,14 +14946,14 @@ "end": 5122, "name": "PUSH [tag]", "source": 1, - "value": "186" + "value": "184" }, { "begin": 5043, "end": 5122, "name": "PUSH [tag]", "source": 1, - "value": "62" + "value": "60" }, { "begin": 5043, @@ -14891,7 +14967,7 @@ "end": 5122, "name": "tag", "source": 1, - "value": "186" + "value": "184" }, { "begin": 5043, "end": 5122, "name": "JUMPDEST", "source": 1 }, { @@ -14899,7 +14975,7 @@ "end": 5124, "name": "tag", "source": 1, - "value": "185" + "value": "183" }, { "begin": 5007, "end": 5124, "name": "JUMPDEST", "source": 1 }, { @@ -14907,7 +14983,7 @@ "end": 5210, "name": "PUSH [tag]", "source": 1, - "value": "187" + "value": "185" }, { "begin": 5202, "end": 5209, "name": "DUP9", "source": 1 }, { "begin": 5193, "end": 5199, "name": "DUP3", "source": 1 }, @@ -14918,7 +14994,7 @@ "end": 5210, "name": "PUSH [tag]", "source": 1, - "value": "85" + "value": "83" }, { "begin": 5148, @@ -14932,7 +15008,7 @@ "end": 5210, "name": "tag", "source": 1, - "value": "187" + "value": "185" }, { "begin": 5148, "end": 5210, "name": "JUMPDEST", "source": 1 }, { "begin": 5138, "end": 5210, "name": "SWAP2", "source": 1 }, @@ -14958,7 +15034,7 @@ "end": 5293, "name": "tag", "source": 1, - "value": "86" + "value": "84" }, { "begin": 5233, "end": 5293, "name": "JUMPDEST", "source": 1 }, { @@ -14986,7 +15062,7 @@ "end": 5441, "name": "tag", "source": 1, - "value": "87" + "value": "85" }, { "begin": 5299, "end": 5441, "name": "JUMPDEST", "source": 1 }, { @@ -15001,21 +15077,21 @@ "end": 5435, "name": "PUSH [tag]", "source": 1, - "value": "190" + "value": "188" }, { "begin": 5400, "end": 5434, "name": "PUSH [tag]", "source": 1, - "value": "191" + "value": "189" }, { "begin": 5409, "end": 5433, "name": "PUSH [tag]", "source": 1, - "value": "192" + "value": "190" }, { "begin": 5427, "end": 5432, "name": "DUP5", "source": 1 }, { @@ -15023,7 +15099,7 @@ "end": 5433, "name": "PUSH [tag]", "source": 1, - "value": "69" + "value": "67" }, { "begin": 5409, @@ -15037,7 +15113,7 @@ "end": 5433, "name": "tag", "source": 1, - "value": "192" + "value": "190" }, { "begin": 5409, "end": 5433, "name": "JUMPDEST", "source": 1 }, { @@ -15045,7 +15121,7 @@ "end": 5434, "name": "PUSH [tag]", "source": 1, - "value": "86" + "value": "84" }, { "begin": 5400, @@ -15059,7 +15135,7 @@ "end": 5434, "name": "tag", "source": 1, - "value": "191" + "value": "189" }, { "begin": 5400, "end": 5434, "name": "JUMPDEST", "source": 1 }, { @@ -15067,7 +15143,7 @@ "end": 5435, "name": "PUSH [tag]", "source": 1, - "value": "69" + "value": "67" }, { "begin": 5382, @@ -15081,7 +15157,7 @@ "end": 5435, "name": "tag", "source": 1, - "value": "190" + "value": "188" }, { "begin": 5382, "end": 5435, "name": "JUMPDEST", "source": 1 }, { "begin": 5369, "end": 5435, "name": "SWAP1", "source": 1 }, @@ -15101,7 +15177,7 @@ "end": 5573, "name": "tag", "source": 1, - "value": "88" + "value": "86" }, { "begin": 5447, "end": 5573, "name": "JUMPDEST", "source": 1 }, { @@ -15116,7 +15192,7 @@ "end": 5567, "name": "PUSH [tag]", "source": 1, - "value": "194" + "value": "192" }, { "begin": 5561, "end": 5566, "name": "DUP3", "source": 1 }, { @@ -15124,7 +15200,7 @@ "end": 5567, "name": "PUSH [tag]", "source": 1, - "value": "87" + "value": "85" }, { "begin": 5530, @@ -15138,7 +15214,7 @@ "end": 5567, "name": "tag", "source": 1, - "value": "194" + "value": "192" }, { "begin": 5530, "end": 5567, "name": "JUMPDEST", "source": 1 }, { "begin": 5517, "end": 5567, "name": "SWAP1", "source": 1 }, @@ -15158,7 +15234,7 @@ "end": 5725, "name": "tag", "source": 1, - "value": "89" + "value": "87" }, { "begin": 5579, "end": 5725, "name": "JUMPDEST", "source": 1 }, { @@ -15173,7 +15249,7 @@ "end": 5719, "name": "PUSH [tag]", "source": 1, - "value": "196" + "value": "194" }, { "begin": 5713, "end": 5718, "name": "DUP3", "source": 1 }, { @@ -15181,7 +15257,7 @@ "end": 5719, "name": "PUSH [tag]", "source": 1, - "value": "88" + "value": "86" }, { "begin": 5682, @@ -15195,7 +15271,7 @@ "end": 5719, "name": "tag", "source": 1, - "value": "196" + "value": "194" }, { "begin": 5682, "end": 5719, "name": "JUMPDEST", "source": 1 }, { "begin": 5669, "end": 5719, "name": "SWAP1", "source": 1 }, @@ -15215,7 +15291,7 @@ "end": 5902, "name": "tag", "source": 1, - "value": "90" + "value": "88" }, { "begin": 5731, "end": 5902, "name": "JUMPDEST", "source": 1 }, { @@ -15223,7 +15299,7 @@ "end": 5895, "name": "PUSH [tag]", "source": 1, - "value": "198" + "value": "196" }, { "begin": 5889, "end": 5894, "name": "DUP2", "source": 1 }, { @@ -15231,7 +15307,7 @@ "end": 5895, "name": "PUSH [tag]", "source": 1, - "value": "89" + "value": "87" }, { "begin": 5838, @@ -15245,7 +15321,7 @@ "end": 5895, "name": "tag", "source": 1, - "value": "198" + "value": "196" }, { "begin": 5838, "end": 5895, "name": "JUMPDEST", "source": 1 }, { "begin": 5833, "end": 5836, "name": "DUP3", "source": 1 }, @@ -15290,7 +15366,7 @@ "end": 6163, "name": "PUSH [tag]", "source": 1, - "value": "200" + "value": "198" }, { "begin": 6160, @@ -15307,7 +15383,7 @@ "end": 6163, "name": "PUSH [tag]", "source": 1, - "value": "90" + "value": "88" }, { "begin": 6072, @@ -15321,7 +15397,7 @@ "end": 6163, "name": "tag", "source": 1, - "value": "200" + "value": "198" }, { "begin": 6072, "end": 6163, "name": "JUMPDEST", "source": 1 }, { "begin": 5908, "end": 6170, "name": "SWAP3", "source": 1 }, @@ -15367,7 +15443,7 @@ "end": 6370, "name": "PUSH [tag]", "source": 1, - "value": "202" + "value": "200" }, { "begin": 6251, "end": 6370, "name": "JUMPI", "source": 1 }, { @@ -15375,14 +15451,14 @@ "end": 6368, "name": "PUSH [tag]", "source": 1, - "value": "203" + "value": "201" }, { "begin": 6289, "end": 6368, "name": "PUSH [tag]", "source": 1, - "value": "61" + "value": "59" }, { "begin": 6289, @@ -15396,7 +15472,7 @@ "end": 6368, "name": "tag", "source": 1, - "value": "203" + "value": "201" }, { "begin": 6289, "end": 6368, "name": "JUMPDEST", "source": 1 }, { @@ -15404,7 +15480,7 @@ "end": 6370, "name": "tag", "source": 1, - "value": "202" + "value": "200" }, { "begin": 6251, "end": 6370, "name": "JUMPDEST", "source": 1 }, { @@ -15419,7 +15495,7 @@ "end": 6486, "name": "PUSH [tag]", "source": 1, - "value": "204" + "value": "202" }, { "begin": 6478, "end": 6485, "name": "DUP5", "source": 1 }, { "begin": 6469, "end": 6475, "name": "DUP3", "source": 1 }, @@ -15430,7 +15506,7 @@ "end": 6486, "name": "PUSH [tag]", "source": 1, - "value": "68" + "value": "66" }, { "begin": 6434, @@ -15444,7 +15520,7 @@ "end": 6486, "name": "tag", "source": 1, - "value": "204" + "value": "202" }, { "begin": 6434, "end": 6486, "name": "JUMPDEST", "source": 1 }, { "begin": 6424, "end": 6486, "name": "SWAP2", "source": 1 }, @@ -15466,7 +15542,7 @@ "end": 6627, "name": "tag", "source": 1, - "value": "91" + "value": "89" }, { "begin": 6509, "end": 6627, "name": "JUMPDEST", "source": 1 }, { @@ -15474,7 +15550,7 @@ "end": 6620, "name": "PUSH [tag]", "source": 1, - "value": "206" + "value": "204" }, { "begin": 6614, "end": 6619, "name": "DUP2", "source": 1 }, { @@ -15482,7 +15558,7 @@ "end": 6620, "name": "PUSH [tag]", "source": 1, - "value": "70" + "value": "68" }, { "begin": 6596, @@ -15496,7 +15572,7 @@ "end": 6620, "name": "tag", "source": 1, - "value": "206" + "value": "204" }, { "begin": 6596, "end": 6620, "name": "JUMPDEST", "source": 1 }, { "begin": 6591, "end": 6594, "name": "DUP3", "source": 1 }, @@ -15541,7 +15617,7 @@ "end": 6848, "name": "PUSH [tag]", "source": 1, - "value": "208" + "value": "206" }, { "begin": 6845, @@ -15558,7 +15634,7 @@ "end": 6848, "name": "PUSH [tag]", "source": 1, - "value": "91" + "value": "89" }, { "begin": 6777, @@ -15572,7 +15648,7 @@ "end": 6848, "name": "tag", "source": 1, - "value": "208" + "value": "206" }, { "begin": 6777, "end": 6848, "name": "JUMPDEST", "source": 1 }, { "begin": 6633, "end": 6855, "name": "SWAP3", "source": 1 }, @@ -15591,7 +15667,7 @@ "end": 6978, "name": "tag", "source": 1, - "value": "92" + "value": "90" }, { "begin": 6861, "end": 6978, "name": "JUMPDEST", "source": 1 }, { @@ -15608,7 +15684,7 @@ "end": 7101, "name": "tag", "source": 1, - "value": "93" + "value": "91" }, { "begin": 6984, "end": 7101, "name": "JUMPDEST", "source": 1 }, { @@ -15625,7 +15701,7 @@ "end": 7427, "name": "tag", "source": 1, - "value": "94" + "value": "92" }, { "begin": 7107, "end": 7427, "name": "JUMPDEST", "source": 1 }, { @@ -15650,7 +15726,7 @@ "end": 7325, "name": "PUSH [tag]", "source": 1, - "value": "212" + "value": "210" }, { "begin": 7269, "end": 7325, "name": "JUMPI", "source": 1 }, { @@ -15658,14 +15734,14 @@ "end": 7323, "name": "PUSH [tag]", "source": 1, - "value": "213" + "value": "211" }, { "begin": 7305, "end": 7323, "name": "PUSH [tag]", "source": 1, - "value": "79" + "value": "77" }, { "begin": 7305, @@ -15679,7 +15755,7 @@ "end": 7323, "name": "tag", "source": 1, - "value": "213" + "value": "211" }, { "begin": 7305, "end": 7323, "name": "JUMPDEST", "source": 1 }, { @@ -15687,7 +15763,7 @@ "end": 7325, "name": "tag", "source": 1, - "value": "212" + "value": "210" }, { "begin": 7269, "end": 7325, "name": "JUMPDEST", "source": 1 }, { @@ -15727,7 +15803,7 @@ "end": 7550, "name": "tag", "source": 1, - "value": "95" + "value": "93" }, { "begin": 7433, "end": 7550, "name": "JUMPDEST", "source": 1 }, { @@ -15744,7 +15820,7 @@ "end": 8513, "name": "tag", "source": 1, - "value": "96" + "value": "94" }, { "begin": 7571, "end": 8513, "name": "JUMPDEST", "source": 1 }, { @@ -15759,14 +15835,14 @@ "end": 7791, "name": "PUSH [tag]", "source": 1, - "value": "216" + "value": "214" }, { "begin": 7717, "end": 7790, "name": "PUSH [tag]", "source": 1, - "value": "217" + "value": "215" }, { "begin": 7783, "end": 7789, "name": "DUP5", "source": 1 }, { @@ -15774,7 +15850,7 @@ "end": 7790, "name": "PUSH [tag]", "source": 1, - "value": "94" + "value": "92" }, { "begin": 7717, @@ -15788,7 +15864,7 @@ "end": 7790, "name": "tag", "source": 1, - "value": "217" + "value": "215" }, { "begin": 7717, "end": 7790, "name": "JUMPDEST", "source": 1 }, { @@ -15796,7 +15872,7 @@ "end": 7791, "name": "PUSH [tag]", "source": 1, - "value": "81" + "value": "79" }, { "begin": 7701, @@ -15810,7 +15886,7 @@ "end": 7791, "name": "tag", "source": 1, - "value": "216" + "value": "214" }, { "begin": 7701, "end": 7791, "name": "JUMPDEST", "source": 1 }, { "begin": 7692, "end": 7791, "name": "SWAP1", "source": 1 }, @@ -15850,7 +15926,7 @@ "end": 8064, "name": "PUSH [tag]", "source": 1, - "value": "218" + "value": "216" }, { "begin": 7942, "end": 8064, "name": "JUMPI", "source": 1 }, { @@ -15858,14 +15934,14 @@ "end": 8054, "name": "PUSH [tag]", "source": 1, - "value": "219" + "value": "217" }, { "begin": 7975, "end": 8054, "name": "PUSH [tag]", "source": 1, - "value": "95" + "value": "93" }, { "begin": 7975, @@ -15879,7 +15955,7 @@ "end": 8054, "name": "tag", "source": 1, - "value": "219" + "value": "217" }, { "begin": 7975, "end": 8054, "name": "JUMPDEST", "source": 1 }, { @@ -15887,7 +15963,7 @@ "end": 8064, "name": "tag", "source": 1, - "value": "218" + "value": "216" }, { "begin": 7942, "end": 8064, "name": "JUMPDEST", "source": 1 }, { "begin": 8090, "end": 8096, "name": "DUP4", "source": 1 }, @@ -15896,7 +15972,7 @@ "end": 8507, "name": "tag", "source": 1, - "value": "220" + "value": "218" }, { "begin": 8073, "end": 8507, "name": "JUMPDEST", "source": 1 }, { "begin": 8107, "end": 8113, "name": "DUP2", "source": 1 }, @@ -15908,7 +15984,7 @@ "end": 8507, "name": "PUSH [tag]", "source": 1, - "value": "222" + "value": "220" }, { "begin": 8073, "end": 8507, "name": "JUMPI", "source": 1 }, { "begin": 8196, "end": 8199, "name": "DUP1", "source": 1 }, @@ -15933,7 +16009,7 @@ "end": 8335, "name": "PUSH [tag]", "source": 1, - "value": "223" + "value": "221" }, { "begin": 8213, "end": 8335, "name": "JUMPI", "source": 1 }, { @@ -15941,14 +16017,14 @@ "end": 8333, "name": "PUSH [tag]", "source": 1, - "value": "224" + "value": "222" }, { "begin": 8254, "end": 8333, "name": "PUSH [tag]", "source": 1, - "value": "76" + "value": "74" }, { "begin": 8254, @@ -15962,7 +16038,7 @@ "end": 8333, "name": "tag", "source": 1, - "value": "224" + "value": "222" }, { "begin": 8254, "end": 8333, "name": "JUMPDEST", "source": 1 }, { @@ -15970,7 +16046,7 @@ "end": 8335, "name": "tag", "source": 1, - "value": "223" + "value": "221" }, { "begin": 8213, "end": 8335, "name": "JUMPDEST", "source": 1 }, { "begin": 8378, "end": 8389, "name": "DUP1", "source": 1 }, @@ -15981,7 +16057,7 @@ "end": 8462, "name": "PUSH [tag]", "source": 1, - "value": "225" + "value": "223" }, { "begin": 8458, "end": 8461, "name": "DUP10", "source": 1 }, { "begin": 8446, "end": 8456, "name": "DUP3", "source": 1 }, @@ -15990,7 +16066,7 @@ "end": 8462, "name": "PUSH [tag]", "source": 1, - "value": "85" + "value": "83" }, { "begin": 8416, @@ -16004,7 +16080,7 @@ "end": 8462, "name": "tag", "source": 1, - "value": "225" + "value": "223" }, { "begin": 8416, "end": 8462, "name": "JUMPDEST", "source": 1 }, { "begin": 8411, "end": 8414, "name": "DUP6", "source": 1 }, @@ -16038,7 +16114,7 @@ "end": 8507, "name": "PUSH [tag]", "source": 1, - "value": "220" + "value": "218" }, { "begin": 8073, "end": 8507, "name": "JUMP", "source": 1 }, { @@ -16046,7 +16122,7 @@ "end": 8507, "name": "tag", "source": 1, - "value": "222" + "value": "220" }, { "begin": 8073, "end": 8507, "name": "JUMPDEST", "source": 1 }, { "begin": 8077, "end": 8098, "name": "POP", "source": 1 }, @@ -16069,7 +16145,7 @@ "end": 8922, "name": "tag", "source": 1, - "value": "97" + "value": "95" }, { "begin": 8534, "end": 8922, "name": "JUMPDEST", "source": 1 }, { @@ -16095,7 +16171,7 @@ "end": 8752, "name": "PUSH [tag]", "source": 1, - "value": "227" + "value": "225" }, { "begin": 8630, "end": 8752, "name": "JUMPI", "source": 1 }, { @@ -16103,14 +16179,14 @@ "end": 8750, "name": "PUSH [tag]", "source": 1, - "value": "228" + "value": "226" }, { "begin": 8671, "end": 8750, "name": "PUSH [tag]", "source": 1, - "value": "76" + "value": "74" }, { "begin": 8671, @@ -16124,7 +16200,7 @@ "end": 8750, "name": "tag", "source": 1, - "value": "228" + "value": "226" }, { "begin": 8671, "end": 8750, "name": "JUMPDEST", "source": 1 }, { @@ -16132,7 +16208,7 @@ "end": 8752, "name": "tag", "source": 1, - "value": "227" + "value": "225" }, { "begin": 8630, "end": 8752, "name": "JUMPDEST", "source": 1 }, { "begin": 8788, "end": 8794, "name": "DUP2", "source": 1 }, @@ -16147,7 +16223,7 @@ "end": 8916, "name": "PUSH [tag]", "source": 1, - "value": "229" + "value": "227" }, { "begin": 8912, "end": 8915, "name": "DUP5", "source": 1 }, { "begin": 8904, "end": 8910, "name": "DUP3", "source": 1 }, @@ -16165,7 +16241,7 @@ "end": 8916, "name": "PUSH [tag]", "source": 1, - "value": "96" + "value": "94" }, { "begin": 8813, @@ -16179,7 +16255,7 @@ "end": 8916, "name": "tag", "source": 1, - "value": "229" + "value": "227" }, { "begin": 8813, "end": 8916, "name": "JUMPDEST", "source": 1 }, { "begin": 8804, "end": 8916, "name": "SWAP2", "source": 1 }, @@ -16201,7 +16277,7 @@ "end": 9746, "name": "tag", "source": 1, - "value": "98" + "value": "96" }, { "begin": 8970, "end": 9746, "name": "JUMPDEST", "source": 1 }, { @@ -16228,7 +16304,7 @@ "end": 9180, "name": "PUSH [tag]", "source": 1, - "value": "231" + "value": "229" }, { "begin": 9063, "end": 9180, "name": "JUMPI", "source": 1 }, { @@ -16236,14 +16312,14 @@ "end": 9178, "name": "PUSH [tag]", "source": 1, - "value": "232" + "value": "230" }, { "begin": 9099, "end": 9178, "name": "PUSH [tag]", "source": 1, - "value": "92" + "value": "90" }, { "begin": 9099, @@ -16257,7 +16333,7 @@ "end": 9178, "name": "tag", "source": 1, - "value": "232" + "value": "230" }, { "begin": 9099, "end": 9178, "name": "JUMPDEST", "source": 1 }, { @@ -16265,7 +16341,7 @@ "end": 9180, "name": "tag", "source": 1, - "value": "231" + "value": "229" }, { "begin": 9063, "end": 9180, "name": "JUMPDEST", "source": 1 }, { @@ -16273,7 +16349,7 @@ "end": 9219, "name": "PUSH [tag]", "source": 1, - "value": "233" + "value": "231" }, { "begin": 9214, @@ -16287,7 +16363,7 @@ "end": 9219, "name": "PUSH [tag]", "source": 1, - "value": "81" + "value": "79" }, { "begin": 9198, @@ -16301,7 +16377,7 @@ "end": 9219, "name": "tag", "source": 1, - "value": "233" + "value": "231" }, { "begin": 9198, "end": 9219, "name": "JUMPDEST", "source": 1 }, { "begin": 9189, "end": 9219, "name": "SWAP1", "source": 1 }, @@ -16318,7 +16394,7 @@ "end": 9368, "name": "PUSH [tag]", "source": 1, - "value": "234" + "value": "232" }, { "begin": 9364, "end": 9367, "name": "DUP5", "source": 1 }, { "begin": 9355, "end": 9361, "name": "DUP3", "source": 1 }, @@ -16329,7 +16405,7 @@ "end": 9368, "name": "PUSH [tag]", "source": 1, - "value": "65" + "value": "63" }, { "begin": 9321, @@ -16343,7 +16419,7 @@ "end": 9368, "name": "tag", "source": 1, - "value": "234" + "value": "232" }, { "begin": 9321, "end": 9368, "name": "JUMPDEST", "source": 1 }, { @@ -16387,7 +16463,7 @@ "end": 9605, "name": "PUSH [tag]", "source": 1, - "value": "235" + "value": "233" }, { "begin": 9488, "end": 9605, "name": "JUMPI", "source": 1 }, { @@ -16395,14 +16471,14 @@ "end": 9603, "name": "PUSH [tag]", "source": 1, - "value": "236" + "value": "234" }, { "begin": 9524, "end": 9603, "name": "PUSH [tag]", "source": 1, - "value": "93" + "value": "91" }, { "begin": 9524, @@ -16416,7 +16492,7 @@ "end": 9603, "name": "tag", "source": 1, - "value": "236" + "value": "234" }, { "begin": 9524, "end": 9603, "name": "JUMPDEST", "source": 1 }, { @@ -16424,7 +16500,7 @@ "end": 9605, "name": "tag", "source": 1, - "value": "235" + "value": "233" }, { "begin": 9488, "end": 9605, "name": "JUMPDEST", "source": 1 }, { @@ -16432,7 +16508,7 @@ "end": 9727, "name": "PUSH [tag]", "source": 1, - "value": "237" + "value": "235" }, { "begin": 9723, "end": 9726, "name": "DUP5", "source": 1 }, { "begin": 9714, "end": 9720, "name": "DUP3", "source": 1 }, @@ -16443,7 +16519,7 @@ "end": 9727, "name": "PUSH [tag]", "source": 1, - "value": "97" + "value": "95" }, { "begin": 9644, @@ -16457,7 +16533,7 @@ "end": 9727, "name": "tag", "source": 1, - "value": "237" + "value": "235" }, { "begin": 9644, "end": 9727, "name": "JUMPDEST", "source": 1 }, { @@ -16530,7 +16606,7 @@ "end": 10049, "name": "PUSH [tag]", "source": 1, - "value": "239" + "value": "237" }, { "begin": 9929, "end": 10049, "name": "JUMPI", "source": 1 }, { @@ -16538,14 +16614,14 @@ "end": 10047, "name": "PUSH [tag]", "source": 1, - "value": "240" + "value": "238" }, { "begin": 9968, "end": 10047, "name": "PUSH [tag]", "source": 1, - "value": "61" + "value": "59" }, { "begin": 9968, @@ -16559,7 +16635,7 @@ "end": 10047, "name": "tag", "source": 1, - "value": "240" + "value": "238" }, { "begin": 9968, "end": 10047, "name": "JUMPDEST", "source": 1 }, { @@ -16567,7 +16643,7 @@ "end": 10049, "name": "tag", "source": 1, - "value": "239" + "value": "237" }, { "begin": 9929, "end": 10049, "name": "JUMPDEST", "source": 1 }, { @@ -16582,7 +16658,7 @@ "end": 10164, "name": "PUSH [tag]", "source": 1, - "value": "241" + "value": "239" }, { "begin": 10156, "end": 10163, "name": "DUP9", "source": 1 }, { "begin": 10147, "end": 10153, "name": "DUP3", "source": 1 }, @@ -16593,7 +16669,7 @@ "end": 10164, "name": "PUSH [tag]", "source": 1, - "value": "65" + "value": "63" }, { "begin": 10113, @@ -16607,7 +16683,7 @@ "end": 10164, "name": "tag", "source": 1, - "value": "241" + "value": "239" }, { "begin": 10113, "end": 10164, "name": "JUMPDEST", "source": 1 }, { "begin": 10103, "end": 10164, "name": "SWAP6", "source": 1 }, @@ -16625,7 +16701,7 @@ "end": 10291, "name": "PUSH [tag]", "source": 1, - "value": "242" + "value": "240" }, { "begin": 10283, "end": 10290, "name": "DUP9", "source": 1 }, { "begin": 10274, "end": 10280, "name": "DUP3", "source": 1 }, @@ -16636,7 +16712,7 @@ "end": 10291, "name": "PUSH [tag]", "source": 1, - "value": "68" + "value": "66" }, { "begin": 10239, @@ -16650,7 +16726,7 @@ "end": 10291, "name": "tag", "source": 1, - "value": "242" + "value": "240" }, { "begin": 10239, "end": 10291, "name": "JUMPDEST", "source": 1 }, { "begin": 10229, "end": 10291, "name": "SWAP5", "source": 1 }, @@ -16686,7 +16762,7 @@ "end": 10502, "name": "PUSH [tag]", "source": 1, - "value": "243" + "value": "241" }, { "begin": 10385, "end": 10502, "name": "JUMPI", "source": 1 }, { @@ -16694,14 +16770,14 @@ "end": 10500, "name": "PUSH [tag]", "source": 1, - "value": "244" + "value": "242" }, { "begin": 10421, "end": 10500, "name": "PUSH [tag]", "source": 1, - "value": "62" + "value": "60" }, { "begin": 10421, @@ -16715,7 +16791,7 @@ "end": 10500, "name": "tag", "source": 1, - "value": "244" + "value": "242" }, { "begin": 10421, "end": 10500, "name": "JUMPDEST", "source": 1 }, { @@ -16723,7 +16799,7 @@ "end": 10502, "name": "tag", "source": 1, - "value": "243" + "value": "241" }, { "begin": 10385, "end": 10502, "name": "JUMPDEST", "source": 1 }, { @@ -16731,7 +16807,7 @@ "end": 10607, "name": "PUSH [tag]", "source": 1, - "value": "245" + "value": "243" }, { "begin": 10599, "end": 10606, "name": "DUP9", "source": 1 }, { "begin": 10590, "end": 10596, "name": "DUP3", "source": 1 }, @@ -16742,7 +16818,7 @@ "end": 10607, "name": "PUSH [tag]", "source": 1, - "value": "98" + "value": "96" }, { "begin": 10526, @@ -16756,7 +16832,7 @@ "end": 10607, "name": "tag", "source": 1, - "value": "245" + "value": "243" }, { "begin": 10526, "end": 10607, "name": "JUMPDEST", "source": 1 }, { "begin": 10516, "end": 10607, "name": "SWAP4", "source": 1 }, @@ -16774,7 +16850,7 @@ "end": 10734, "name": "PUSH [tag]", "source": 1, - "value": "246" + "value": "244" }, { "begin": 10726, "end": 10733, "name": "DUP9", "source": 1 }, { "begin": 10717, "end": 10723, "name": "DUP3", "source": 1 }, @@ -16785,7 +16861,7 @@ "end": 10734, "name": "PUSH [tag]", "source": 1, - "value": "75" + "value": "73" }, { "begin": 10682, @@ -16799,7 +16875,7 @@ "end": 10734, "name": "tag", "source": 1, - "value": "246" + "value": "244" }, { "begin": 10682, "end": 10734, "name": "JUMPDEST", "source": 1 }, { "begin": 10672, "end": 10734, "name": "SWAP3", "source": 1 }, @@ -16835,7 +16911,7 @@ "end": 10946, "name": "PUSH [tag]", "source": 1, - "value": "247" + "value": "245" }, { "begin": 10829, "end": 10946, "name": "JUMPI", "source": 1 }, { @@ -16843,14 +16919,14 @@ "end": 10944, "name": "PUSH [tag]", "source": 1, - "value": "248" + "value": "246" }, { "begin": 10865, "end": 10944, "name": "PUSH [tag]", "source": 1, - "value": "62" + "value": "60" }, { "begin": 10865, @@ -16864,7 +16940,7 @@ "end": 10944, "name": "tag", "source": 1, - "value": "248" + "value": "246" }, { "begin": 10865, "end": 10944, "name": "JUMPDEST", "source": 1 }, { @@ -16872,7 +16948,7 @@ "end": 10946, "name": "tag", "source": 1, - "value": "247" + "value": "245" }, { "begin": 10829, "end": 10946, "name": "JUMPDEST", "source": 1 }, { @@ -16880,7 +16956,7 @@ "end": 11032, "name": "PUSH [tag]", "source": 1, - "value": "249" + "value": "247" }, { "begin": 11024, "end": 11031, "name": "DUP9", "source": 1 }, { "begin": 11015, "end": 11021, "name": "DUP3", "source": 1 }, @@ -16891,7 +16967,7 @@ "end": 11032, "name": "PUSH [tag]", "source": 1, - "value": "85" + "value": "83" }, { "begin": 10970, @@ -16905,7 +16981,7 @@ "end": 11032, "name": "tag", "source": 1, - "value": "249" + "value": "247" }, { "begin": 10970, "end": 11032, "name": "JUMPDEST", "source": 1 }, { "begin": 10960, "end": 11032, "name": "SWAP2", "source": 1 }, @@ -16958,7 +17034,7 @@ "end": 11278, "name": "PUSH [tag]", "source": 1, - "value": "251" + "value": "249" }, { "begin": 11159, "end": 11278, "name": "JUMPI", "source": 1 }, { @@ -16966,14 +17042,14 @@ "end": 11276, "name": "PUSH [tag]", "source": 1, - "value": "252" + "value": "250" }, { "begin": 11197, "end": 11276, "name": "PUSH [tag]", "source": 1, - "value": "61" + "value": "59" }, { "begin": 11197, @@ -16987,7 +17063,7 @@ "end": 11276, "name": "tag", "source": 1, - "value": "252" + "value": "250" }, { "begin": 11197, "end": 11276, "name": "JUMPDEST", "source": 1 }, { @@ -16995,7 +17071,7 @@ "end": 11278, "name": "tag", "source": 1, - "value": "251" + "value": "249" }, { "begin": 11159, "end": 11278, "name": "JUMPDEST", "source": 1 }, { @@ -17028,7 +17104,7 @@ "end": 11478, "name": "PUSH [tag]", "source": 1, - "value": "253" + "value": "251" }, { "begin": 11361, "end": 11478, "name": "JUMPI", "source": 1 }, { @@ -17036,14 +17112,14 @@ "end": 11476, "name": "PUSH [tag]", "source": 1, - "value": "254" + "value": "252" }, { "begin": 11397, "end": 11476, "name": "PUSH [tag]", "source": 1, - "value": "62" + "value": "60" }, { "begin": 11397, @@ -17057,7 +17133,7 @@ "end": 11476, "name": "tag", "source": 1, - "value": "254" + "value": "252" }, { "begin": 11397, "end": 11476, "name": "JUMPDEST", "source": 1 }, { @@ -17065,7 +17141,7 @@ "end": 11478, "name": "tag", "source": 1, - "value": "253" + "value": "251" }, { "begin": 11361, "end": 11478, "name": "JUMPDEST", "source": 1 }, { @@ -17073,7 +17149,7 @@ "end": 11583, "name": "PUSH [tag]", "source": 1, - "value": "255" + "value": "253" }, { "begin": 11575, "end": 11582, "name": "DUP5", "source": 1 }, { "begin": 11566, "end": 11572, "name": "DUP3", "source": 1 }, @@ -17084,7 +17160,7 @@ "end": 11583, "name": "PUSH [tag]", "source": 1, - "value": "98" + "value": "96" }, { "begin": 11502, @@ -17098,7 +17174,7 @@ "end": 11583, "name": "tag", "source": 1, - "value": "255" + "value": "253" }, { "begin": 11502, "end": 11583, "name": "JUMPDEST", "source": 1 }, { "begin": 11492, "end": 11583, "name": "SWAP2", "source": 1 }, @@ -17117,125 +17193,125 @@ }, { "begin": 11606, - "end": 11683, + "end": 11721, "name": "tag", "source": 1, - "value": "99" + "value": "97" }, - { "begin": 11606, "end": 11683, "name": "JUMPDEST", "source": 1 }, + { "begin": 11606, "end": 11721, "name": "JUMPDEST", "source": 1 }, { - "begin": 11643, - "end": 11650, - "name": "PUSH", + "begin": 11691, + "end": 11714, + "name": "PUSH [tag]", "source": 1, - "value": "0" + "value": "255" }, - { "begin": 11672, "end": 11677, "name": "DUP2", "source": 1 }, - { "begin": 11661, "end": 11677, "name": "SWAP1", "source": 1 }, - { "begin": 11661, "end": 11677, "name": "POP", "source": 1 }, - { "begin": 11606, "end": 11683, "name": "SWAP2", "source": 1 }, - { "begin": 11606, "end": 11683, "name": "SWAP1", "source": 1 }, - { "begin": 11606, "end": 11683, "name": "POP", "source": 1 }, + { "begin": 11708, "end": 11713, "name": "DUP2", "source": 1 }, { - "begin": 11606, - "end": 11683, - "name": "JUMP", + "begin": 11691, + "end": 11714, + "name": "PUSH [tag]", "source": 1, - "value": "[out]" + "value": "71" }, { - "begin": 11689, - "end": 11807, - "name": "tag", + "begin": 11691, + "end": 11714, + "name": "JUMP", "source": 1, - "value": "100" + "value": "[in]" }, - { "begin": 11689, "end": 11807, "name": "JUMPDEST", "source": 1 }, { - "begin": 11776, - "end": 11800, - "name": "PUSH [tag]", + "begin": 11691, + "end": 11714, + "name": "tag", "source": 1, - "value": "258" + "value": "255" }, - { "begin": 11794, "end": 11799, "name": "DUP2", "source": 1 }, + { "begin": 11691, "end": 11714, "name": "JUMPDEST", "source": 1 }, + { "begin": 11686, "end": 11689, "name": "DUP3", "source": 1 }, + { "begin": 11679, "end": 11715, "name": "MSTORE", "source": 1 }, + { "begin": 11606, "end": 11721, "name": "POP", "source": 1 }, + { "begin": 11606, "end": 11721, "name": "POP", "source": 1 }, { - "begin": 11776, - "end": 11800, - "name": "PUSH [tag]", + "begin": 11606, + "end": 11721, + "name": "JUMP", "source": 1, - "value": "99" + "value": "[out]" }, { - "begin": 11776, - "end": 11800, - "name": "JUMP", + "begin": 11727, + "end": 11804, + "name": "tag", "source": 1, - "value": "[in]" + "value": "98" }, + { "begin": 11727, "end": 11804, "name": "JUMPDEST", "source": 1 }, { - "begin": 11776, - "end": 11800, - "name": "tag", + "begin": 11764, + "end": 11771, + "name": "PUSH", "source": 1, - "value": "258" + "value": "0" }, - { "begin": 11776, "end": 11800, "name": "JUMPDEST", "source": 1 }, - { "begin": 11771, "end": 11774, "name": "DUP3", "source": 1 }, - { "begin": 11764, "end": 11801, "name": "MSTORE", "source": 1 }, - { "begin": 11689, "end": 11807, "name": "POP", "source": 1 }, - { "begin": 11689, "end": 11807, "name": "POP", "source": 1 }, + { "begin": 11793, "end": 11798, "name": "DUP2", "source": 1 }, + { "begin": 11782, "end": 11798, "name": "SWAP1", "source": 1 }, + { "begin": 11782, "end": 11798, "name": "POP", "source": 1 }, + { "begin": 11727, "end": 11804, "name": "SWAP2", "source": 1 }, + { "begin": 11727, "end": 11804, "name": "SWAP1", "source": 1 }, + { "begin": 11727, "end": 11804, "name": "POP", "source": 1 }, { - "begin": 11689, - "end": 11807, + "begin": 11727, + "end": 11804, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 11813, + "begin": 11810, "end": 11928, "name": "tag", "source": 1, - "value": "101" + "value": "99" }, - { "begin": 11813, "end": 11928, "name": "JUMPDEST", "source": 1 }, + { "begin": 11810, "end": 11928, "name": "JUMPDEST", "source": 1 }, { - "begin": 11898, + "begin": 11897, "end": 11921, "name": "PUSH [tag]", "source": 1, - "value": "260" + "value": "258" }, { "begin": 11915, "end": 11920, "name": "DUP2", "source": 1 }, { - "begin": 11898, + "begin": 11897, "end": 11921, "name": "PUSH [tag]", "source": 1, - "value": "73" + "value": "98" }, { - "begin": 11898, + "begin": 11897, "end": 11921, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 11898, + "begin": 11897, "end": 11921, "name": "tag", "source": 1, - "value": "260" + "value": "258" }, - { "begin": 11898, "end": 11921, "name": "JUMPDEST", "source": 1 }, - { "begin": 11893, "end": 11896, "name": "DUP3", "source": 1 }, - { "begin": 11886, "end": 11922, "name": "MSTORE", "source": 1 }, - { "begin": 11813, "end": 11928, "name": "POP", "source": 1 }, - { "begin": 11813, "end": 11928, "name": "POP", "source": 1 }, + { "begin": 11897, "end": 11921, "name": "JUMPDEST", "source": 1 }, + { "begin": 11892, "end": 11895, "name": "DUP3", "source": 1 }, + { "begin": 11885, "end": 11922, "name": "MSTORE", "source": 1 }, + { "begin": 11810, "end": 11928, "name": "POP", "source": 1 }, + { "begin": 11810, "end": 11928, "name": "POP", "source": 1 }, { - "begin": 11813, + "begin": 11810, "end": 11928, "name": "JUMP", "source": 1, @@ -17243,2645 +17319,2735 @@ }, { "begin": 11934, - "end": 12262, + "end": 12368, "name": "tag", "source": 1, "value": "31" }, - { "begin": 11934, "end": 12262, "name": "JUMPDEST", "source": 1 }, + { "begin": 11934, "end": 12368, "name": "JUMPDEST", "source": 1 }, { - "begin": 12053, - "end": 12057, + "begin": 12079, + "end": 12083, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 12091, - "end": 12093, + "begin": 12117, + "end": 12119, "name": "PUSH", "source": 1, - "value": "40" + "value": "60" }, - { "begin": 12080, "end": 12089, "name": "DUP3", "source": 1 }, - { "begin": 12076, "end": 12094, "name": "ADD", "source": 1 }, - { "begin": 12068, "end": 12094, "name": "SWAP1", "source": 1 }, - { "begin": 12068, "end": 12094, "name": "POP", "source": 1 }, + { "begin": 12106, "end": 12115, "name": "DUP3", "source": 1 }, + { "begin": 12102, "end": 12120, "name": "ADD", "source": 1 }, + { "begin": 12094, "end": 12120, "name": "SWAP1", "source": 1 }, + { "begin": 12094, "end": 12120, "name": "POP", "source": 1 }, { - "begin": 12104, - "end": 12175, + "begin": 12130, + "end": 12199, "name": "PUSH [tag]", "source": 1, - "value": "262" + "value": "260" }, { - "begin": 12172, - "end": 12173, + "begin": 12196, + "end": 12197, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 12161, "end": 12170, "name": "DUP4", "source": 1 }, - { "begin": 12157, "end": 12174, "name": "ADD", "source": 1 }, - { "begin": 12148, "end": 12154, "name": "DUP6", "source": 1 }, + { "begin": 12185, "end": 12194, "name": "DUP4", "source": 1 }, + { "begin": 12181, "end": 12198, "name": "ADD", "source": 1 }, + { "begin": 12172, "end": 12178, "name": "DUP7", "source": 1 }, { - "begin": 12104, - "end": 12175, + "begin": 12130, + "end": 12199, "name": "PUSH [tag]", "source": 1, - "value": "100" + "value": "97" }, { - "begin": 12104, - "end": 12175, + "begin": 12130, + "end": 12199, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 12104, - "end": 12175, + "begin": 12130, + "end": 12199, "name": "tag", "source": 1, - "value": "262" + "value": "260" }, - { "begin": 12104, "end": 12175, "name": "JUMPDEST", "source": 1 }, + { "begin": 12130, "end": 12199, "name": "JUMPDEST", "source": 1 }, { - "begin": 12185, - "end": 12255, + "begin": 12209, + "end": 12281, "name": "PUSH [tag]", "source": 1, - "value": "263" + "value": "261" }, { - "begin": 12251, - "end": 12253, + "begin": 12277, + "end": 12279, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 12240, "end": 12249, "name": "DUP4", "source": 1 }, - { "begin": 12236, "end": 12254, "name": "ADD", "source": 1 }, - { "begin": 12227, "end": 12233, "name": "DUP5", "source": 1 }, + { "begin": 12266, "end": 12275, "name": "DUP4", "source": 1 }, + { "begin": 12262, "end": 12280, "name": "ADD", "source": 1 }, + { "begin": 12253, "end": 12259, "name": "DUP6", "source": 1 }, { - "begin": 12185, - "end": 12255, + "begin": 12209, + "end": 12281, "name": "PUSH [tag]", "source": 1, - "value": "101" + "value": "99" + }, + { + "begin": 12209, + "end": 12281, + "name": "JUMP", + "source": 1, + "value": "[in]" + }, + { + "begin": 12209, + "end": 12281, + "name": "tag", + "source": 1, + "value": "261" + }, + { "begin": 12209, "end": 12281, "name": "JUMPDEST", "source": 1 }, + { + "begin": 12291, + "end": 12361, + "name": "PUSH [tag]", + "source": 1, + "value": "262" + }, + { + "begin": 12357, + "end": 12359, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { "begin": 12346, "end": 12355, "name": "DUP4", "source": 1 }, + { "begin": 12342, "end": 12360, "name": "ADD", "source": 1 }, + { "begin": 12333, "end": 12339, "name": "DUP5", "source": 1 }, + { + "begin": 12291, + "end": 12361, + "name": "PUSH [tag]", + "source": 1, + "value": "97" }, { - "begin": 12185, - "end": 12255, + "begin": 12291, + "end": 12361, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 12185, - "end": 12255, + "begin": 12291, + "end": 12361, "name": "tag", "source": 1, - "value": "263" + "value": "262" }, - { "begin": 12185, "end": 12255, "name": "JUMPDEST", "source": 1 }, - { "begin": 11934, "end": 12262, "name": "SWAP4", "source": 1 }, - { "begin": 11934, "end": 12262, "name": "SWAP3", "source": 1 }, - { "begin": 11934, "end": 12262, "name": "POP", "source": 1 }, - { "begin": 11934, "end": 12262, "name": "POP", "source": 1 }, - { "begin": 11934, "end": 12262, "name": "POP", "source": 1 }, + { "begin": 12291, "end": 12361, "name": "JUMPDEST", "source": 1 }, + { "begin": 11934, "end": 12368, "name": "SWAP5", "source": 1 }, + { "begin": 11934, "end": 12368, "name": "SWAP4", "source": 1 }, + { "begin": 11934, "end": 12368, "name": "POP", "source": 1 }, + { "begin": 11934, "end": 12368, "name": "POP", "source": 1 }, + { "begin": 11934, "end": 12368, "name": "POP", "source": 1 }, + { "begin": 11934, "end": 12368, "name": "POP", "source": 1 }, { "begin": 11934, - "end": 12262, + "end": 12368, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 12268, - "end": 12380, + "begin": 12374, + "end": 12486, "name": "tag", "source": 1, - "value": "102" + "value": "100" }, - { "begin": 12268, "end": 12380, "name": "JUMPDEST", "source": 1 }, + { "begin": 12374, "end": 12486, "name": "JUMPDEST", "source": 1 }, { - "begin": 12351, - "end": 12373, + "begin": 12457, + "end": 12479, "name": "PUSH [tag]", "source": 1, - "value": "265" + "value": "264" }, - { "begin": 12367, "end": 12372, "name": "DUP2", "source": 1 }, + { "begin": 12473, "end": 12478, "name": "DUP2", "source": 1 }, { - "begin": 12351, - "end": 12373, + "begin": 12457, + "end": 12479, "name": "PUSH [tag]", "source": 1, - "value": "63" + "value": "61" }, { - "begin": 12351, - "end": 12373, + "begin": 12457, + "end": 12479, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 12351, - "end": 12373, + "begin": 12457, + "end": 12479, "name": "tag", "source": 1, - "value": "265" + "value": "264" }, - { "begin": 12351, "end": 12373, "name": "JUMPDEST", "source": 1 }, - { "begin": 12346, "end": 12349, "name": "DUP3", "source": 1 }, - { "begin": 12339, "end": 12374, "name": "MSTORE", "source": 1 }, - { "begin": 12268, "end": 12380, "name": "POP", "source": 1 }, - { "begin": 12268, "end": 12380, "name": "POP", "source": 1 }, + { "begin": 12457, "end": 12479, "name": "JUMPDEST", "source": 1 }, + { "begin": 12452, "end": 12455, "name": "DUP3", "source": 1 }, + { "begin": 12445, "end": 12480, "name": "MSTORE", "source": 1 }, + { "begin": 12374, "end": 12486, "name": "POP", "source": 1 }, + { "begin": 12374, "end": 12486, "name": "POP", "source": 1 }, { - "begin": 12268, - "end": 12380, + "begin": 12374, + "end": 12486, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 12386, - "end": 12501, + "begin": 12492, + "end": 12607, "name": "tag", "source": 1, - "value": "103" + "value": "101" }, - { "begin": 12386, "end": 12501, "name": "JUMPDEST", "source": 1 }, + { "begin": 12492, "end": 12607, "name": "JUMPDEST", "source": 1 }, { - "begin": 12471, - "end": 12494, + "begin": 12577, + "end": 12600, "name": "PUSH [tag]", "source": 1, - "value": "267" + "value": "266" }, - { "begin": 12488, "end": 12493, "name": "DUP2", "source": 1 }, + { "begin": 12594, "end": 12599, "name": "DUP2", "source": 1 }, { - "begin": 12471, - "end": 12494, + "begin": 12577, + "end": 12600, "name": "PUSH [tag]", "source": 1, - "value": "66" + "value": "64" }, { - "begin": 12471, - "end": 12494, + "begin": 12577, + "end": 12600, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 12471, - "end": 12494, + "begin": 12577, + "end": 12600, "name": "tag", "source": 1, - "value": "267" + "value": "266" }, - { "begin": 12471, "end": 12494, "name": "JUMPDEST", "source": 1 }, - { "begin": 12466, "end": 12469, "name": "DUP3", "source": 1 }, - { "begin": 12459, "end": 12495, "name": "MSTORE", "source": 1 }, - { "begin": 12386, "end": 12501, "name": "POP", "source": 1 }, - { "begin": 12386, "end": 12501, "name": "POP", "source": 1 }, + { "begin": 12577, "end": 12600, "name": "JUMPDEST", "source": 1 }, + { "begin": 12572, "end": 12575, "name": "DUP3", "source": 1 }, + { "begin": 12565, "end": 12601, "name": "MSTORE", "source": 1 }, + { "begin": 12492, "end": 12607, "name": "POP", "source": 1 }, + { "begin": 12492, "end": 12607, "name": "POP", "source": 1 }, { - "begin": 12386, - "end": 12501, + "begin": 12492, + "end": 12607, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 12507, - "end": 12605, + "begin": 12613, + "end": 12711, "name": "tag", "source": 1, - "value": "104" + "value": "102" }, - { "begin": 12507, "end": 12605, "name": "JUMPDEST", "source": 1 }, + { "begin": 12613, "end": 12711, "name": "JUMPDEST", "source": 1 }, { - "begin": 12558, - "end": 12564, + "begin": 12664, + "end": 12670, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 12592, "end": 12597, "name": "DUP2", "source": 1 }, - { "begin": 12586, "end": 12598, "name": "MLOAD", "source": 1 }, - { "begin": 12576, "end": 12598, "name": "SWAP1", "source": 1 }, - { "begin": 12576, "end": 12598, "name": "POP", "source": 1 }, - { "begin": 12507, "end": 12605, "name": "SWAP2", "source": 1 }, - { "begin": 12507, "end": 12605, "name": "SWAP1", "source": 1 }, - { "begin": 12507, "end": 12605, "name": "POP", "source": 1 }, + { "begin": 12698, "end": 12703, "name": "DUP2", "source": 1 }, + { "begin": 12692, "end": 12704, "name": "MLOAD", "source": 1 }, + { "begin": 12682, "end": 12704, "name": "SWAP1", "source": 1 }, + { "begin": 12682, "end": 12704, "name": "POP", "source": 1 }, + { "begin": 12613, "end": 12711, "name": "SWAP2", "source": 1 }, + { "begin": 12613, "end": 12711, "name": "SWAP1", "source": 1 }, + { "begin": 12613, "end": 12711, "name": "POP", "source": 1 }, { - "begin": 12507, - "end": 12605, + "begin": 12613, + "end": 12711, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 12611, - "end": 12779, + "begin": 12717, + "end": 12885, "name": "tag", "source": 1, - "value": "105" + "value": "103" }, - { "begin": 12611, "end": 12779, "name": "JUMPDEST", "source": 1 }, + { "begin": 12717, "end": 12885, "name": "JUMPDEST", "source": 1 }, { - "begin": 12694, - "end": 12705, + "begin": 12800, + "end": 12811, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 12728, "end": 12734, "name": "DUP3", "source": 1 }, - { "begin": 12723, "end": 12726, "name": "DUP3", "source": 1 }, - { "begin": 12716, "end": 12735, "name": "MSTORE", "source": 1 }, + { "begin": 12834, "end": 12840, "name": "DUP3", "source": 1 }, + { "begin": 12829, "end": 12832, "name": "DUP3", "source": 1 }, + { "begin": 12822, "end": 12841, "name": "MSTORE", "source": 1 }, { - "begin": 12768, - "end": 12772, + "begin": 12874, + "end": 12878, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 12763, "end": 12766, "name": "DUP3", "source": 1 }, - { "begin": 12759, "end": 12773, "name": "ADD", "source": 1 }, - { "begin": 12744, "end": 12773, "name": "SWAP1", "source": 1 }, - { "begin": 12744, "end": 12773, "name": "POP", "source": 1 }, - { "begin": 12611, "end": 12779, "name": "SWAP3", "source": 1 }, - { "begin": 12611, "end": 12779, "name": "SWAP2", "source": 1 }, - { "begin": 12611, "end": 12779, "name": "POP", "source": 1 }, - { "begin": 12611, "end": 12779, "name": "POP", "source": 1 }, - { - "begin": 12611, - "end": 12779, + { "begin": 12869, "end": 12872, "name": "DUP3", "source": 1 }, + { "begin": 12865, "end": 12879, "name": "ADD", "source": 1 }, + { "begin": 12850, "end": 12879, "name": "SWAP1", "source": 1 }, + { "begin": 12850, "end": 12879, "name": "POP", "source": 1 }, + { "begin": 12717, "end": 12885, "name": "SWAP3", "source": 1 }, + { "begin": 12717, "end": 12885, "name": "SWAP2", "source": 1 }, + { "begin": 12717, "end": 12885, "name": "POP", "source": 1 }, + { "begin": 12717, "end": 12885, "name": "POP", "source": 1 }, + { + "begin": 12717, + "end": 12885, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 12785, - "end": 13092, + "begin": 12891, + "end": 13198, "name": "tag", "source": 1, - "value": "106" + "value": "104" }, - { "begin": 12785, "end": 13092, "name": "JUMPDEST", "source": 1 }, + { "begin": 12891, "end": 13198, "name": "JUMPDEST", "source": 1 }, { - "begin": 12853, - "end": 12854, + "begin": 12959, + "end": 12960, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 12863, - "end": 12976, + "begin": 12969, + "end": 13082, "name": "tag", "source": 1, - "value": "271" + "value": "270" }, - { "begin": 12863, "end": 12976, "name": "JUMPDEST", "source": 1 }, - { "begin": 12877, "end": 12883, "name": "DUP4", "source": 1 }, - { "begin": 12874, "end": 12875, "name": "DUP2", "source": 1 }, - { "begin": 12871, "end": 12884, "name": "LT", "source": 1 }, - { "begin": 12863, "end": 12976, "name": "ISZERO", "source": 1 }, + { "begin": 12969, "end": 13082, "name": "JUMPDEST", "source": 1 }, + { "begin": 12983, "end": 12989, "name": "DUP4", "source": 1 }, + { "begin": 12980, "end": 12981, "name": "DUP2", "source": 1 }, + { "begin": 12977, "end": 12990, "name": "LT", "source": 1 }, + { "begin": 12969, "end": 13082, "name": "ISZERO", "source": 1 }, { - "begin": 12863, - "end": 12976, + "begin": 12969, + "end": 13082, "name": "PUSH [tag]", "source": 1, - "value": "273" + "value": "272" }, - { "begin": 12863, "end": 12976, "name": "JUMPI", "source": 1 }, - { "begin": 12962, "end": 12963, "name": "DUP1", "source": 1 }, - { "begin": 12957, "end": 12960, "name": "DUP3", "source": 1 }, - { "begin": 12953, "end": 12964, "name": "ADD", "source": 1 }, - { "begin": 12947, "end": 12965, "name": "MLOAD", "source": 1 }, - { "begin": 12943, "end": 12944, "name": "DUP2", "source": 1 }, - { "begin": 12938, "end": 12941, "name": "DUP5", "source": 1 }, - { "begin": 12934, "end": 12945, "name": "ADD", "source": 1 }, - { "begin": 12927, "end": 12966, "name": "MSTORE", "source": 1 }, + { "begin": 12969, "end": 13082, "name": "JUMPI", "source": 1 }, + { "begin": 13068, "end": 13069, "name": "DUP1", "source": 1 }, + { "begin": 13063, "end": 13066, "name": "DUP3", "source": 1 }, + { "begin": 13059, "end": 13070, "name": "ADD", "source": 1 }, + { "begin": 13053, "end": 13071, "name": "MLOAD", "source": 1 }, + { "begin": 13049, "end": 13050, "name": "DUP2", "source": 1 }, + { "begin": 13044, "end": 13047, "name": "DUP5", "source": 1 }, + { "begin": 13040, "end": 13051, "name": "ADD", "source": 1 }, + { "begin": 13033, "end": 13072, "name": "MSTORE", "source": 1 }, { - "begin": 12899, - "end": 12901, + "begin": 13005, + "end": 13007, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 12896, "end": 12897, "name": "DUP2", "source": 1 }, - { "begin": 12892, "end": 12902, "name": "ADD", "source": 1 }, - { "begin": 12887, "end": 12902, "name": "SWAP1", "source": 1 }, - { "begin": 12887, "end": 12902, "name": "POP", "source": 1 }, + { "begin": 13002, "end": 13003, "name": "DUP2", "source": 1 }, + { "begin": 12998, "end": 13008, "name": "ADD", "source": 1 }, + { "begin": 12993, "end": 13008, "name": "SWAP1", "source": 1 }, + { "begin": 12993, "end": 13008, "name": "POP", "source": 1 }, { - "begin": 12863, - "end": 12976, + "begin": 12969, + "end": 13082, "name": "PUSH [tag]", "source": 1, - "value": "271" + "value": "270" }, - { "begin": 12863, "end": 12976, "name": "JUMP", "source": 1 }, + { "begin": 12969, "end": 13082, "name": "JUMP", "source": 1 }, { - "begin": 12863, - "end": 12976, + "begin": 12969, + "end": 13082, "name": "tag", "source": 1, - "value": "273" + "value": "272" }, - { "begin": 12863, "end": 12976, "name": "JUMPDEST", "source": 1 }, - { "begin": 12994, "end": 13000, "name": "DUP4", "source": 1 }, - { "begin": 12991, "end": 12992, "name": "DUP2", "source": 1 }, - { "begin": 12988, "end": 13001, "name": "GT", "source": 1 }, - { "begin": 12985, "end": 13086, "name": "ISZERO", "source": 1 }, + { "begin": 12969, "end": 13082, "name": "JUMPDEST", "source": 1 }, + { "begin": 13100, "end": 13106, "name": "DUP4", "source": 1 }, + { "begin": 13097, "end": 13098, "name": "DUP2", "source": 1 }, + { "begin": 13094, "end": 13107, "name": "GT", "source": 1 }, + { "begin": 13091, "end": 13192, "name": "ISZERO", "source": 1 }, { - "begin": 12985, - "end": 13086, + "begin": 13091, + "end": 13192, "name": "PUSH [tag]", "source": 1, - "value": "274" + "value": "273" }, - { "begin": 12985, "end": 13086, "name": "JUMPI", "source": 1 }, + { "begin": 13091, "end": 13192, "name": "JUMPI", "source": 1 }, { - "begin": 13074, - "end": 13075, + "begin": 13180, + "end": 13181, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 13065, "end": 13071, "name": "DUP5", "source": 1 }, - { "begin": 13060, "end": 13063, "name": "DUP5", "source": 1 }, - { "begin": 13056, "end": 13072, "name": "ADD", "source": 1 }, - { "begin": 13049, "end": 13076, "name": "MSTORE", "source": 1 }, + { "begin": 13171, "end": 13177, "name": "DUP5", "source": 1 }, + { "begin": 13166, "end": 13169, "name": "DUP5", "source": 1 }, + { "begin": 13162, "end": 13178, "name": "ADD", "source": 1 }, + { "begin": 13155, "end": 13182, "name": "MSTORE", "source": 1 }, { - "begin": 12985, - "end": 13086, + "begin": 13091, + "end": 13192, "name": "tag", "source": 1, - "value": "274" + "value": "273" }, - { "begin": 12985, "end": 13086, "name": "JUMPDEST", "source": 1 }, - { "begin": 12834, "end": 13092, "name": "POP", "source": 1 }, - { "begin": 12785, "end": 13092, "name": "POP", "source": 1 }, - { "begin": 12785, "end": 13092, "name": "POP", "source": 1 }, - { "begin": 12785, "end": 13092, "name": "POP", "source": 1 }, + { "begin": 13091, "end": 13192, "name": "JUMPDEST", "source": 1 }, + { "begin": 12940, "end": 13198, "name": "POP", "source": 1 }, + { "begin": 12891, "end": 13198, "name": "POP", "source": 1 }, + { "begin": 12891, "end": 13198, "name": "POP", "source": 1 }, + { "begin": 12891, "end": 13198, "name": "POP", "source": 1 }, { - "begin": 12785, - "end": 13092, + "begin": 12891, + "end": 13198, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 13098, - "end": 13458, + "begin": 13204, + "end": 13564, "name": "tag", "source": 1, - "value": "107" + "value": "105" }, - { "begin": 13098, "end": 13458, "name": "JUMPDEST", "source": 1 }, + { "begin": 13204, "end": 13564, "name": "JUMPDEST", "source": 1 }, { - "begin": 13184, - "end": 13187, + "begin": 13290, + "end": 13293, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 13212, - "end": 13250, + "begin": 13318, + "end": 13356, "name": "PUSH [tag]", "source": 1, - "value": "276" + "value": "275" }, - { "begin": 13244, "end": 13249, "name": "DUP3", "source": 1 }, + { "begin": 13350, "end": 13355, "name": "DUP3", "source": 1 }, { - "begin": 13212, - "end": 13250, + "begin": 13318, + "end": 13356, "name": "PUSH [tag]", "source": 1, - "value": "104" + "value": "102" }, { - "begin": 13212, - "end": 13250, + "begin": 13318, + "end": 13356, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 13212, - "end": 13250, + "begin": 13318, + "end": 13356, "name": "tag", "source": 1, - "value": "276" + "value": "275" }, - { "begin": 13212, "end": 13250, "name": "JUMPDEST", "source": 1 }, + { "begin": 13318, "end": 13356, "name": "JUMPDEST", "source": 1 }, { - "begin": 13266, - "end": 13336, + "begin": 13372, + "end": 13442, "name": "PUSH [tag]", "source": 1, - "value": "277" + "value": "276" }, - { "begin": 13329, "end": 13335, "name": "DUP2", "source": 1 }, - { "begin": 13324, "end": 13327, "name": "DUP6", "source": 1 }, + { "begin": 13435, "end": 13441, "name": "DUP2", "source": 1 }, + { "begin": 13430, "end": 13433, "name": "DUP6", "source": 1 }, { - "begin": 13266, - "end": 13336, + "begin": 13372, + "end": 13442, "name": "PUSH [tag]", "source": 1, - "value": "105" + "value": "103" }, { - "begin": 13266, - "end": 13336, + "begin": 13372, + "end": 13442, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 13266, - "end": 13336, + "begin": 13372, + "end": 13442, "name": "tag", "source": 1, - "value": "277" + "value": "276" }, - { "begin": 13266, "end": 13336, "name": "JUMPDEST", "source": 1 }, - { "begin": 13259, "end": 13336, "name": "SWAP4", "source": 1 }, - { "begin": 13259, "end": 13336, "name": "POP", "source": 1 }, + { "begin": 13372, "end": 13442, "name": "JUMPDEST", "source": 1 }, + { "begin": 13365, "end": 13442, "name": "SWAP4", "source": 1 }, + { "begin": 13365, "end": 13442, "name": "POP", "source": 1 }, { - "begin": 13345, - "end": 13397, + "begin": 13451, + "end": 13503, "name": "PUSH [tag]", "source": 1, - "value": "278" + "value": "277" }, - { "begin": 13390, "end": 13396, "name": "DUP2", "source": 1 }, - { "begin": 13385, "end": 13388, "name": "DUP6", "source": 1 }, + { "begin": 13496, "end": 13502, "name": "DUP2", "source": 1 }, + { "begin": 13491, "end": 13494, "name": "DUP6", "source": 1 }, { - "begin": 13378, - "end": 13382, + "begin": 13484, + "end": 13488, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 13371, "end": 13376, "name": "DUP7", "source": 1 }, - { "begin": 13367, "end": 13383, "name": "ADD", "source": 1 }, + { "begin": 13477, "end": 13482, "name": "DUP7", "source": 1 }, + { "begin": 13473, "end": 13489, "name": "ADD", "source": 1 }, { - "begin": 13345, - "end": 13397, + "begin": 13451, + "end": 13503, "name": "PUSH [tag]", "source": 1, - "value": "106" + "value": "104" }, { - "begin": 13345, - "end": 13397, + "begin": 13451, + "end": 13503, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 13345, - "end": 13397, + "begin": 13451, + "end": 13503, "name": "tag", "source": 1, - "value": "278" + "value": "277" }, - { "begin": 13345, "end": 13397, "name": "JUMPDEST", "source": 1 }, + { "begin": 13451, "end": 13503, "name": "JUMPDEST", "source": 1 }, { - "begin": 13422, - "end": 13451, + "begin": 13528, + "end": 13557, "name": "PUSH [tag]", "source": 1, - "value": "279" + "value": "278" }, - { "begin": 13444, "end": 13450, "name": "DUP2", "source": 1 }, + { "begin": 13550, "end": 13556, "name": "DUP2", "source": 1 }, { - "begin": 13422, - "end": 13451, + "begin": 13528, + "end": 13557, "name": "PUSH [tag]", "source": 1, - "value": "78" + "value": "76" }, { - "begin": 13422, - "end": 13451, + "begin": 13528, + "end": 13557, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 13422, - "end": 13451, + "begin": 13528, + "end": 13557, "name": "tag", "source": 1, - "value": "279" - }, - { "begin": 13422, "end": 13451, "name": "JUMPDEST", "source": 1 }, - { "begin": 13417, "end": 13420, "name": "DUP5", "source": 1 }, - { "begin": 13413, "end": 13452, "name": "ADD", "source": 1 }, - { "begin": 13406, "end": 13452, "name": "SWAP2", "source": 1 }, - { "begin": 13406, "end": 13452, "name": "POP", "source": 1 }, - { "begin": 13188, "end": 13458, "name": "POP", "source": 1 }, - { "begin": 13098, "end": 13458, "name": "SWAP3", "source": 1 }, - { "begin": 13098, "end": 13458, "name": "SWAP2", "source": 1 }, - { "begin": 13098, "end": 13458, "name": "POP", "source": 1 }, - { "begin": 13098, "end": 13458, "name": "POP", "source": 1 }, - { - "begin": 13098, - "end": 13458, + "value": "278" + }, + { "begin": 13528, "end": 13557, "name": "JUMPDEST", "source": 1 }, + { "begin": 13523, "end": 13526, "name": "DUP5", "source": 1 }, + { "begin": 13519, "end": 13558, "name": "ADD", "source": 1 }, + { "begin": 13512, "end": 13558, "name": "SWAP2", "source": 1 }, + { "begin": 13512, "end": 13558, "name": "POP", "source": 1 }, + { "begin": 13294, "end": 13564, "name": "POP", "source": 1 }, + { "begin": 13204, "end": 13564, "name": "SWAP3", "source": 1 }, + { "begin": 13204, "end": 13564, "name": "SWAP2", "source": 1 }, + { "begin": 13204, "end": 13564, "name": "POP", "source": 1 }, + { "begin": 13204, "end": 13564, "name": "POP", "source": 1 }, + { + "begin": 13204, + "end": 13564, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 13464, - "end": 14199, + "begin": 13570, + "end": 14305, "name": "tag", "source": 1, "value": "34" }, - { "begin": 13464, "end": 14199, "name": "JUMPDEST", "source": 1 }, + { "begin": 13570, "end": 14305, "name": "JUMPDEST", "source": 1 }, { - "begin": 13679, - "end": 13683, + "begin": 13785, + "end": 13789, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 13717, - "end": 13720, + "begin": 13823, + "end": 13826, "name": "PUSH", "source": 1, "value": "A0" }, - { "begin": 13706, "end": 13715, "name": "DUP3", "source": 1 }, - { "begin": 13702, "end": 13721, "name": "ADD", "source": 1 }, - { "begin": 13694, "end": 13721, "name": "SWAP1", "source": 1 }, - { "begin": 13694, "end": 13721, "name": "POP", "source": 1 }, + { "begin": 13812, "end": 13821, "name": "DUP3", "source": 1 }, + { "begin": 13808, "end": 13827, "name": "ADD", "source": 1 }, + { "begin": 13800, "end": 13827, "name": "SWAP1", "source": 1 }, + { "begin": 13800, "end": 13827, "name": "POP", "source": 1 }, { - "begin": 13731, - "end": 13798, + "begin": 13837, + "end": 13904, "name": "PUSH [tag]", "source": 1, - "value": "281" + "value": "280" }, { - "begin": 13795, - "end": 13796, + "begin": 13901, + "end": 13902, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 13784, "end": 13793, "name": "DUP4", "source": 1 }, - { "begin": 13780, "end": 13797, "name": "ADD", "source": 1 }, - { "begin": 13771, "end": 13777, "name": "DUP9", "source": 1 }, + { "begin": 13890, "end": 13899, "name": "DUP4", "source": 1 }, + { "begin": 13886, "end": 13903, "name": "ADD", "source": 1 }, + { "begin": 13877, "end": 13883, "name": "DUP9", "source": 1 }, { - "begin": 13731, - "end": 13798, + "begin": 13837, + "end": 13904, "name": "PUSH [tag]", "source": 1, - "value": "102" + "value": "100" }, { - "begin": 13731, - "end": 13798, + "begin": 13837, + "end": 13904, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 13731, - "end": 13798, + "begin": 13837, + "end": 13904, "name": "tag", "source": 1, - "value": "281" + "value": "280" }, - { "begin": 13731, "end": 13798, "name": "JUMPDEST", "source": 1 }, + { "begin": 13837, "end": 13904, "name": "JUMPDEST", "source": 1 }, { - "begin": 13808, - "end": 13878, + "begin": 13914, + "end": 13984, "name": "PUSH [tag]", "source": 1, - "value": "282" + "value": "281" }, { - "begin": 13874, - "end": 13876, + "begin": 13980, + "end": 13982, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 13863, "end": 13872, "name": "DUP4", "source": 1 }, - { "begin": 13859, "end": 13877, "name": "ADD", "source": 1 }, - { "begin": 13850, "end": 13856, "name": "DUP8", "source": 1 }, + { "begin": 13969, "end": 13978, "name": "DUP4", "source": 1 }, + { "begin": 13965, "end": 13983, "name": "ADD", "source": 1 }, + { "begin": 13956, "end": 13962, "name": "DUP8", "source": 1 }, { - "begin": 13808, - "end": 13878, + "begin": 13914, + "end": 13984, "name": "PUSH [tag]", "source": 1, - "value": "103" + "value": "101" }, { - "begin": 13808, - "end": 13878, + "begin": 13914, + "end": 13984, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 13808, - "end": 13878, + "begin": 13914, + "end": 13984, "name": "tag", "source": 1, - "value": "282" + "value": "281" }, - { "begin": 13808, "end": 13878, "name": "JUMPDEST", "source": 1 }, + { "begin": 13914, "end": 13984, "name": "JUMPDEST", "source": 1 }, { - "begin": 13888, - "end": 13960, + "begin": 13994, + "end": 14066, "name": "PUSH [tag]", "source": 1, - "value": "283" + "value": "282" }, { - "begin": 13956, - "end": 13958, + "begin": 14062, + "end": 14064, "name": "PUSH", "source": 1, "value": "40" }, - { "begin": 13945, "end": 13954, "name": "DUP4", "source": 1 }, - { "begin": 13941, "end": 13959, "name": "ADD", "source": 1 }, - { "begin": 13932, "end": 13938, "name": "DUP7", "source": 1 }, + { "begin": 14051, "end": 14060, "name": "DUP4", "source": 1 }, + { "begin": 14047, "end": 14065, "name": "ADD", "source": 1 }, + { "begin": 14038, "end": 14044, "name": "DUP7", "source": 1 }, { - "begin": 13888, - "end": 13960, + "begin": 13994, + "end": 14066, "name": "PUSH [tag]", "source": 1, - "value": "91" + "value": "89" }, { - "begin": 13888, - "end": 13960, + "begin": 13994, + "end": 14066, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 13888, - "end": 13960, + "begin": 13994, + "end": 14066, "name": "tag", "source": 1, - "value": "283" + "value": "282" }, - { "begin": 13888, "end": 13960, "name": "JUMPDEST", "source": 1 }, + { "begin": 13994, "end": 14066, "name": "JUMPDEST", "source": 1 }, { - "begin": 13970, - "end": 14040, + "begin": 14076, + "end": 14146, "name": "PUSH [tag]", "source": 1, - "value": "284" + "value": "283" }, { - "begin": 14036, - "end": 14038, + "begin": 14142, + "end": 14144, "name": "PUSH", "source": 1, "value": "60" }, - { "begin": 14025, "end": 14034, "name": "DUP4", "source": 1 }, - { "begin": 14021, "end": 14039, "name": "ADD", "source": 1 }, - { "begin": 14012, "end": 14018, "name": "DUP6", "source": 1 }, + { "begin": 14131, "end": 14140, "name": "DUP4", "source": 1 }, + { "begin": 14127, "end": 14145, "name": "ADD", "source": 1 }, + { "begin": 14118, "end": 14124, "name": "DUP6", "source": 1 }, { - "begin": 13970, - "end": 14040, + "begin": 14076, + "end": 14146, "name": "PUSH [tag]", "source": 1, - "value": "101" + "value": "97" }, { - "begin": 13970, - "end": 14040, + "begin": 14076, + "end": 14146, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 13970, - "end": 14040, + "begin": 14076, + "end": 14146, "name": "tag", "source": 1, - "value": "284" + "value": "283" }, - { "begin": 13970, "end": 14040, "name": "JUMPDEST", "source": 1 }, - { "begin": 14088, "end": 14097, "name": "DUP2", "source": 1 }, - { "begin": 14082, "end": 14086, "name": "DUP2", "source": 1 }, - { "begin": 14078, "end": 14098, "name": "SUB", "source": 1 }, + { "begin": 14076, "end": 14146, "name": "JUMPDEST", "source": 1 }, + { "begin": 14194, "end": 14203, "name": "DUP2", "source": 1 }, + { "begin": 14188, "end": 14192, "name": "DUP2", "source": 1 }, + { "begin": 14184, "end": 14204, "name": "SUB", "source": 1 }, { - "begin": 14072, - "end": 14075, + "begin": 14178, + "end": 14181, "name": "PUSH", "source": 1, "value": "80" }, - { "begin": 14061, "end": 14070, "name": "DUP4", "source": 1 }, - { "begin": 14057, "end": 14076, "name": "ADD", "source": 1 }, - { "begin": 14050, "end": 14099, "name": "MSTORE", "source": 1 }, + { "begin": 14167, "end": 14176, "name": "DUP4", "source": 1 }, + { "begin": 14163, "end": 14182, "name": "ADD", "source": 1 }, + { "begin": 14156, "end": 14205, "name": "MSTORE", "source": 1 }, { - "begin": 14116, - "end": 14192, + "begin": 14222, + "end": 14298, "name": "PUSH [tag]", "source": 1, - "value": "285" + "value": "284" }, - { "begin": 14187, "end": 14191, "name": "DUP2", "source": 1 }, - { "begin": 14178, "end": 14184, "name": "DUP5", "source": 1 }, + { "begin": 14293, "end": 14297, "name": "DUP2", "source": 1 }, + { "begin": 14284, "end": 14290, "name": "DUP5", "source": 1 }, { - "begin": 14116, - "end": 14192, + "begin": 14222, + "end": 14298, "name": "PUSH [tag]", "source": 1, - "value": "107" + "value": "105" }, { - "begin": 14116, - "end": 14192, + "begin": 14222, + "end": 14298, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 14116, - "end": 14192, + "begin": 14222, + "end": 14298, "name": "tag", "source": 1, - "value": "285" - }, - { "begin": 14116, "end": 14192, "name": "JUMPDEST", "source": 1 }, - { "begin": 14108, "end": 14192, "name": "SWAP1", "source": 1 }, - { "begin": 14108, "end": 14192, "name": "POP", "source": 1 }, - { "begin": 13464, "end": 14199, "name": "SWAP7", "source": 1 }, - { "begin": 13464, "end": 14199, "name": "SWAP6", "source": 1 }, - { "begin": 13464, "end": 14199, "name": "POP", "source": 1 }, - { "begin": 13464, "end": 14199, "name": "POP", "source": 1 }, - { "begin": 13464, "end": 14199, "name": "POP", "source": 1 }, - { "begin": 13464, "end": 14199, "name": "POP", "source": 1 }, - { "begin": 13464, "end": 14199, "name": "POP", "source": 1 }, - { "begin": 13464, "end": 14199, "name": "POP", "source": 1 }, - { - "begin": 13464, - "end": 14199, + "value": "284" + }, + { "begin": 14222, "end": 14298, "name": "JUMPDEST", "source": 1 }, + { "begin": 14214, "end": 14298, "name": "SWAP1", "source": 1 }, + { "begin": 14214, "end": 14298, "name": "POP", "source": 1 }, + { "begin": 13570, "end": 14305, "name": "SWAP7", "source": 1 }, + { "begin": 13570, "end": 14305, "name": "SWAP6", "source": 1 }, + { "begin": 13570, "end": 14305, "name": "POP", "source": 1 }, + { "begin": 13570, "end": 14305, "name": "POP", "source": 1 }, + { "begin": 13570, "end": 14305, "name": "POP", "source": 1 }, + { "begin": 13570, "end": 14305, "name": "POP", "source": 1 }, + { "begin": 13570, "end": 14305, "name": "POP", "source": 1 }, + { "begin": 13570, "end": 14305, "name": "POP", "source": 1 }, + { + "begin": 13570, + "end": 14305, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 14205, - "end": 14423, + "begin": 14311, + "end": 14529, "name": "tag", "source": 1, "value": "40" }, - { "begin": 14205, "end": 14423, "name": "JUMPDEST", "source": 1 }, + { "begin": 14311, "end": 14529, "name": "JUMPDEST", "source": 1 }, { - "begin": 14296, - "end": 14300, + "begin": 14402, + "end": 14406, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 14334, - "end": 14336, + "begin": 14440, + "end": 14442, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 14323, "end": 14332, "name": "DUP3", "source": 1 }, - { "begin": 14319, "end": 14337, "name": "ADD", "source": 1 }, - { "begin": 14311, "end": 14337, "name": "SWAP1", "source": 1 }, - { "begin": 14311, "end": 14337, "name": "POP", "source": 1 }, + { "begin": 14429, "end": 14438, "name": "DUP3", "source": 1 }, + { "begin": 14425, "end": 14443, "name": "ADD", "source": 1 }, + { "begin": 14417, "end": 14443, "name": "SWAP1", "source": 1 }, + { "begin": 14417, "end": 14443, "name": "POP", "source": 1 }, { - "begin": 14347, - "end": 14416, + "begin": 14453, + "end": 14522, "name": "PUSH [tag]", "source": 1, - "value": "287" + "value": "286" }, { - "begin": 14413, - "end": 14414, + "begin": 14519, + "end": 14520, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 14402, "end": 14411, "name": "DUP4", "source": 1 }, - { "begin": 14398, "end": 14415, "name": "ADD", "source": 1 }, - { "begin": 14389, "end": 14395, "name": "DUP5", "source": 1 }, + { "begin": 14508, "end": 14517, "name": "DUP4", "source": 1 }, + { "begin": 14504, "end": 14521, "name": "ADD", "source": 1 }, + { "begin": 14495, "end": 14501, "name": "DUP5", "source": 1 }, { - "begin": 14347, - "end": 14416, + "begin": 14453, + "end": 14522, "name": "PUSH [tag]", "source": 1, - "value": "103" + "value": "101" }, { - "begin": 14347, - "end": 14416, + "begin": 14453, + "end": 14522, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 14347, - "end": 14416, + "begin": 14453, + "end": 14522, "name": "tag", "source": 1, - "value": "287" + "value": "286" }, - { "begin": 14347, "end": 14416, "name": "JUMPDEST", "source": 1 }, - { "begin": 14205, "end": 14423, "name": "SWAP3", "source": 1 }, - { "begin": 14205, "end": 14423, "name": "SWAP2", "source": 1 }, - { "begin": 14205, "end": 14423, "name": "POP", "source": 1 }, - { "begin": 14205, "end": 14423, "name": "POP", "source": 1 }, + { "begin": 14453, "end": 14522, "name": "JUMPDEST", "source": 1 }, + { "begin": 14311, "end": 14529, "name": "SWAP3", "source": 1 }, + { "begin": 14311, "end": 14529, "name": "SWAP2", "source": 1 }, + { "begin": 14311, "end": 14529, "name": "POP", "source": 1 }, + { "begin": 14311, "end": 14529, "name": "POP", "source": 1 }, { - "begin": 14205, - "end": 14423, + "begin": 14311, + "end": 14529, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 14429, - "end": 14572, + "begin": 14535, + "end": 14678, "name": "tag", "source": 1, - "value": "108" + "value": "106" }, - { "begin": 14429, "end": 14572, "name": "JUMPDEST", "source": 1 }, + { "begin": 14535, "end": 14678, "name": "JUMPDEST", "source": 1 }, { - "begin": 14486, - "end": 14491, + "begin": 14592, + "end": 14597, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 14517, "end": 14523, "name": "DUP2", "source": 1 }, - { "begin": 14511, "end": 14524, "name": "MLOAD", "source": 1 }, - { "begin": 14502, "end": 14524, "name": "SWAP1", "source": 1 }, - { "begin": 14502, "end": 14524, "name": "POP", "source": 1 }, + { "begin": 14623, "end": 14629, "name": "DUP2", "source": 1 }, + { "begin": 14617, "end": 14630, "name": "MLOAD", "source": 1 }, + { "begin": 14608, "end": 14630, "name": "SWAP1", "source": 1 }, + { "begin": 14608, "end": 14630, "name": "POP", "source": 1 }, { - "begin": 14533, - "end": 14566, + "begin": 14639, + "end": 14672, "name": "PUSH [tag]", "source": 1, - "value": "289" + "value": "288" }, - { "begin": 14560, "end": 14565, "name": "DUP2", "source": 1 }, + { "begin": 14666, "end": 14671, "name": "DUP2", "source": 1 }, { - "begin": 14533, - "end": 14566, + "begin": 14639, + "end": 14672, "name": "PUSH [tag]", "source": 1, - "value": "71" + "value": "69" }, { - "begin": 14533, - "end": 14566, + "begin": 14639, + "end": 14672, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 14533, - "end": 14566, + "begin": 14639, + "end": 14672, "name": "tag", "source": 1, - "value": "289" + "value": "288" }, - { "begin": 14533, "end": 14566, "name": "JUMPDEST", "source": 1 }, - { "begin": 14429, "end": 14572, "name": "SWAP3", "source": 1 }, - { "begin": 14429, "end": 14572, "name": "SWAP2", "source": 1 }, - { "begin": 14429, "end": 14572, "name": "POP", "source": 1 }, - { "begin": 14429, "end": 14572, "name": "POP", "source": 1 }, + { "begin": 14639, "end": 14672, "name": "JUMPDEST", "source": 1 }, + { "begin": 14535, "end": 14678, "name": "SWAP3", "source": 1 }, + { "begin": 14535, "end": 14678, "name": "SWAP2", "source": 1 }, + { "begin": 14535, "end": 14678, "name": "POP", "source": 1 }, + { "begin": 14535, "end": 14678, "name": "POP", "source": 1 }, { - "begin": 14429, - "end": 14572, + "begin": 14535, + "end": 14678, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 14578, - "end": 14929, + "begin": 14684, + "end": 15035, "name": "tag", "source": 1, - "value": "45" + "value": "44" }, - { "begin": 14578, "end": 14929, "name": "JUMPDEST", "source": 1 }, + { "begin": 14684, "end": 15035, "name": "JUMPDEST", "source": 1 }, { - "begin": 14648, - "end": 14654, + "begin": 14754, + "end": 14760, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 14697, - "end": 14699, + "begin": 14803, + "end": 14805, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 14685, "end": 14694, "name": "DUP3", "source": 1 }, - { "begin": 14676, "end": 14683, "name": "DUP5", "source": 1 }, - { "begin": 14672, "end": 14695, "name": "SUB", "source": 1 }, - { "begin": 14668, "end": 14700, "name": "SLT", "source": 1 }, - { "begin": 14665, "end": 14784, "name": "ISZERO", "source": 1 }, + { "begin": 14791, "end": 14800, "name": "DUP3", "source": 1 }, + { "begin": 14782, "end": 14789, "name": "DUP5", "source": 1 }, + { "begin": 14778, "end": 14801, "name": "SUB", "source": 1 }, + { "begin": 14774, "end": 14806, "name": "SLT", "source": 1 }, + { "begin": 14771, "end": 14890, "name": "ISZERO", "source": 1 }, { - "begin": 14665, - "end": 14784, + "begin": 14771, + "end": 14890, "name": "PUSH [tag]", "source": 1, - "value": "291" + "value": "290" }, - { "begin": 14665, "end": 14784, "name": "JUMPI", "source": 1 }, + { "begin": 14771, "end": 14890, "name": "JUMPI", "source": 1 }, { - "begin": 14703, - "end": 14782, + "begin": 14809, + "end": 14888, "name": "PUSH [tag]", "source": 1, - "value": "292" + "value": "291" }, { - "begin": 14703, - "end": 14782, + "begin": 14809, + "end": 14888, "name": "PUSH [tag]", "source": 1, - "value": "61" + "value": "59" }, { - "begin": 14703, - "end": 14782, + "begin": 14809, + "end": 14888, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 14703, - "end": 14782, + "begin": 14809, + "end": 14888, "name": "tag", "source": 1, - "value": "292" + "value": "291" }, - { "begin": 14703, "end": 14782, "name": "JUMPDEST", "source": 1 }, + { "begin": 14809, "end": 14888, "name": "JUMPDEST", "source": 1 }, { - "begin": 14665, - "end": 14784, + "begin": 14771, + "end": 14890, "name": "tag", "source": 1, - "value": "291" + "value": "290" }, - { "begin": 14665, "end": 14784, "name": "JUMPDEST", "source": 1 }, + { "begin": 14771, "end": 14890, "name": "JUMPDEST", "source": 1 }, { - "begin": 14823, - "end": 14824, + "begin": 14929, + "end": 14930, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 14848, - "end": 14912, + "begin": 14954, + "end": 15018, "name": "PUSH [tag]", "source": 1, - "value": "293" + "value": "292" }, - { "begin": 14904, "end": 14911, "name": "DUP5", "source": 1 }, - { "begin": 14895, "end": 14901, "name": "DUP3", "source": 1 }, - { "begin": 14884, "end": 14893, "name": "DUP6", "source": 1 }, - { "begin": 14880, "end": 14902, "name": "ADD", "source": 1 }, + { "begin": 15010, "end": 15017, "name": "DUP5", "source": 1 }, + { "begin": 15001, "end": 15007, "name": "DUP3", "source": 1 }, + { "begin": 14990, "end": 14999, "name": "DUP6", "source": 1 }, + { "begin": 14986, "end": 15008, "name": "ADD", "source": 1 }, { - "begin": 14848, - "end": 14912, + "begin": 14954, + "end": 15018, "name": "PUSH [tag]", "source": 1, - "value": "108" + "value": "106" }, { - "begin": 14848, - "end": 14912, + "begin": 14954, + "end": 15018, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 14848, - "end": 14912, + "begin": 14954, + "end": 15018, "name": "tag", "source": 1, - "value": "293" + "value": "292" }, - { "begin": 14848, "end": 14912, "name": "JUMPDEST", "source": 1 }, - { "begin": 14838, "end": 14912, "name": "SWAP2", "source": 1 }, - { "begin": 14838, "end": 14912, "name": "POP", "source": 1 }, - { "begin": 14794, "end": 14922, "name": "POP", "source": 1 }, - { "begin": 14578, "end": 14929, "name": "SWAP3", "source": 1 }, - { "begin": 14578, "end": 14929, "name": "SWAP2", "source": 1 }, - { "begin": 14578, "end": 14929, "name": "POP", "source": 1 }, - { "begin": 14578, "end": 14929, "name": "POP", "source": 1 }, - { - "begin": 14578, - "end": 14929, + { "begin": 14954, "end": 15018, "name": "JUMPDEST", "source": 1 }, + { "begin": 14944, "end": 15018, "name": "SWAP2", "source": 1 }, + { "begin": 14944, "end": 15018, "name": "POP", "source": 1 }, + { "begin": 14900, "end": 15028, "name": "POP", "source": 1 }, + { "begin": 14684, "end": 15035, "name": "SWAP3", "source": 1 }, + { "begin": 14684, "end": 15035, "name": "SWAP2", "source": 1 }, + { "begin": 14684, "end": 15035, "name": "POP", "source": 1 }, + { "begin": 14684, "end": 15035, "name": "POP", "source": 1 }, + { + "begin": 14684, + "end": 15035, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 14935, - "end": 15037, + "begin": 15041, + "end": 15143, "name": "tag", "source": 1, - "value": "109" + "value": "107" }, - { "begin": 14935, "end": 15037, "name": "JUMPDEST", "source": 1 }, + { "begin": 15041, "end": 15143, "name": "JUMPDEST", "source": 1 }, { - "begin": 15008, - "end": 15030, + "begin": 15114, + "end": 15136, "name": "PUSH [tag]", "source": 1, - "value": "295" + "value": "294" }, - { "begin": 15024, "end": 15029, "name": "DUP2", "source": 1 }, + { "begin": 15130, "end": 15135, "name": "DUP2", "source": 1 }, { - "begin": 15008, - "end": 15030, + "begin": 15114, + "end": 15136, "name": "PUSH [tag]", "source": 1, - "value": "63" + "value": "61" }, { - "begin": 15008, - "end": 15030, + "begin": 15114, + "end": 15136, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 15008, - "end": 15030, + "begin": 15114, + "end": 15136, "name": "tag", "source": 1, - "value": "295" + "value": "294" }, - { "begin": 15008, "end": 15030, "name": "JUMPDEST", "source": 1 }, - { "begin": 15003, "end": 15006, "name": "DUP3", "source": 1 }, - { "begin": 14996, "end": 15031, "name": "MSTORE", "source": 1 }, - { "begin": 14935, "end": 15037, "name": "POP", "source": 1 }, - { "begin": 14935, "end": 15037, "name": "POP", "source": 1 }, + { "begin": 15114, "end": 15136, "name": "JUMPDEST", "source": 1 }, + { "begin": 15109, "end": 15112, "name": "DUP3", "source": 1 }, + { "begin": 15102, "end": 15137, "name": "MSTORE", "source": 1 }, + { "begin": 15041, "end": 15143, "name": "POP", "source": 1 }, + { "begin": 15041, "end": 15143, "name": "POP", "source": 1 }, { - "begin": 14935, - "end": 15037, + "begin": 15041, + "end": 15143, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 15043, - "end": 15166, + "begin": 15149, + "end": 15272, "name": "tag", "source": 1, - "value": "110" + "value": "108" }, - { "begin": 15043, "end": 15166, "name": "JUMPDEST", "source": 1 }, + { "begin": 15149, "end": 15272, "name": "JUMPDEST", "source": 1 }, { - "begin": 15119, - "end": 15125, + "begin": 15225, + "end": 15231, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 15153, "end": 15158, "name": "DUP2", "source": 1 }, - { "begin": 15147, "end": 15159, "name": "MLOAD", "source": 1 }, - { "begin": 15137, "end": 15159, "name": "SWAP1", "source": 1 }, - { "begin": 15137, "end": 15159, "name": "POP", "source": 1 }, - { "begin": 15043, "end": 15166, "name": "SWAP2", "source": 1 }, - { "begin": 15043, "end": 15166, "name": "SWAP1", "source": 1 }, - { "begin": 15043, "end": 15166, "name": "POP", "source": 1 }, + { "begin": 15259, "end": 15264, "name": "DUP2", "source": 1 }, + { "begin": 15253, "end": 15265, "name": "MLOAD", "source": 1 }, + { "begin": 15243, "end": 15265, "name": "SWAP1", "source": 1 }, + { "begin": 15243, "end": 15265, "name": "POP", "source": 1 }, + { "begin": 15149, "end": 15272, "name": "SWAP2", "source": 1 }, + { "begin": 15149, "end": 15272, "name": "SWAP1", "source": 1 }, + { "begin": 15149, "end": 15272, "name": "POP", "source": 1 }, { - "begin": 15043, - "end": 15166, + "begin": 15149, + "end": 15272, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 15172, - "end": 15355, + "begin": 15278, + "end": 15461, "name": "tag", "source": 1, - "value": "111" + "value": "109" }, - { "begin": 15172, "end": 15355, "name": "JUMPDEST", "source": 1 }, + { "begin": 15278, "end": 15461, "name": "JUMPDEST", "source": 1 }, { - "begin": 15270, - "end": 15281, + "begin": 15376, + "end": 15387, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 15304, "end": 15310, "name": "DUP3", "source": 1 }, - { "begin": 15299, "end": 15302, "name": "DUP3", "source": 1 }, - { "begin": 15292, "end": 15311, "name": "MSTORE", "source": 1 }, + { "begin": 15410, "end": 15416, "name": "DUP3", "source": 1 }, + { "begin": 15405, "end": 15408, "name": "DUP3", "source": 1 }, + { "begin": 15398, "end": 15417, "name": "MSTORE", "source": 1 }, { - "begin": 15344, - "end": 15348, + "begin": 15450, + "end": 15454, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 15339, "end": 15342, "name": "DUP3", "source": 1 }, - { "begin": 15335, "end": 15349, "name": "ADD", "source": 1 }, - { "begin": 15320, "end": 15349, "name": "SWAP1", "source": 1 }, - { "begin": 15320, "end": 15349, "name": "POP", "source": 1 }, - { "begin": 15172, "end": 15355, "name": "SWAP3", "source": 1 }, - { "begin": 15172, "end": 15355, "name": "SWAP2", "source": 1 }, - { "begin": 15172, "end": 15355, "name": "POP", "source": 1 }, - { "begin": 15172, "end": 15355, "name": "POP", "source": 1 }, - { - "begin": 15172, - "end": 15355, + { "begin": 15445, "end": 15448, "name": "DUP3", "source": 1 }, + { "begin": 15441, "end": 15455, "name": "ADD", "source": 1 }, + { "begin": 15426, "end": 15455, "name": "SWAP1", "source": 1 }, + { "begin": 15426, "end": 15455, "name": "POP", "source": 1 }, + { "begin": 15278, "end": 15461, "name": "SWAP3", "source": 1 }, + { "begin": 15278, "end": 15461, "name": "SWAP2", "source": 1 }, + { "begin": 15278, "end": 15461, "name": "POP", "source": 1 }, + { "begin": 15278, "end": 15461, "name": "POP", "source": 1 }, + { + "begin": 15278, + "end": 15461, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 15361, - "end": 15502, + "begin": 15467, + "end": 15608, "name": "tag", "source": 1, - "value": "112" + "value": "110" }, - { "begin": 15361, "end": 15502, "name": "JUMPDEST", "source": 1 }, + { "begin": 15467, "end": 15608, "name": "JUMPDEST", "source": 1 }, { - "begin": 15437, - "end": 15441, + "begin": 15543, + "end": 15547, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 15460, "end": 15463, "name": "DUP2", "source": 1 }, - { "begin": 15452, "end": 15463, "name": "SWAP1", "source": 1 }, - { "begin": 15452, "end": 15463, "name": "POP", "source": 1 }, + { "begin": 15566, "end": 15569, "name": "DUP2", "source": 1 }, + { "begin": 15558, "end": 15569, "name": "SWAP1", "source": 1 }, + { "begin": 15558, "end": 15569, "name": "POP", "source": 1 }, { - "begin": 15490, - "end": 15494, + "begin": 15596, + "end": 15600, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 15485, "end": 15488, "name": "DUP3", "source": 1 }, - { "begin": 15481, "end": 15495, "name": "ADD", "source": 1 }, - { "begin": 15473, "end": 15495, "name": "SWAP1", "source": 1 }, - { "begin": 15473, "end": 15495, "name": "POP", "source": 1 }, - { "begin": 15361, "end": 15502, "name": "SWAP2", "source": 1 }, - { "begin": 15361, "end": 15502, "name": "SWAP1", "source": 1 }, - { "begin": 15361, "end": 15502, "name": "POP", "source": 1 }, + { "begin": 15591, "end": 15594, "name": "DUP3", "source": 1 }, + { "begin": 15587, "end": 15601, "name": "ADD", "source": 1 }, + { "begin": 15579, "end": 15601, "name": "SWAP1", "source": 1 }, + { "begin": 15579, "end": 15601, "name": "POP", "source": 1 }, + { "begin": 15467, "end": 15608, "name": "SWAP2", "source": 1 }, + { "begin": 15467, "end": 15608, "name": "SWAP1", "source": 1 }, + { "begin": 15467, "end": 15608, "name": "POP", "source": 1 }, { - "begin": 15361, - "end": 15502, + "begin": 15467, + "end": 15608, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 15508, - "end": 15666, + "begin": 15614, + "end": 15772, "name": "tag", "source": 1, - "value": "113" + "value": "111" }, - { "begin": 15508, "end": 15666, "name": "JUMPDEST", "source": 1 }, + { "begin": 15614, "end": 15772, "name": "JUMPDEST", "source": 1 }, { - "begin": 15581, - "end": 15592, + "begin": 15687, + "end": 15698, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 15615, "end": 15621, "name": "DUP3", "source": 1 }, - { "begin": 15610, "end": 15613, "name": "DUP3", "source": 1 }, - { "begin": 15603, "end": 15622, "name": "MSTORE", "source": 1 }, + { "begin": 15721, "end": 15727, "name": "DUP3", "source": 1 }, + { "begin": 15716, "end": 15719, "name": "DUP3", "source": 1 }, + { "begin": 15709, "end": 15728, "name": "MSTORE", "source": 1 }, { - "begin": 15655, - "end": 15659, + "begin": 15761, + "end": 15765, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 15650, "end": 15653, "name": "DUP3", "source": 1 }, - { "begin": 15646, "end": 15660, "name": "ADD", "source": 1 }, - { "begin": 15631, "end": 15660, "name": "SWAP1", "source": 1 }, - { "begin": 15631, "end": 15660, "name": "POP", "source": 1 }, - { "begin": 15508, "end": 15666, "name": "SWAP3", "source": 1 }, - { "begin": 15508, "end": 15666, "name": "SWAP2", "source": 1 }, - { "begin": 15508, "end": 15666, "name": "POP", "source": 1 }, - { "begin": 15508, "end": 15666, "name": "POP", "source": 1 }, - { - "begin": 15508, - "end": 15666, + { "begin": 15756, "end": 15759, "name": "DUP3", "source": 1 }, + { "begin": 15752, "end": 15766, "name": "ADD", "source": 1 }, + { "begin": 15737, "end": 15766, "name": "SWAP1", "source": 1 }, + { "begin": 15737, "end": 15766, "name": "POP", "source": 1 }, + { "begin": 15614, "end": 15772, "name": "SWAP3", "source": 1 }, + { "begin": 15614, "end": 15772, "name": "SWAP2", "source": 1 }, + { "begin": 15614, "end": 15772, "name": "POP", "source": 1 }, + { "begin": 15614, "end": 15772, "name": "POP", "source": 1 }, + { + "begin": 15614, + "end": 15772, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 15672, - "end": 16012, + "begin": 15778, + "end": 16118, "name": "tag", "source": 1, - "value": "114" + "value": "112" }, - { "begin": 15672, "end": 16012, "name": "JUMPDEST", "source": 1 }, + { "begin": 15778, "end": 16118, "name": "JUMPDEST", "source": 1 }, { - "begin": 15748, - "end": 15751, + "begin": 15854, + "end": 15857, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 15776, - "end": 15814, + "begin": 15882, + "end": 15920, "name": "PUSH [tag]", "source": 1, - "value": "301" + "value": "300" }, - { "begin": 15808, "end": 15813, "name": "DUP3", "source": 1 }, + { "begin": 15914, "end": 15919, "name": "DUP3", "source": 1 }, { - "begin": 15776, - "end": 15814, + "begin": 15882, + "end": 15920, "name": "PUSH [tag]", "source": 1, - "value": "104" + "value": "102" }, { - "begin": 15776, - "end": 15814, + "begin": 15882, + "end": 15920, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 15776, - "end": 15814, + "begin": 15882, + "end": 15920, "name": "tag", "source": 1, - "value": "301" + "value": "300" }, - { "begin": 15776, "end": 15814, "name": "JUMPDEST", "source": 1 }, + { "begin": 15882, "end": 15920, "name": "JUMPDEST", "source": 1 }, { - "begin": 15830, - "end": 15890, + "begin": 15936, + "end": 15996, "name": "PUSH [tag]", "source": 1, - "value": "302" + "value": "301" }, - { "begin": 15883, "end": 15889, "name": "DUP2", "source": 1 }, - { "begin": 15878, "end": 15881, "name": "DUP6", "source": 1 }, + { "begin": 15989, "end": 15995, "name": "DUP2", "source": 1 }, + { "begin": 15984, "end": 15987, "name": "DUP6", "source": 1 }, { - "begin": 15830, - "end": 15890, + "begin": 15936, + "end": 15996, "name": "PUSH [tag]", "source": 1, - "value": "113" + "value": "111" }, { - "begin": 15830, - "end": 15890, + "begin": 15936, + "end": 15996, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 15830, - "end": 15890, + "begin": 15936, + "end": 15996, "name": "tag", "source": 1, - "value": "302" + "value": "301" }, - { "begin": 15830, "end": 15890, "name": "JUMPDEST", "source": 1 }, - { "begin": 15823, "end": 15890, "name": "SWAP4", "source": 1 }, - { "begin": 15823, "end": 15890, "name": "POP", "source": 1 }, + { "begin": 15936, "end": 15996, "name": "JUMPDEST", "source": 1 }, + { "begin": 15929, "end": 15996, "name": "SWAP4", "source": 1 }, + { "begin": 15929, "end": 15996, "name": "POP", "source": 1 }, { - "begin": 15899, - "end": 15951, + "begin": 16005, + "end": 16057, "name": "PUSH [tag]", "source": 1, - "value": "303" + "value": "302" }, - { "begin": 15944, "end": 15950, "name": "DUP2", "source": 1 }, - { "begin": 15939, "end": 15942, "name": "DUP6", "source": 1 }, + { "begin": 16050, "end": 16056, "name": "DUP2", "source": 1 }, + { "begin": 16045, "end": 16048, "name": "DUP6", "source": 1 }, { - "begin": 15932, - "end": 15936, + "begin": 16038, + "end": 16042, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 15925, "end": 15930, "name": "DUP7", "source": 1 }, - { "begin": 15921, "end": 15937, "name": "ADD", "source": 1 }, + { "begin": 16031, "end": 16036, "name": "DUP7", "source": 1 }, + { "begin": 16027, "end": 16043, "name": "ADD", "source": 1 }, { - "begin": 15899, - "end": 15951, + "begin": 16005, + "end": 16057, "name": "PUSH [tag]", "source": 1, - "value": "106" + "value": "104" }, { - "begin": 15899, - "end": 15951, + "begin": 16005, + "end": 16057, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 15899, - "end": 15951, + "begin": 16005, + "end": 16057, "name": "tag", "source": 1, - "value": "303" + "value": "302" }, - { "begin": 15899, "end": 15951, "name": "JUMPDEST", "source": 1 }, + { "begin": 16005, "end": 16057, "name": "JUMPDEST", "source": 1 }, { - "begin": 15976, - "end": 16005, + "begin": 16082, + "end": 16111, "name": "PUSH [tag]", "source": 1, - "value": "304" + "value": "303" }, - { "begin": 15998, "end": 16004, "name": "DUP2", "source": 1 }, + { "begin": 16104, "end": 16110, "name": "DUP2", "source": 1 }, { - "begin": 15976, - "end": 16005, + "begin": 16082, + "end": 16111, "name": "PUSH [tag]", "source": 1, - "value": "78" + "value": "76" }, { - "begin": 15976, - "end": 16005, + "begin": 16082, + "end": 16111, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 15976, - "end": 16005, + "begin": 16082, + "end": 16111, "name": "tag", "source": 1, - "value": "304" - }, - { "begin": 15976, "end": 16005, "name": "JUMPDEST", "source": 1 }, - { "begin": 15971, "end": 15974, "name": "DUP5", "source": 1 }, - { "begin": 15967, "end": 16006, "name": "ADD", "source": 1 }, - { "begin": 15960, "end": 16006, "name": "SWAP2", "source": 1 }, - { "begin": 15960, "end": 16006, "name": "POP", "source": 1 }, - { "begin": 15752, "end": 16012, "name": "POP", "source": 1 }, - { "begin": 15672, "end": 16012, "name": "SWAP3", "source": 1 }, - { "begin": 15672, "end": 16012, "name": "SWAP2", "source": 1 }, - { "begin": 15672, "end": 16012, "name": "POP", "source": 1 }, - { "begin": 15672, "end": 16012, "name": "POP", "source": 1 }, - { - "begin": 15672, - "end": 16012, + "value": "303" + }, + { "begin": 16082, "end": 16111, "name": "JUMPDEST", "source": 1 }, + { "begin": 16077, "end": 16080, "name": "DUP5", "source": 1 }, + { "begin": 16073, "end": 16112, "name": "ADD", "source": 1 }, + { "begin": 16066, "end": 16112, "name": "SWAP2", "source": 1 }, + { "begin": 16066, "end": 16112, "name": "POP", "source": 1 }, + { "begin": 15858, "end": 16118, "name": "POP", "source": 1 }, + { "begin": 15778, "end": 16118, "name": "SWAP3", "source": 1 }, + { "begin": 15778, "end": 16118, "name": "SWAP2", "source": 1 }, + { "begin": 15778, "end": 16118, "name": "POP", "source": 1 }, + { "begin": 15778, "end": 16118, "name": "POP", "source": 1 }, + { + "begin": 15778, + "end": 16118, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 16018, - "end": 16210, + "begin": 16124, + "end": 16316, "name": "tag", "source": 1, - "value": "115" + "value": "113" }, - { "begin": 16018, "end": 16210, "name": "JUMPDEST", "source": 1 }, + { "begin": 16124, "end": 16316, "name": "JUMPDEST", "source": 1 }, { - "begin": 16105, - "end": 16115, + "begin": 16211, + "end": 16221, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 16140, - "end": 16204, + "begin": 16246, + "end": 16310, "name": "PUSH [tag]", "source": 1, - "value": "306" + "value": "305" }, - { "begin": 16200, "end": 16203, "name": "DUP4", "source": 1 }, - { "begin": 16192, "end": 16198, "name": "DUP4", "source": 1 }, + { "begin": 16306, "end": 16309, "name": "DUP4", "source": 1 }, + { "begin": 16298, "end": 16304, "name": "DUP4", "source": 1 }, { - "begin": 16140, - "end": 16204, + "begin": 16246, + "end": 16310, "name": "PUSH [tag]", "source": 1, - "value": "114" + "value": "112" }, { - "begin": 16140, - "end": 16204, + "begin": 16246, + "end": 16310, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 16140, - "end": 16204, + "begin": 16246, + "end": 16310, "name": "tag", "source": 1, - "value": "306" + "value": "305" }, - { "begin": 16140, "end": 16204, "name": "JUMPDEST", "source": 1 }, - { "begin": 16126, "end": 16204, "name": "SWAP1", "source": 1 }, - { "begin": 16126, "end": 16204, "name": "POP", "source": 1 }, - { "begin": 16018, "end": 16210, "name": "SWAP3", "source": 1 }, - { "begin": 16018, "end": 16210, "name": "SWAP2", "source": 1 }, - { "begin": 16018, "end": 16210, "name": "POP", "source": 1 }, - { "begin": 16018, "end": 16210, "name": "POP", "source": 1 }, + { "begin": 16246, "end": 16310, "name": "JUMPDEST", "source": 1 }, + { "begin": 16232, "end": 16310, "name": "SWAP1", "source": 1 }, + { "begin": 16232, "end": 16310, "name": "POP", "source": 1 }, + { "begin": 16124, "end": 16316, "name": "SWAP3", "source": 1 }, + { "begin": 16124, "end": 16316, "name": "SWAP2", "source": 1 }, + { "begin": 16124, "end": 16316, "name": "POP", "source": 1 }, + { "begin": 16124, "end": 16316, "name": "POP", "source": 1 }, { - "begin": 16018, - "end": 16210, + "begin": 16124, + "end": 16316, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 16216, - "end": 16338, + "begin": 16322, + "end": 16444, "name": "tag", "source": 1, - "value": "116" + "value": "114" }, - { "begin": 16216, "end": 16338, "name": "JUMPDEST", "source": 1 }, + { "begin": 16322, "end": 16444, "name": "JUMPDEST", "source": 1 }, { - "begin": 16295, - "end": 16299, + "begin": 16401, + "end": 16405, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 16327, - "end": 16331, + "begin": 16433, + "end": 16437, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 16322, "end": 16325, "name": "DUP3", "source": 1 }, - { "begin": 16318, "end": 16332, "name": "ADD", "source": 1 }, - { "begin": 16310, "end": 16332, "name": "SWAP1", "source": 1 }, - { "begin": 16310, "end": 16332, "name": "POP", "source": 1 }, - { "begin": 16216, "end": 16338, "name": "SWAP2", "source": 1 }, - { "begin": 16216, "end": 16338, "name": "SWAP1", "source": 1 }, - { "begin": 16216, "end": 16338, "name": "POP", "source": 1 }, + { "begin": 16428, "end": 16431, "name": "DUP3", "source": 1 }, + { "begin": 16424, "end": 16438, "name": "ADD", "source": 1 }, + { "begin": 16416, "end": 16438, "name": "SWAP1", "source": 1 }, + { "begin": 16416, "end": 16438, "name": "POP", "source": 1 }, + { "begin": 16322, "end": 16444, "name": "SWAP2", "source": 1 }, + { "begin": 16322, "end": 16444, "name": "SWAP1", "source": 1 }, + { "begin": 16322, "end": 16444, "name": "POP", "source": 1 }, { - "begin": 16216, - "end": 16338, + "begin": 16322, + "end": 16444, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 16370, - "end": 17333, + "begin": 16476, + "end": 17439, "name": "tag", "source": 1, - "value": "117" + "value": "115" }, - { "begin": 16370, "end": 17333, "name": "JUMPDEST", "source": 1 }, + { "begin": 16476, "end": 17439, "name": "JUMPDEST", "source": 1 }, { - "begin": 16497, - "end": 16500, + "begin": 16603, + "end": 16606, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 16526, - "end": 16589, + "begin": 16632, + "end": 16695, "name": "PUSH [tag]", "source": 1, - "value": "309" + "value": "308" }, - { "begin": 16583, "end": 16588, "name": "DUP3", "source": 1 }, + { "begin": 16689, "end": 16694, "name": "DUP3", "source": 1 }, { - "begin": 16526, - "end": 16589, + "begin": 16632, + "end": 16695, "name": "PUSH [tag]", "source": 1, - "value": "110" + "value": "108" }, { - "begin": 16526, - "end": 16589, + "begin": 16632, + "end": 16695, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 16526, - "end": 16589, + "begin": 16632, + "end": 16695, "name": "tag", "source": 1, - "value": "309" + "value": "308" }, - { "begin": 16526, "end": 16589, "name": "JUMPDEST", "source": 1 }, + { "begin": 16632, "end": 16695, "name": "JUMPDEST", "source": 1 }, { - "begin": 16605, - "end": 16690, + "begin": 16711, + "end": 16796, "name": "PUSH [tag]", "source": 1, - "value": "310" + "value": "309" }, - { "begin": 16683, "end": 16689, "name": "DUP2", "source": 1 }, - { "begin": 16678, "end": 16681, "name": "DUP6", "source": 1 }, + { "begin": 16789, "end": 16795, "name": "DUP2", "source": 1 }, + { "begin": 16784, "end": 16787, "name": "DUP6", "source": 1 }, { - "begin": 16605, - "end": 16690, + "begin": 16711, + "end": 16796, "name": "PUSH [tag]", "source": 1, - "value": "111" + "value": "109" }, { - "begin": 16605, - "end": 16690, + "begin": 16711, + "end": 16796, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 16605, - "end": 16690, + "begin": 16711, + "end": 16796, "name": "tag", "source": 1, - "value": "310" + "value": "309" }, - { "begin": 16605, "end": 16690, "name": "JUMPDEST", "source": 1 }, - { "begin": 16598, "end": 16690, "name": "SWAP4", "source": 1 }, - { "begin": 16598, "end": 16690, "name": "POP", "source": 1 }, - { "begin": 16716, "end": 16719, "name": "DUP4", "source": 1 }, + { "begin": 16711, "end": 16796, "name": "JUMPDEST", "source": 1 }, + { "begin": 16704, "end": 16796, "name": "SWAP4", "source": 1 }, + { "begin": 16704, "end": 16796, "name": "POP", "source": 1 }, + { "begin": 16822, "end": 16825, "name": "DUP4", "source": 1 }, { - "begin": 16761, - "end": 16765, + "begin": 16867, + "end": 16871, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 16753, "end": 16759, "name": "DUP3", "source": 1 }, - { "begin": 16749, "end": 16766, "name": "MUL", "source": 1 }, - { "begin": 16744, "end": 16747, "name": "DUP6", "source": 1 }, - { "begin": 16740, "end": 16767, "name": "ADD", "source": 1 }, + { "begin": 16859, "end": 16865, "name": "DUP3", "source": 1 }, + { "begin": 16855, "end": 16872, "name": "MUL", "source": 1 }, + { "begin": 16850, "end": 16853, "name": "DUP6", "source": 1 }, + { "begin": 16846, "end": 16873, "name": "ADD", "source": 1 }, { - "begin": 16791, - "end": 16856, + "begin": 16897, + "end": 16962, "name": "PUSH [tag]", "source": 1, - "value": "311" + "value": "310" }, - { "begin": 16850, "end": 16855, "name": "DUP6", "source": 1 }, + { "begin": 16956, "end": 16961, "name": "DUP6", "source": 1 }, { - "begin": 16791, - "end": 16856, + "begin": 16897, + "end": 16962, "name": "PUSH [tag]", "source": 1, - "value": "112" + "value": "110" }, { - "begin": 16791, - "end": 16856, + "begin": 16897, + "end": 16962, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 16791, - "end": 16856, + "begin": 16897, + "end": 16962, "name": "tag", "source": 1, - "value": "311" + "value": "310" }, - { "begin": 16791, "end": 16856, "name": "JUMPDEST", "source": 1 }, - { "begin": 16879, "end": 16886, "name": "DUP1", "source": 1 }, + { "begin": 16897, "end": 16962, "name": "JUMPDEST", "source": 1 }, + { "begin": 16985, "end": 16992, "name": "DUP1", "source": 1 }, { - "begin": 16910, - "end": 16911, + "begin": 17016, + "end": 17017, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 16895, - "end": 17288, + "begin": 17001, + "end": 17394, "name": "tag", "source": 1, - "value": "312" + "value": "311" }, - { "begin": 16895, "end": 17288, "name": "JUMPDEST", "source": 1 }, - { "begin": 16920, "end": 16926, "name": "DUP6", "source": 1 }, - { "begin": 16917, "end": 16918, "name": "DUP2", "source": 1 }, - { "begin": 16914, "end": 16927, "name": "LT", "source": 1 }, - { "begin": 16895, "end": 17288, "name": "ISZERO", "source": 1 }, + { "begin": 17001, "end": 17394, "name": "JUMPDEST", "source": 1 }, + { "begin": 17026, "end": 17032, "name": "DUP6", "source": 1 }, + { "begin": 17023, "end": 17024, "name": "DUP2", "source": 1 }, + { "begin": 17020, "end": 17033, "name": "LT", "source": 1 }, + { "begin": 17001, "end": 17394, "name": "ISZERO", "source": 1 }, { - "begin": 16895, - "end": 17288, + "begin": 17001, + "end": 17394, "name": "PUSH [tag]", "source": 1, - "value": "314" + "value": "313" }, - { "begin": 16895, "end": 17288, "name": "JUMPI", "source": 1 }, - { "begin": 16991, "end": 17000, "name": "DUP5", "source": 1 }, - { "begin": 16985, "end": 16989, "name": "DUP5", "source": 1 }, - { "begin": 16981, "end": 17001, "name": "SUB", "source": 1 }, - { "begin": 16976, "end": 16979, "name": "DUP10", "source": 1 }, - { "begin": 16969, "end": 17002, "name": "MSTORE", "source": 1 }, - { "begin": 17042, "end": 17048, "name": "DUP2", "source": 1 }, - { "begin": 17036, "end": 17049, "name": "MLOAD", "source": 1 }, + { "begin": 17001, "end": 17394, "name": "JUMPI", "source": 1 }, + { "begin": 17097, "end": 17106, "name": "DUP5", "source": 1 }, + { "begin": 17091, "end": 17095, "name": "DUP5", "source": 1 }, + { "begin": 17087, "end": 17107, "name": "SUB", "source": 1 }, + { "begin": 17082, "end": 17085, "name": "DUP10", "source": 1 }, + { "begin": 17075, "end": 17108, "name": "MSTORE", "source": 1 }, + { "begin": 17148, "end": 17154, "name": "DUP2", "source": 1 }, + { "begin": 17142, "end": 17155, "name": "MLOAD", "source": 1 }, { - "begin": 17070, - "end": 17152, + "begin": 17176, + "end": 17258, "name": "PUSH [tag]", "source": 1, - "value": "315" + "value": "314" }, - { "begin": 17147, "end": 17151, "name": "DUP6", "source": 1 }, - { "begin": 17132, "end": 17145, "name": "DUP3", "source": 1 }, + { "begin": 17253, "end": 17257, "name": "DUP6", "source": 1 }, + { "begin": 17238, "end": 17251, "name": "DUP3", "source": 1 }, { - "begin": 17070, - "end": 17152, + "begin": 17176, + "end": 17258, "name": "PUSH [tag]", "source": 1, - "value": "115" + "value": "113" }, { - "begin": 17070, - "end": 17152, + "begin": 17176, + "end": 17258, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 17070, - "end": 17152, + "begin": 17176, + "end": 17258, "name": "tag", "source": 1, - "value": "315" + "value": "314" }, - { "begin": 17070, "end": 17152, "name": "JUMPDEST", "source": 1 }, - { "begin": 17062, "end": 17152, "name": "SWAP5", "source": 1 }, - { "begin": 17062, "end": 17152, "name": "POP", "source": 1 }, + { "begin": 17176, "end": 17258, "name": "JUMPDEST", "source": 1 }, + { "begin": 17168, "end": 17258, "name": "SWAP5", "source": 1 }, + { "begin": 17168, "end": 17258, "name": "POP", "source": 1 }, { - "begin": 17175, - "end": 17244, + "begin": 17281, + "end": 17350, "name": "PUSH [tag]", "source": 1, - "value": "316" + "value": "315" }, - { "begin": 17237, "end": 17243, "name": "DUP4", "source": 1 }, + { "begin": 17343, "end": 17349, "name": "DUP4", "source": 1 }, { - "begin": 17175, - "end": 17244, + "begin": 17281, + "end": 17350, "name": "PUSH [tag]", "source": 1, - "value": "116" + "value": "114" }, { - "begin": 17175, - "end": 17244, + "begin": 17281, + "end": 17350, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 17175, - "end": 17244, + "begin": 17281, + "end": 17350, "name": "tag", "source": 1, - "value": "316" + "value": "315" }, - { "begin": 17175, "end": 17244, "name": "JUMPDEST", "source": 1 }, - { "begin": 17165, "end": 17244, "name": "SWAP3", "source": 1 }, - { "begin": 17165, "end": 17244, "name": "POP", "source": 1 }, + { "begin": 17281, "end": 17350, "name": "JUMPDEST", "source": 1 }, + { "begin": 17271, "end": 17350, "name": "SWAP3", "source": 1 }, + { "begin": 17271, "end": 17350, "name": "POP", "source": 1 }, { - "begin": 17273, - "end": 17277, + "begin": 17379, + "end": 17383, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 17268, "end": 17271, "name": "DUP11", "source": 1 }, - { "begin": 17264, "end": 17278, "name": "ADD", "source": 1 }, - { "begin": 17257, "end": 17278, "name": "SWAP10", "source": 1 }, - { "begin": 17257, "end": 17278, "name": "POP", "source": 1 }, - { "begin": 16955, "end": 17288, "name": "POP", "source": 1 }, + { "begin": 17374, "end": 17377, "name": "DUP11", "source": 1 }, + { "begin": 17370, "end": 17384, "name": "ADD", "source": 1 }, + { "begin": 17363, "end": 17384, "name": "SWAP10", "source": 1 }, + { "begin": 17363, "end": 17384, "name": "POP", "source": 1 }, + { "begin": 17061, "end": 17394, "name": "POP", "source": 1 }, { - "begin": 16942, - "end": 16943, + "begin": 17048, + "end": 17049, "name": "PUSH", "source": 1, "value": "1" }, - { "begin": 16939, "end": 16940, "name": "DUP2", "source": 1 }, - { "begin": 16935, "end": 16944, "name": "ADD", "source": 1 }, - { "begin": 16930, "end": 16944, "name": "SWAP1", "source": 1 }, - { "begin": 16930, "end": 16944, "name": "POP", "source": 1 }, + { "begin": 17045, "end": 17046, "name": "DUP2", "source": 1 }, + { "begin": 17041, "end": 17050, "name": "ADD", "source": 1 }, + { "begin": 17036, "end": 17050, "name": "SWAP1", "source": 1 }, + { "begin": 17036, "end": 17050, "name": "POP", "source": 1 }, { - "begin": 16895, - "end": 17288, + "begin": 17001, + "end": 17394, "name": "PUSH [tag]", "source": 1, - "value": "312" + "value": "311" }, - { "begin": 16895, "end": 17288, "name": "JUMP", "source": 1 }, + { "begin": 17001, "end": 17394, "name": "JUMP", "source": 1 }, { - "begin": 16895, - "end": 17288, + "begin": 17001, + "end": 17394, "name": "tag", "source": 1, - "value": "314" - }, - { "begin": 16895, "end": 17288, "name": "JUMPDEST", "source": 1 }, - { "begin": 16899, "end": 16913, "name": "POP", "source": 1 }, - { "begin": 17304, "end": 17308, "name": "DUP3", "source": 1 }, - { "begin": 17297, "end": 17308, "name": "SWAP8", "source": 1 }, - { "begin": 17297, "end": 17308, "name": "POP", "source": 1 }, - { "begin": 17324, "end": 17327, "name": "DUP8", "source": 1 }, - { "begin": 17317, "end": 17327, "name": "SWAP6", "source": 1 }, - { "begin": 17317, "end": 17327, "name": "POP", "source": 1 }, - { "begin": 16502, "end": 17333, "name": "POP", "source": 1 }, - { "begin": 16502, "end": 17333, "name": "POP", "source": 1 }, - { "begin": 16502, "end": 17333, "name": "POP", "source": 1 }, - { "begin": 16502, "end": 17333, "name": "POP", "source": 1 }, - { "begin": 16502, "end": 17333, "name": "POP", "source": 1 }, - { "begin": 16370, "end": 17333, "name": "SWAP3", "source": 1 }, - { "begin": 16370, "end": 17333, "name": "SWAP2", "source": 1 }, - { "begin": 16370, "end": 17333, "name": "POP", "source": 1 }, - { "begin": 16370, "end": 17333, "name": "POP", "source": 1 }, - { - "begin": 16370, - "end": 17333, + "value": "313" + }, + { "begin": 17001, "end": 17394, "name": "JUMPDEST", "source": 1 }, + { "begin": 17005, "end": 17019, "name": "POP", "source": 1 }, + { "begin": 17410, "end": 17414, "name": "DUP3", "source": 1 }, + { "begin": 17403, "end": 17414, "name": "SWAP8", "source": 1 }, + { "begin": 17403, "end": 17414, "name": "POP", "source": 1 }, + { "begin": 17430, "end": 17433, "name": "DUP8", "source": 1 }, + { "begin": 17423, "end": 17433, "name": "SWAP6", "source": 1 }, + { "begin": 17423, "end": 17433, "name": "POP", "source": 1 }, + { "begin": 16608, "end": 17439, "name": "POP", "source": 1 }, + { "begin": 16608, "end": 17439, "name": "POP", "source": 1 }, + { "begin": 16608, "end": 17439, "name": "POP", "source": 1 }, + { "begin": 16608, "end": 17439, "name": "POP", "source": 1 }, + { "begin": 16608, "end": 17439, "name": "POP", "source": 1 }, + { "begin": 16476, "end": 17439, "name": "SWAP3", "source": 1 }, + { "begin": 16476, "end": 17439, "name": "SWAP2", "source": 1 }, + { "begin": 16476, "end": 17439, "name": "POP", "source": 1 }, + { "begin": 16476, "end": 17439, "name": "POP", "source": 1 }, + { + "begin": 16476, + "end": 17439, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 17419, - "end": 18082, + "begin": 17525, + "end": 18188, "name": "tag", "source": 1, - "value": "118" + "value": "116" }, - { "begin": 17419, "end": 18082, "name": "JUMPDEST", "source": 1 }, + { "begin": 17525, "end": 18188, "name": "JUMPDEST", "source": 1 }, { - "begin": 17544, - "end": 17547, + "begin": 17650, + "end": 17653, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 17580, - "end": 17584, + "begin": 17686, + "end": 17690, "name": "PUSH", "source": 1, "value": "40" }, - { "begin": 17575, "end": 17578, "name": "DUP4", "source": 1 }, - { "begin": 17571, "end": 17585, "name": "ADD", "source": 1 }, + { "begin": 17681, "end": 17684, "name": "DUP4", "source": 1 }, + { "begin": 17677, "end": 17691, "name": "ADD", "source": 1 }, { - "begin": 17670, - "end": 17674, + "begin": 17776, + "end": 17780, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 17663, "end": 17668, "name": "DUP4", "source": 1 }, - { "begin": 17659, "end": 17675, "name": "ADD", "source": 1 }, - { "begin": 17653, "end": 17676, "name": "MLOAD", "source": 1 }, + { "begin": 17769, "end": 17774, "name": "DUP4", "source": 1 }, + { "begin": 17765, "end": 17781, "name": "ADD", "source": 1 }, + { "begin": 17759, "end": 17782, "name": "MLOAD", "source": 1 }, { - "begin": 17689, - "end": 17748, + "begin": 17795, + "end": 17854, "name": "PUSH [tag]", "source": 1, - "value": "318" + "value": "317" }, { - "begin": 17742, - "end": 17746, + "begin": 17848, + "end": 17852, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 17737, "end": 17740, "name": "DUP7", "source": 1 }, - { "begin": 17733, "end": 17747, "name": "ADD", "source": 1 }, - { "begin": 17719, "end": 17731, "name": "DUP3", "source": 1 }, + { "begin": 17843, "end": 17846, "name": "DUP7", "source": 1 }, + { "begin": 17839, "end": 17853, "name": "ADD", "source": 1 }, + { "begin": 17825, "end": 17837, "name": "DUP3", "source": 1 }, { - "begin": 17689, - "end": 17748, + "begin": 17795, + "end": 17854, "name": "PUSH [tag]", "source": 1, - "value": "109" + "value": "107" }, { - "begin": 17689, - "end": 17748, + "begin": 17795, + "end": 17854, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 17689, - "end": 17748, + "begin": 17795, + "end": 17854, "name": "tag", "source": 1, - "value": "318" + "value": "317" }, - { "begin": 17689, "end": 17748, "name": "JUMPDEST", "source": 1 }, - { "begin": 17595, "end": 17758, "name": "POP", "source": 1 }, + { "begin": 17795, "end": 17854, "name": "JUMPDEST", "source": 1 }, + { "begin": 17701, "end": 17864, "name": "POP", "source": 1 }, { - "begin": 17844, - "end": 17848, + "begin": 17950, + "end": 17954, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 17837, "end": 17842, "name": "DUP4", "source": 1 }, - { "begin": 17833, "end": 17849, "name": "ADD", "source": 1 }, - { "begin": 17827, "end": 17850, "name": "MLOAD", "source": 1 }, - { "begin": 17897, "end": 17900, "name": "DUP5", "source": 1 }, - { "begin": 17891, "end": 17895, "name": "DUP3", "source": 1 }, - { "begin": 17887, "end": 17901, "name": "SUB", "source": 1 }, + { "begin": 17943, "end": 17948, "name": "DUP4", "source": 1 }, + { "begin": 17939, "end": 17955, "name": "ADD", "source": 1 }, + { "begin": 17933, "end": 17956, "name": "MLOAD", "source": 1 }, + { "begin": 18003, "end": 18006, "name": "DUP5", "source": 1 }, + { "begin": 17997, "end": 18001, "name": "DUP3", "source": 1 }, + { "begin": 17993, "end": 18007, "name": "SUB", "source": 1 }, { - "begin": 17880, - "end": 17884, + "begin": 17986, + "end": 17990, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 17875, "end": 17878, "name": "DUP7", "source": 1 }, - { "begin": 17871, "end": 17885, "name": "ADD", "source": 1 }, - { "begin": 17864, "end": 17902, "name": "MSTORE", "source": 1 }, + { "begin": 17981, "end": 17984, "name": "DUP7", "source": 1 }, + { "begin": 17977, "end": 17991, "name": "ADD", "source": 1 }, + { "begin": 17970, "end": 18008, "name": "MSTORE", "source": 1 }, { - "begin": 17923, - "end": 18044, + "begin": 18029, + "end": 18150, "name": "PUSH [tag]", "source": 1, - "value": "319" + "value": "318" }, - { "begin": 18039, "end": 18043, "name": "DUP3", "source": 1 }, - { "begin": 18025, "end": 18037, "name": "DUP3", "source": 1 }, + { "begin": 18145, "end": 18149, "name": "DUP3", "source": 1 }, + { "begin": 18131, "end": 18143, "name": "DUP3", "source": 1 }, { - "begin": 17923, - "end": 18044, + "begin": 18029, + "end": 18150, "name": "PUSH [tag]", "source": 1, - "value": "117" + "value": "115" }, { - "begin": 17923, - "end": 18044, + "begin": 18029, + "end": 18150, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 17923, - "end": 18044, + "begin": 18029, + "end": 18150, "name": "tag", "source": 1, - "value": "319" - }, - { "begin": 17923, "end": 18044, "name": "JUMPDEST", "source": 1 }, - { "begin": 17915, "end": 18044, "name": "SWAP2", "source": 1 }, - { "begin": 17915, "end": 18044, "name": "POP", "source": 1 }, - { "begin": 17768, "end": 18055, "name": "POP", "source": 1 }, - { "begin": 18072, "end": 18076, "name": "DUP1", "source": 1 }, - { "begin": 18065, "end": 18076, "name": "SWAP2", "source": 1 }, - { "begin": 18065, "end": 18076, "name": "POP", "source": 1 }, - { "begin": 17549, "end": 18082, "name": "POP", "source": 1 }, - { "begin": 17419, "end": 18082, "name": "SWAP3", "source": 1 }, - { "begin": 17419, "end": 18082, "name": "SWAP2", "source": 1 }, - { "begin": 17419, "end": 18082, "name": "POP", "source": 1 }, - { "begin": 17419, "end": 18082, "name": "POP", "source": 1 }, - { - "begin": 17419, - "end": 18082, + "value": "318" + }, + { "begin": 18029, "end": 18150, "name": "JUMPDEST", "source": 1 }, + { "begin": 18021, "end": 18150, "name": "SWAP2", "source": 1 }, + { "begin": 18021, "end": 18150, "name": "POP", "source": 1 }, + { "begin": 17874, "end": 18161, "name": "POP", "source": 1 }, + { "begin": 18178, "end": 18182, "name": "DUP1", "source": 1 }, + { "begin": 18171, "end": 18182, "name": "SWAP2", "source": 1 }, + { "begin": 18171, "end": 18182, "name": "POP", "source": 1 }, + { "begin": 17655, "end": 18188, "name": "POP", "source": 1 }, + { "begin": 17525, "end": 18188, "name": "SWAP3", "source": 1 }, + { "begin": 17525, "end": 18188, "name": "SWAP2", "source": 1 }, + { "begin": 17525, "end": 18188, "name": "POP", "source": 1 }, + { "begin": 17525, "end": 18188, "name": "POP", "source": 1 }, + { + "begin": 17525, + "end": 18188, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 18088, - "end": 18986, + "begin": 18194, + "end": 19092, "name": "tag", "source": 1, - "value": "48" + "value": "47" }, - { "begin": 18088, "end": 18986, "name": "JUMPDEST", "source": 1 }, + { "begin": 18194, "end": 19092, "name": "JUMPDEST", "source": 1 }, { - "begin": 18359, - "end": 18363, + "begin": 18465, + "end": 18469, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 18397, - "end": 18400, + "begin": 18503, + "end": 18506, "name": "PUSH", "source": 1, "value": "A0" }, - { "begin": 18386, "end": 18395, "name": "DUP3", "source": 1 }, - { "begin": 18382, "end": 18401, "name": "ADD", "source": 1 }, - { "begin": 18374, "end": 18401, "name": "SWAP1", "source": 1 }, - { "begin": 18374, "end": 18401, "name": "POP", "source": 1 }, + { "begin": 18492, "end": 18501, "name": "DUP3", "source": 1 }, + { "begin": 18488, "end": 18507, "name": "ADD", "source": 1 }, + { "begin": 18480, "end": 18507, "name": "SWAP1", "source": 1 }, + { "begin": 18480, "end": 18507, "name": "POP", "source": 1 }, { - "begin": 18411, - "end": 18478, + "begin": 18517, + "end": 18584, "name": "PUSH [tag]", "source": 1, - "value": "321" + "value": "320" }, { - "begin": 18475, - "end": 18476, + "begin": 18581, + "end": 18582, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 18464, "end": 18473, "name": "DUP4", "source": 1 }, - { "begin": 18460, "end": 18477, "name": "ADD", "source": 1 }, - { "begin": 18451, "end": 18457, "name": "DUP9", "source": 1 }, + { "begin": 18570, "end": 18579, "name": "DUP4", "source": 1 }, + { "begin": 18566, "end": 18583, "name": "ADD", "source": 1 }, + { "begin": 18557, "end": 18563, "name": "DUP9", "source": 1 }, { - "begin": 18411, - "end": 18478, + "begin": 18517, + "end": 18584, "name": "PUSH [tag]", "source": 1, - "value": "102" + "value": "100" }, { - "begin": 18411, - "end": 18478, + "begin": 18517, + "end": 18584, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 18411, - "end": 18478, + "begin": 18517, + "end": 18584, "name": "tag", "source": 1, - "value": "321" + "value": "320" }, - { "begin": 18411, "end": 18478, "name": "JUMPDEST", "source": 1 }, + { "begin": 18517, "end": 18584, "name": "JUMPDEST", "source": 1 }, { - "begin": 18488, - "end": 18558, + "begin": 18594, + "end": 18664, "name": "PUSH [tag]", "source": 1, - "value": "322" + "value": "321" }, { - "begin": 18554, - "end": 18556, + "begin": 18660, + "end": 18662, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 18543, "end": 18552, "name": "DUP4", "source": 1 }, - { "begin": 18539, "end": 18557, "name": "ADD", "source": 1 }, - { "begin": 18530, "end": 18536, "name": "DUP8", "source": 1 }, + { "begin": 18649, "end": 18658, "name": "DUP4", "source": 1 }, + { "begin": 18645, "end": 18663, "name": "ADD", "source": 1 }, + { "begin": 18636, "end": 18642, "name": "DUP8", "source": 1 }, { - "begin": 18488, - "end": 18558, + "begin": 18594, + "end": 18664, "name": "PUSH [tag]", "source": 1, - "value": "103" + "value": "101" }, { - "begin": 18488, - "end": 18558, + "begin": 18594, + "end": 18664, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 18488, - "end": 18558, + "begin": 18594, + "end": 18664, "name": "tag", "source": 1, - "value": "322" + "value": "321" }, - { "begin": 18488, "end": 18558, "name": "JUMPDEST", "source": 1 }, - { "begin": 18605, "end": 18614, "name": "DUP2", "source": 1 }, - { "begin": 18599, "end": 18603, "name": "DUP2", "source": 1 }, - { "begin": 18595, "end": 18615, "name": "SUB", "source": 1 }, + { "begin": 18594, "end": 18664, "name": "JUMPDEST", "source": 1 }, + { "begin": 18711, "end": 18720, "name": "DUP2", "source": 1 }, + { "begin": 18705, "end": 18709, "name": "DUP2", "source": 1 }, + { "begin": 18701, "end": 18721, "name": "SUB", "source": 1 }, { - "begin": 18590, - "end": 18592, + "begin": 18696, + "end": 18698, "name": "PUSH", "source": 1, "value": "40" }, - { "begin": 18579, "end": 18588, "name": "DUP4", "source": 1 }, - { "begin": 18575, "end": 18593, "name": "ADD", "source": 1 }, - { "begin": 18568, "end": 18616, "name": "MSTORE", "source": 1 }, + { "begin": 18685, "end": 18694, "name": "DUP4", "source": 1 }, + { "begin": 18681, "end": 18699, "name": "ADD", "source": 1 }, + { "begin": 18674, "end": 18722, "name": "MSTORE", "source": 1 }, { - "begin": 18633, - "end": 18747, + "begin": 18739, + "end": 18853, "name": "PUSH [tag]", "source": 1, - "value": "323" + "value": "322" }, - { "begin": 18742, "end": 18746, "name": "DUP2", "source": 1 }, - { "begin": 18733, "end": 18739, "name": "DUP7", "source": 1 }, + { "begin": 18848, "end": 18852, "name": "DUP2", "source": 1 }, + { "begin": 18839, "end": 18845, "name": "DUP7", "source": 1 }, { - "begin": 18633, - "end": 18747, + "begin": 18739, + "end": 18853, "name": "PUSH [tag]", "source": 1, - "value": "118" + "value": "116" }, { - "begin": 18633, - "end": 18747, + "begin": 18739, + "end": 18853, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 18633, - "end": 18747, + "begin": 18739, + "end": 18853, "name": "tag", "source": 1, - "value": "323" + "value": "322" }, - { "begin": 18633, "end": 18747, "name": "JUMPDEST", "source": 1 }, - { "begin": 18625, "end": 18747, "name": "SWAP1", "source": 1 }, - { "begin": 18625, "end": 18747, "name": "POP", "source": 1 }, + { "begin": 18739, "end": 18853, "name": "JUMPDEST", "source": 1 }, + { "begin": 18731, "end": 18853, "name": "SWAP1", "source": 1 }, + { "begin": 18731, "end": 18853, "name": "POP", "source": 1 }, { - "begin": 18757, - "end": 18827, + "begin": 18863, + "end": 18933, "name": "PUSH [tag]", "source": 1, - "value": "324" + "value": "323" }, { - "begin": 18823, - "end": 18825, + "begin": 18929, + "end": 18931, "name": "PUSH", "source": 1, "value": "60" }, - { "begin": 18812, "end": 18821, "name": "DUP4", "source": 1 }, - { "begin": 18808, "end": 18826, "name": "ADD", "source": 1 }, - { "begin": 18799, "end": 18805, "name": "DUP6", "source": 1 }, + { "begin": 18918, "end": 18927, "name": "DUP4", "source": 1 }, + { "begin": 18914, "end": 18932, "name": "ADD", "source": 1 }, + { "begin": 18905, "end": 18911, "name": "DUP6", "source": 1 }, { - "begin": 18757, - "end": 18827, + "begin": 18863, + "end": 18933, "name": "PUSH [tag]", "source": 1, - "value": "101" + "value": "97" }, { - "begin": 18757, - "end": 18827, + "begin": 18863, + "end": 18933, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 18757, - "end": 18827, + "begin": 18863, + "end": 18933, "name": "tag", "source": 1, - "value": "324" + "value": "323" }, - { "begin": 18757, "end": 18827, "name": "JUMPDEST", "source": 1 }, - { "begin": 18875, "end": 18884, "name": "DUP2", "source": 1 }, - { "begin": 18869, "end": 18873, "name": "DUP2", "source": 1 }, - { "begin": 18865, "end": 18885, "name": "SUB", "source": 1 }, + { "begin": 18863, "end": 18933, "name": "JUMPDEST", "source": 1 }, + { "begin": 18981, "end": 18990, "name": "DUP2", "source": 1 }, + { "begin": 18975, "end": 18979, "name": "DUP2", "source": 1 }, + { "begin": 18971, "end": 18991, "name": "SUB", "source": 1 }, { - "begin": 18859, - "end": 18862, + "begin": 18965, + "end": 18968, "name": "PUSH", "source": 1, "value": "80" }, - { "begin": 18848, "end": 18857, "name": "DUP4", "source": 1 }, - { "begin": 18844, "end": 18863, "name": "ADD", "source": 1 }, - { "begin": 18837, "end": 18886, "name": "MSTORE", "source": 1 }, + { "begin": 18954, "end": 18963, "name": "DUP4", "source": 1 }, + { "begin": 18950, "end": 18969, "name": "ADD", "source": 1 }, + { "begin": 18943, "end": 18992, "name": "MSTORE", "source": 1 }, { - "begin": 18903, - "end": 18979, + "begin": 19009, + "end": 19085, "name": "PUSH [tag]", "source": 1, - "value": "325" + "value": "324" }, - { "begin": 18974, "end": 18978, "name": "DUP2", "source": 1 }, - { "begin": 18965, "end": 18971, "name": "DUP5", "source": 1 }, + { "begin": 19080, "end": 19084, "name": "DUP2", "source": 1 }, + { "begin": 19071, "end": 19077, "name": "DUP5", "source": 1 }, { - "begin": 18903, - "end": 18979, + "begin": 19009, + "end": 19085, "name": "PUSH [tag]", "source": 1, - "value": "107" + "value": "105" }, { - "begin": 18903, - "end": 18979, + "begin": 19009, + "end": 19085, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 18903, - "end": 18979, + "begin": 19009, + "end": 19085, "name": "tag", "source": 1, - "value": "325" - }, - { "begin": 18903, "end": 18979, "name": "JUMPDEST", "source": 1 }, - { "begin": 18895, "end": 18979, "name": "SWAP1", "source": 1 }, - { "begin": 18895, "end": 18979, "name": "POP", "source": 1 }, - { "begin": 18088, "end": 18986, "name": "SWAP7", "source": 1 }, - { "begin": 18088, "end": 18986, "name": "SWAP6", "source": 1 }, - { "begin": 18088, "end": 18986, "name": "POP", "source": 1 }, - { "begin": 18088, "end": 18986, "name": "POP", "source": 1 }, - { "begin": 18088, "end": 18986, "name": "POP", "source": 1 }, - { "begin": 18088, "end": 18986, "name": "POP", "source": 1 }, - { "begin": 18088, "end": 18986, "name": "POP", "source": 1 }, - { "begin": 18088, "end": 18986, "name": "POP", "source": 1 }, - { - "begin": 18088, - "end": 18986, + "value": "324" + }, + { "begin": 19009, "end": 19085, "name": "JUMPDEST", "source": 1 }, + { "begin": 19001, "end": 19085, "name": "SWAP1", "source": 1 }, + { "begin": 19001, "end": 19085, "name": "POP", "source": 1 }, + { "begin": 18194, "end": 19092, "name": "SWAP7", "source": 1 }, + { "begin": 18194, "end": 19092, "name": "SWAP6", "source": 1 }, + { "begin": 18194, "end": 19092, "name": "POP", "source": 1 }, + { "begin": 18194, "end": 19092, "name": "POP", "source": 1 }, + { "begin": 18194, "end": 19092, "name": "POP", "source": 1 }, + { "begin": 18194, "end": 19092, "name": "POP", "source": 1 }, + { "begin": 18194, "end": 19092, "name": "POP", "source": 1 }, + { "begin": 18194, "end": 19092, "name": "POP", "source": 1 }, + { + "begin": 18194, + "end": 19092, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 18992, - "end": 19377, + "begin": 19098, + "end": 19483, "name": "tag", "source": 1, - "value": "54" + "value": "53" }, - { "begin": 18992, "end": 19377, "name": "JUMPDEST", "source": 1 }, + { "begin": 19098, "end": 19483, "name": "JUMPDEST", "source": 1 }, { - "begin": 19141, - "end": 19145, + "begin": 19247, + "end": 19251, "name": "PUSH", "source": 1, "value": "0" }, { - "begin": 19179, - "end": 19181, + "begin": 19285, + "end": 19287, "name": "PUSH", "source": 1, "value": "20" }, - { "begin": 19168, "end": 19177, "name": "DUP3", "source": 1 }, - { "begin": 19164, "end": 19182, "name": "ADD", "source": 1 }, - { "begin": 19156, "end": 19182, "name": "SWAP1", "source": 1 }, - { "begin": 19156, "end": 19182, "name": "POP", "source": 1 }, - { "begin": 19228, "end": 19237, "name": "DUP2", "source": 1 }, - { "begin": 19222, "end": 19226, "name": "DUP2", "source": 1 }, - { "begin": 19218, "end": 19238, "name": "SUB", "source": 1 }, + { "begin": 19274, "end": 19283, "name": "DUP3", "source": 1 }, + { "begin": 19270, "end": 19288, "name": "ADD", "source": 1 }, + { "begin": 19262, "end": 19288, "name": "SWAP1", "source": 1 }, + { "begin": 19262, "end": 19288, "name": "POP", "source": 1 }, + { "begin": 19334, "end": 19343, "name": "DUP2", "source": 1 }, + { "begin": 19328, "end": 19332, "name": "DUP2", "source": 1 }, + { "begin": 19324, "end": 19344, "name": "SUB", "source": 1 }, { - "begin": 19214, - "end": 19215, + "begin": 19320, + "end": 19321, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 19203, "end": 19212, "name": "DUP4", "source": 1 }, - { "begin": 19199, "end": 19216, "name": "ADD", "source": 1 }, - { "begin": 19192, "end": 19239, "name": "MSTORE", "source": 1 }, + { "begin": 19309, "end": 19318, "name": "DUP4", "source": 1 }, + { "begin": 19305, "end": 19322, "name": "ADD", "source": 1 }, + { "begin": 19298, "end": 19345, "name": "MSTORE", "source": 1 }, { - "begin": 19256, - "end": 19370, + "begin": 19362, + "end": 19476, "name": "PUSH [tag]", "source": 1, - "value": "327" + "value": "326" }, - { "begin": 19365, "end": 19369, "name": "DUP2", "source": 1 }, - { "begin": 19356, "end": 19362, "name": "DUP5", "source": 1 }, + { "begin": 19471, "end": 19475, "name": "DUP2", "source": 1 }, + { "begin": 19462, "end": 19468, "name": "DUP5", "source": 1 }, { - "begin": 19256, - "end": 19370, + "begin": 19362, + "end": 19476, "name": "PUSH [tag]", "source": 1, - "value": "118" + "value": "116" }, { - "begin": 19256, - "end": 19370, + "begin": 19362, + "end": 19476, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 19256, - "end": 19370, + "begin": 19362, + "end": 19476, "name": "tag", "source": 1, - "value": "327" + "value": "326" }, - { "begin": 19256, "end": 19370, "name": "JUMPDEST", "source": 1 }, - { "begin": 19248, "end": 19370, "name": "SWAP1", "source": 1 }, - { "begin": 19248, "end": 19370, "name": "POP", "source": 1 }, - { "begin": 18992, "end": 19377, "name": "SWAP3", "source": 1 }, - { "begin": 18992, "end": 19377, "name": "SWAP2", "source": 1 }, - { "begin": 18992, "end": 19377, "name": "POP", "source": 1 }, - { "begin": 18992, "end": 19377, "name": "POP", "source": 1 }, + { "begin": 19362, "end": 19476, "name": "JUMPDEST", "source": 1 }, + { "begin": 19354, "end": 19476, "name": "SWAP1", "source": 1 }, + { "begin": 19354, "end": 19476, "name": "POP", "source": 1 }, + { "begin": 19098, "end": 19483, "name": "SWAP3", "source": 1 }, + { "begin": 19098, "end": 19483, "name": "SWAP2", "source": 1 }, + { "begin": 19098, "end": 19483, "name": "POP", "source": 1 }, + { "begin": 19098, "end": 19483, "name": "POP", "source": 1 }, { - "begin": 18992, - "end": 19377, + "begin": 19098, + "end": 19483, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 19383, - "end": 19505, + "begin": 19489, + "end": 19630, "name": "tag", "source": 1, - "value": "119" + "value": "117" }, - { "begin": 19383, "end": 19505, "name": "JUMPDEST", "source": 1 }, + { "begin": 19489, "end": 19630, "name": "JUMPDEST", "source": 1 }, { - "begin": 19456, - "end": 19480, + "begin": 19545, + "end": 19550, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { "begin": 19576, "end": 19582, "name": "DUP2", "source": 1 }, + { "begin": 19570, "end": 19583, "name": "MLOAD", "source": 1 }, + { "begin": 19561, "end": 19583, "name": "SWAP1", "source": 1 }, + { "begin": 19561, "end": 19583, "name": "POP", "source": 1 }, + { + "begin": 19592, + "end": 19624, "name": "PUSH [tag]", "source": 1, - "value": "329" + "value": "328" }, - { "begin": 19474, "end": 19479, "name": "DUP2", "source": 1 }, + { "begin": 19618, "end": 19623, "name": "DUP2", "source": 1 }, { - "begin": 19456, - "end": 19480, + "begin": 19592, + "end": 19624, "name": "PUSH [tag]", "source": 1, - "value": "99" + "value": "72" }, { - "begin": 19456, - "end": 19480, + "begin": 19592, + "end": 19624, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 19456, - "end": 19480, + "begin": 19592, + "end": 19624, + "name": "tag", + "source": 1, + "value": "328" + }, + { "begin": 19592, "end": 19624, "name": "JUMPDEST", "source": 1 }, + { "begin": 19489, "end": 19630, "name": "SWAP3", "source": 1 }, + { "begin": 19489, "end": 19630, "name": "SWAP2", "source": 1 }, + { "begin": 19489, "end": 19630, "name": "POP", "source": 1 }, + { "begin": 19489, "end": 19630, "name": "POP", "source": 1 }, + { + "begin": 19489, + "end": 19630, + "name": "JUMP", + "source": 1, + "value": "[out]" + }, + { + "begin": 19636, + "end": 19758, "name": "tag", "source": 1, - "value": "329" + "value": "118" + }, + { "begin": 19636, "end": 19758, "name": "JUMPDEST", "source": 1 }, + { + "begin": 19709, + "end": 19733, + "name": "PUSH [tag]", + "source": 1, + "value": "330" }, - { "begin": 19456, "end": 19480, "name": "JUMPDEST", "source": 1 }, - { "begin": 19449, "end": 19454, "name": "DUP2", "source": 1 }, - { "begin": 19446, "end": 19481, "name": "EQ", "source": 1 }, + { "begin": 19727, "end": 19732, "name": "DUP2", "source": 1 }, { - "begin": 19436, - "end": 19499, + "begin": 19709, + "end": 19733, "name": "PUSH [tag]", "source": 1, + "value": "98" + }, + { + "begin": 19709, + "end": 19733, + "name": "JUMP", + "source": 1, + "value": "[in]" + }, + { + "begin": 19709, + "end": 19733, + "name": "tag", + "source": 1, "value": "330" }, - { "begin": 19436, "end": 19499, "name": "JUMPI", "source": 1 }, + { "begin": 19709, "end": 19733, "name": "JUMPDEST", "source": 1 }, + { "begin": 19702, "end": 19707, "name": "DUP2", "source": 1 }, + { "begin": 19699, "end": 19734, "name": "EQ", "source": 1 }, { - "begin": 19495, - "end": 19496, + "begin": 19689, + "end": 19752, + "name": "PUSH [tag]", + "source": 1, + "value": "331" + }, + { "begin": 19689, "end": 19752, "name": "JUMPI", "source": 1 }, + { + "begin": 19748, + "end": 19749, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 19492, "end": 19493, "name": "DUP1", "source": 1 }, - { "begin": 19485, "end": 19497, "name": "REVERT", "source": 1 }, + { "begin": 19745, "end": 19746, "name": "DUP1", "source": 1 }, + { "begin": 19738, "end": 19750, "name": "REVERT", "source": 1 }, { - "begin": 19436, - "end": 19499, + "begin": 19689, + "end": 19752, "name": "tag", "source": 1, - "value": "330" + "value": "331" }, - { "begin": 19436, "end": 19499, "name": "JUMPDEST", "source": 1 }, - { "begin": 19383, "end": 19505, "name": "POP", "source": 1 }, + { "begin": 19689, "end": 19752, "name": "JUMPDEST", "source": 1 }, + { "begin": 19636, "end": 19758, "name": "POP", "source": 1 }, { - "begin": 19383, - "end": 19505, + "begin": 19636, + "end": 19758, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 19511, - "end": 19654, + "begin": 19764, + "end": 19907, "name": "tag", "source": 1, - "value": "120" + "value": "119" }, - { "begin": 19511, "end": 19654, "name": "JUMPDEST", "source": 1 }, + { "begin": 19764, "end": 19907, "name": "JUMPDEST", "source": 1 }, { - "begin": 19568, - "end": 19573, + "begin": 19821, + "end": 19826, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 19599, "end": 19605, "name": "DUP2", "source": 1 }, - { "begin": 19593, "end": 19606, "name": "MLOAD", "source": 1 }, - { "begin": 19584, "end": 19606, "name": "SWAP1", "source": 1 }, - { "begin": 19584, "end": 19606, "name": "POP", "source": 1 }, + { "begin": 19852, "end": 19858, "name": "DUP2", "source": 1 }, + { "begin": 19846, "end": 19859, "name": "MLOAD", "source": 1 }, + { "begin": 19837, "end": 19859, "name": "SWAP1", "source": 1 }, + { "begin": 19837, "end": 19859, "name": "POP", "source": 1 }, { - "begin": 19615, - "end": 19648, + "begin": 19868, + "end": 19901, "name": "PUSH [tag]", "source": 1, - "value": "332" + "value": "333" }, - { "begin": 19642, "end": 19647, "name": "DUP2", "source": 1 }, + { "begin": 19895, "end": 19900, "name": "DUP2", "source": 1 }, { - "begin": 19615, - "end": 19648, + "begin": 19868, + "end": 19901, "name": "PUSH [tag]", "source": 1, - "value": "119" + "value": "118" }, { - "begin": 19615, - "end": 19648, + "begin": 19868, + "end": 19901, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 19615, - "end": 19648, + "begin": 19868, + "end": 19901, "name": "tag", "source": 1, - "value": "332" + "value": "333" }, - { "begin": 19615, "end": 19648, "name": "JUMPDEST", "source": 1 }, - { "begin": 19511, "end": 19654, "name": "SWAP3", "source": 1 }, - { "begin": 19511, "end": 19654, "name": "SWAP2", "source": 1 }, - { "begin": 19511, "end": 19654, "name": "POP", "source": 1 }, - { "begin": 19511, "end": 19654, "name": "POP", "source": 1 }, + { "begin": 19868, "end": 19901, "name": "JUMPDEST", "source": 1 }, + { "begin": 19764, "end": 19907, "name": "SWAP3", "source": 1 }, + { "begin": 19764, "end": 19907, "name": "SWAP2", "source": 1 }, + { "begin": 19764, "end": 19907, "name": "POP", "source": 1 }, + { "begin": 19764, "end": 19907, "name": "POP", "source": 1 }, { - "begin": 19511, - "end": 19654, + "begin": 19764, + "end": 19907, "name": "JUMP", "source": 1, "value": "[out]" }, { - "begin": 19660, - "end": 19801, + "begin": 19913, + "end": 20572, "name": "tag", "source": 1, - "value": "121" + "value": "57" }, - { "begin": 19660, "end": 19801, "name": "JUMPDEST", "source": 1 }, + { "begin": 19913, "end": 20572, "name": "JUMPDEST", "source": 1 }, { - "begin": 19716, - "end": 19721, + "begin": 19999, + "end": 20005, "name": "PUSH", "source": 1, "value": "0" }, - { "begin": 19747, "end": 19753, "name": "DUP2", "source": 1 }, - { "begin": 19741, "end": 19754, "name": "MLOAD", "source": 1 }, - { "begin": 19732, "end": 19754, "name": "SWAP1", "source": 1 }, - { "begin": 19732, "end": 19754, "name": "POP", "source": 1 }, + { "begin": 20007, "end": 20013, "name": "DUP1", "source": 1 }, { - "begin": 19763, - "end": 19795, - "name": "PUSH [tag]", + "begin": 20015, + "end": 20021, + "name": "PUSH", "source": 1, - "value": "334" + "value": "0" + }, + { + "begin": 20064, + "end": 20066, + "name": "PUSH", + "source": 1, + "value": "60" }, - { "begin": 19789, "end": 19794, "name": "DUP2", "source": 1 }, + { "begin": 20052, "end": 20061, "name": "DUP5", "source": 1 }, + { "begin": 20043, "end": 20050, "name": "DUP7", "source": 1 }, + { "begin": 20039, "end": 20062, "name": "SUB", "source": 1 }, + { "begin": 20035, "end": 20067, "name": "SLT", "source": 1 }, + { "begin": 20032, "end": 20151, "name": "ISZERO", "source": 1 }, { - "begin": 19763, - "end": 19795, + "begin": 20032, + "end": 20151, "name": "PUSH [tag]", "source": 1, - "value": "74" + "value": "335" }, + { "begin": 20032, "end": 20151, "name": "JUMPI", "source": 1 }, { - "begin": 19763, - "end": 19795, - "name": "JUMP", + "begin": 20070, + "end": 20149, + "name": "PUSH [tag]", "source": 1, - "value": "[in]" + "value": "336" }, { - "begin": 19763, - "end": 19795, - "name": "tag", + "begin": 20070, + "end": 20149, + "name": "PUSH [tag]", "source": 1, - "value": "334" + "value": "59" }, - { "begin": 19763, "end": 19795, "name": "JUMPDEST", "source": 1 }, - { "begin": 19660, "end": 19801, "name": "SWAP3", "source": 1 }, - { "begin": 19660, "end": 19801, "name": "SWAP2", "source": 1 }, - { "begin": 19660, "end": 19801, "name": "POP", "source": 1 }, - { "begin": 19660, "end": 19801, "name": "POP", "source": 1 }, { - "begin": 19660, - "end": 19801, + "begin": 20070, + "end": 20149, "name": "JUMP", "source": 1, - "value": "[out]" + "value": "[in]" }, { - "begin": 19807, - "end": 20312, + "begin": 20070, + "end": 20149, "name": "tag", "source": 1, - "value": "59" + "value": "336" }, - { "begin": 19807, "end": 20312, "name": "JUMPDEST", "source": 1 }, + { "begin": 20070, "end": 20149, "name": "JUMPDEST", "source": 1 }, { - "begin": 19885, - "end": 19891, - "name": "PUSH", + "begin": 20032, + "end": 20151, + "name": "tag", "source": 1, - "value": "0" + "value": "335" }, - { "begin": 19893, "end": 19899, "name": "DUP1", "source": 1 }, + { "begin": 20032, "end": 20151, "name": "JUMPDEST", "source": 1 }, { - "begin": 19942, - "end": 19944, + "begin": 20190, + "end": 20191, "name": "PUSH", "source": 1, - "value": "40" - }, - { "begin": 19930, "end": 19939, "name": "DUP4", "source": 1 }, - { "begin": 19921, "end": 19928, "name": "DUP6", "source": 1 }, - { "begin": 19917, "end": 19940, "name": "SUB", "source": 1 }, - { "begin": 19913, "end": 19945, "name": "SLT", "source": 1 }, - { "begin": 19910, "end": 20029, "name": "ISZERO", "source": 1 }, - { - "begin": 19910, - "end": 20029, - "name": "PUSH [tag]", - "source": 1, - "value": "336" + "value": "0" }, - { "begin": 19910, "end": 20029, "name": "JUMPI", "source": 1 }, { - "begin": 19948, - "end": 20027, + "begin": 20215, + "end": 20278, "name": "PUSH [tag]", "source": 1, "value": "337" }, + { "begin": 20270, "end": 20277, "name": "DUP7", "source": 1 }, + { "begin": 20261, "end": 20267, "name": "DUP3", "source": 1 }, + { "begin": 20250, "end": 20259, "name": "DUP8", "source": 1 }, + { "begin": 20246, "end": 20268, "name": "ADD", "source": 1 }, { - "begin": 19948, - "end": 20027, + "begin": 20215, + "end": 20278, "name": "PUSH [tag]", "source": 1, - "value": "61" + "value": "117" }, { - "begin": 19948, - "end": 20027, + "begin": 20215, + "end": 20278, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 19948, - "end": 20027, + "begin": 20215, + "end": 20278, "name": "tag", "source": 1, "value": "337" }, - { "begin": 19948, "end": 20027, "name": "JUMPDEST", "source": 1 }, - { - "begin": 19910, - "end": 20029, - "name": "tag", - "source": 1, - "value": "336" - }, - { "begin": 19910, "end": 20029, "name": "JUMPDEST", "source": 1 }, + { "begin": 20215, "end": 20278, "name": "JUMPDEST", "source": 1 }, + { "begin": 20205, "end": 20278, "name": "SWAP4", "source": 1 }, + { "begin": 20205, "end": 20278, "name": "POP", "source": 1 }, + { "begin": 20161, "end": 20288, "name": "POP", "source": 1 }, { - "begin": 20068, - "end": 20069, + "begin": 20327, + "end": 20329, "name": "PUSH", "source": 1, - "value": "0" + "value": "20" }, { - "begin": 20093, - "end": 20157, + "begin": 20353, + "end": 20417, "name": "PUSH [tag]", "source": 1, "value": "338" }, - { "begin": 20149, "end": 20156, "name": "DUP6", "source": 1 }, - { "begin": 20140, "end": 20146, "name": "DUP3", "source": 1 }, - { "begin": 20129, "end": 20138, "name": "DUP7", "source": 1 }, - { "begin": 20125, "end": 20147, "name": "ADD", "source": 1 }, + { "begin": 20409, "end": 20416, "name": "DUP7", "source": 1 }, + { "begin": 20400, "end": 20406, "name": "DUP3", "source": 1 }, + { "begin": 20389, "end": 20398, "name": "DUP8", "source": 1 }, + { "begin": 20385, "end": 20407, "name": "ADD", "source": 1 }, { - "begin": 20093, - "end": 20157, + "begin": 20353, + "end": 20417, "name": "PUSH [tag]", "source": 1, - "value": "120" + "value": "119" }, { - "begin": 20093, - "end": 20157, + "begin": 20353, + "end": 20417, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 20093, - "end": 20157, + "begin": 20353, + "end": 20417, "name": "tag", "source": 1, "value": "338" }, - { "begin": 20093, "end": 20157, "name": "JUMPDEST", "source": 1 }, - { "begin": 20083, "end": 20157, "name": "SWAP3", "source": 1 }, - { "begin": 20083, "end": 20157, "name": "POP", "source": 1 }, - { "begin": 20039, "end": 20167, "name": "POP", "source": 1 }, + { "begin": 20353, "end": 20417, "name": "JUMPDEST", "source": 1 }, + { "begin": 20343, "end": 20417, "name": "SWAP3", "source": 1 }, + { "begin": 20343, "end": 20417, "name": "POP", "source": 1 }, + { "begin": 20298, "end": 20427, "name": "POP", "source": 1 }, { - "begin": 20206, - "end": 20208, + "begin": 20466, + "end": 20468, "name": "PUSH", "source": 1, - "value": "20" + "value": "40" }, { - "begin": 20232, - "end": 20295, + "begin": 20492, + "end": 20555, "name": "PUSH [tag]", "source": 1, "value": "339" }, - { "begin": 20287, "end": 20294, "name": "DUP6", "source": 1 }, - { "begin": 20278, "end": 20284, "name": "DUP3", "source": 1 }, - { "begin": 20267, "end": 20276, "name": "DUP7", "source": 1 }, - { "begin": 20263, "end": 20285, "name": "ADD", "source": 1 }, + { "begin": 20547, "end": 20554, "name": "DUP7", "source": 1 }, + { "begin": 20538, "end": 20544, "name": "DUP3", "source": 1 }, + { "begin": 20527, "end": 20536, "name": "DUP8", "source": 1 }, + { "begin": 20523, "end": 20545, "name": "ADD", "source": 1 }, { - "begin": 20232, - "end": 20295, + "begin": 20492, + "end": 20555, "name": "PUSH [tag]", "source": 1, - "value": "121" + "value": "117" }, { - "begin": 20232, - "end": 20295, + "begin": 20492, + "end": 20555, "name": "JUMP", "source": 1, "value": "[in]" }, { - "begin": 20232, - "end": 20295, + "begin": 20492, + "end": 20555, "name": "tag", "source": 1, "value": "339" }, - { "begin": 20232, "end": 20295, "name": "JUMPDEST", "source": 1 }, - { "begin": 20222, "end": 20295, "name": "SWAP2", "source": 1 }, - { "begin": 20222, "end": 20295, "name": "POP", "source": 1 }, - { "begin": 20177, "end": 20305, "name": "POP", "source": 1 }, - { "begin": 19807, "end": 20312, "name": "SWAP3", "source": 1 }, - { "begin": 19807, "end": 20312, "name": "POP", "source": 1 }, - { "begin": 19807, "end": 20312, "name": "SWAP3", "source": 1 }, - { "begin": 19807, "end": 20312, "name": "SWAP1", "source": 1 }, - { "begin": 19807, "end": 20312, "name": "POP", "source": 1 }, - { - "begin": 19807, - "end": 20312, + { "begin": 20492, "end": 20555, "name": "JUMPDEST", "source": 1 }, + { "begin": 20482, "end": 20555, "name": "SWAP2", "source": 1 }, + { "begin": 20482, "end": 20555, "name": "POP", "source": 1 }, + { "begin": 20437, "end": 20565, "name": "POP", "source": 1 }, + { "begin": 19913, "end": 20572, "name": "SWAP3", "source": 1 }, + { "begin": 19913, "end": 20572, "name": "POP", "source": 1 }, + { "begin": 19913, "end": 20572, "name": "SWAP3", "source": 1 }, + { "begin": 19913, "end": 20572, "name": "POP", "source": 1 }, + { "begin": 19913, "end": 20572, "name": "SWAP3", "source": 1 }, + { + "begin": 19913, + "end": 20572, "name": "JUMP", "source": 1, "value": "[out]" @@ -19899,20 +20065,20 @@ } }, "ewasm": { "wasm": "" }, - "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"index\",\"type\":\"uint16\"}],\"name\":\"index_to_account\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"parents\",\"type\":\"uint8\"},{\"internalType\":\"bytes[]\",\"name\":\"interior\",\"type\":\"bytes[]\"}],\"internalType\":\"struct XcmTransactor.Multilocation\",\"name\":\"multilocation\",\"type\":\"tuple\"}],\"name\":\"transact_info\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"transactor\",\"type\":\"uint8\"},{\"internalType\":\"uint16\",\"name\":\"index\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"currency_id\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"inner_call\",\"type\":\"bytes\"}],\"name\":\"transact_through_derivative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"transactor\",\"type\":\"uint8\"},{\"internalType\":\"uint16\",\"name\":\"index\",\"type\":\"uint16\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"parents\",\"type\":\"uint8\"},{\"internalType\":\"bytes[]\",\"name\":\"interior\",\"type\":\"bytes[]\"}],\"internalType\":\"struct XcmTransactor.Multilocation\",\"name\":\"fee_asset\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"inner_call\",\"type\":\"bytes\"}],\"name\":\"transact_through_derivative_multilocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xcmtransactor\",\"outputs\":[{\"internalType\":\"contract XcmTransactor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"index_to_account(uint16)\":{\"params\":{\"index\":\"The index of which we want to retrieve the account\"}},\"transact_info((uint8,bytes[]))\":{\"params\":{\"multilocation\":\"The location for which we want to retrieve transact info\"}},\"transact_through_derivative(uint8,uint16,address,uint64,bytes)\":{\"details\":\"The token transfer burns/transfers the corresponding amount before sending\",\"params\":{\"currency_id\":\"Address of the currencyId of the asset to be used for fees It has to be a reserve of the destination chain\",\"index\":\"The index to be used\",\"inner_call\":\"The inner call to be executed in the destination chain\",\"transactor\":\"The transactor to be used\",\"weight\":\"The weight we want to buy in the destination chain\"}},\"transact_through_derivative_multilocation(uint8,uint16,(uint8,bytes[]),uint64,bytes)\":{\"details\":\"The token transfer burns/transfers the corresponding amount before sending\",\"params\":{\"fee_asset\":\"The asset in which we want to pay fees. It has to be a reserve of the destination chain\",\"index\":\"The index to be used\",\"inner_call\":\"The inner call to be executed in the destination chain\",\"transactor\":\"The transactor to be used\",\"weight\":\"The weight we want to buy in the destination chain\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"index_to_account(uint16)\":{\"notice\":\"Get index of an account in xcm transactor\"},\"transact_info((uint8,bytes[]))\":{\"notice\":\"Get transact info of a multilocation Selector 71b0edfa\"},\"transact_through_derivative(uint8,uint16,address,uint64,bytes)\":{\"notice\":\"Transact through XCM using fee based on its currency_id\"},\"transact_through_derivative_multilocation(uint8,uint16,(uint8,bytes[]),uint64,bytes)\":{\"notice\":\"Transact through XCM using fee based on its multilocation\"},\"xcmtransactor()\":{\"notice\":\"The Xcm Transactor wrapper at the known pre-compile address.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"main.sol\":\"XcmTransactorInstance\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"main.sol\":{\"keccak256\":\"0x9d5fe1f89cc8d85ac04f2f509b1c3f50599c8e286dbb119dbadf8c61f1437f13\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://9014f348356e746c196258479e9bdd4749ac10a469afbb4ddb4e245a101e94ab\",\"dweb:/ipfs/QmbmtmmbCoEJMrgBns3Q5iJbZYEWfF46x8LoFvmp7To2QZ\"]}},\"version\":1}", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"index\",\"type\":\"uint16\"}],\"name\":\"index_to_account\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"parents\",\"type\":\"uint8\"},{\"internalType\":\"bytes[]\",\"name\":\"interior\",\"type\":\"bytes[]\"}],\"internalType\":\"struct XcmTransactor.Multilocation\",\"name\":\"multilocation\",\"type\":\"tuple\"}],\"name\":\"transact_info\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"transactor\",\"type\":\"uint8\"},{\"internalType\":\"uint16\",\"name\":\"index\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"currency_id\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"inner_call\",\"type\":\"bytes\"}],\"name\":\"transact_through_derivative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"transactor\",\"type\":\"uint8\"},{\"internalType\":\"uint16\",\"name\":\"index\",\"type\":\"uint16\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"parents\",\"type\":\"uint8\"},{\"internalType\":\"bytes[]\",\"name\":\"interior\",\"type\":\"bytes[]\"}],\"internalType\":\"struct XcmTransactor.Multilocation\",\"name\":\"fee_asset\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"inner_call\",\"type\":\"bytes\"}],\"name\":\"transact_through_derivative_multilocation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xcmtransactor\",\"outputs\":[{\"internalType\":\"contract XcmTransactor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"index_to_account(uint16)\":{\"params\":{\"index\":\"The index of which we want to retrieve the account\"}},\"transact_info((uint8,bytes[]))\":{\"params\":{\"multilocation\":\"The location for which we want to retrieve transact info\"}},\"transact_through_derivative(uint8,uint16,address,uint64,bytes)\":{\"details\":\"The token transfer burns/transfers the corresponding amount before sending\",\"params\":{\"currency_id\":\"Address of the currencyId of the asset to be used for fees It has to be a reserve of the destination chain\",\"index\":\"The index to be used\",\"inner_call\":\"The inner call to be executed in the destination chain\",\"transactor\":\"The transactor to be used\",\"weight\":\"The weight we want to buy in the destination chain\"}},\"transact_through_derivative_multilocation(uint8,uint16,(uint8,bytes[]),uint64,bytes)\":{\"details\":\"The token transfer burns/transfers the corresponding amount before sending\",\"params\":{\"fee_asset\":\"The asset in which we want to pay fees. It has to be a reserve of the destination chain\",\"index\":\"The index to be used\",\"inner_call\":\"The inner call to be executed in the destination chain\",\"transactor\":\"The transactor to be used\",\"weight\":\"The weight we want to buy in the destination chain\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"index_to_account(uint16)\":{\"notice\":\"Get index of an account in xcm transactor\"},\"transact_info((uint8,bytes[]))\":{\"notice\":\"Get transact info of a multilocation Selector 71b0edfa\"},\"transact_through_derivative(uint8,uint16,address,uint64,bytes)\":{\"notice\":\"Transact through XCM using fee based on its currency_id\"},\"transact_through_derivative_multilocation(uint8,uint16,(uint8,bytes[]),uint64,bytes)\":{\"notice\":\"Transact through XCM using fee based on its multilocation\"},\"xcmtransactor()\":{\"notice\":\"The Xcm Transactor wrapper at the known pre-compile address.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"main.sol\":\"XcmTransactorInstance\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"main.sol\":{\"keccak256\":\"0xb14662b54d0168dd23e6f47c545fcee9f418fcf7aee39065bf05317339eaeb5b\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://cea58e5636585ec0d117872fd09bb5315078257a20bb58ad6824fd64ce8664d3\",\"dweb:/ipfs/QmYBG2jamBRmreuajupRiZsPfu8t9nuwu3dyCm4ENunDf4\"]}},\"version\":1}", "storageLayout": { "storage": [ { - "astId": 66, + "astId": 68, "contract": "main.sol:XcmTransactorInstance", "label": "xcmtransactor", "offset": 0, "slot": "0", - "type": "t_contract(XcmTransactor)57" + "type": "t_contract(XcmTransactor)59" } ], "types": { - "t_contract(XcmTransactor)57": { + "t_contract(XcmTransactor)59": { "encoding": "inplace", "label": "contract XcmTransactor", "numberOfBytes": "20" @@ -19941,5 +20107,5 @@ "version": 1 } }, - "sourceCode": "\n // SPDX-License-Identifier: GPL-3.0-only\n pragma solidity >=0.8.0;\n\n /**\n * @title Xcm Transactor Interface\n *\n * The interface through which solidity contracts will interact with xcm transactor pallet\n *\n */\n interface XcmTransactor {\n // A multilocation is defined by its number of parents and the encoded junctions (interior)\n struct Multilocation {\n uint8 parents;\n bytes [] interior;\n }\n\n /** Get index of an account in xcm transactor\n *\n * @param index The index of which we want to retrieve the account\n */\n function index_to_account(uint16 index) external view returns(address);\n\n /** Get transact info of a multilocation\n * Selector 71b0edfa\n * @param multilocation The location for which we want to retrieve transact info\n */\n function transact_info(Multilocation memory multilocation) external view returns(uint256, uint64);\n\n /** Transact through XCM using fee based on its multilocation\n *\n * @dev The token transfer burns/transfers the corresponding amount before sending\n * @param transactor The transactor to be used\n * @param index The index to be used\n * @param fee_asset The asset in which we want to pay fees. \n * It has to be a reserve of the destination chain\n * @param weight The weight we want to buy in the destination chain\n * @param inner_call The inner call to be executed in the destination chain\n */\n function transact_through_derivative_multilocation(\n uint8 transactor,\n uint16 index,\n Multilocation memory fee_asset,\n uint64 weight,\n bytes memory inner_call\n ) external;\n \n /** Transact through XCM using fee based on its currency_id\n *\n * @dev The token transfer burns/transfers the corresponding amount before sending\n * @param transactor The transactor to be used\n * @param index The index to be used\n * @param currency_id Address of the currencyId of the asset to be used for fees\n * It has to be a reserve of the destination chain\n * @param weight The weight we want to buy in the destination chain\n * @param inner_call The inner call to be executed in the destination chain\n */\n function transact_through_derivative(\n uint8 transactor,\n uint16 index,\n address currency_id,\n uint64 weight,\n bytes memory inner_call\n ) external;\n }\n\n contract XcmTransactorInstance is XcmTransactor {\n\n /// The Xcm Transactor wrapper at the known pre-compile address.\n XcmTransactor public xcmtransactor = XcmTransactor(0x0000000000000000000000000000000000000806);\n\n function index_to_account(uint16 index) external view override returns(address) {\n // We nominate our target collator with all the tokens provided\n return xcmtransactor.index_to_account(index);\n }\n\n function transact_info(Multilocation memory multilocation) external view override returns(uint256, uint64) {\n // We nominate our target collator with all the tokens provided\n return xcmtransactor.transact_info(multilocation);\n }\n\n function transact_through_derivative_multilocation(\n uint8 transactor,\n uint16 index,\n Multilocation memory fee_asset,\n uint64 weight,\n bytes memory inner_call\n ) override external {\n xcmtransactor.transact_through_derivative_multilocation(\n transactor,\n index,\n fee_asset,\n weight,\n inner_call\n );\n }\n \n function transact_through_derivative(\n uint8 transactor,\n uint16 index,\n address currency_id,\n uint64 weight,\n bytes memory inner_call\n ) override external {\n xcmtransactor.transact_through_derivative(\n transactor,\n index,\n currency_id,\n weight,\n inner_call\n );\n }\n }" + "sourceCode": "\n // SPDX-License-Identifier: GPL-3.0-only\n pragma solidity >=0.8.0;\n\n /**\n * @title Xcm Transactor Interface\n *\n * The interface through which solidity contracts will interact with xcm transactor pallet\n *\n */\n interface XcmTransactor {\n // A multilocation is defined by its number of parents and the encoded junctions (interior)\n struct Multilocation {\n uint8 parents;\n bytes [] interior;\n }\n\n /** Get index of an account in xcm transactor\n *\n * @param index The index of which we want to retrieve the account\n */\n function index_to_account(uint16 index) external view returns(address);\n\n /** Get transact info of a multilocation\n * Selector 71b0edfa\n * @param multilocation The location for which we want to retrieve transact info\n */\n function transact_info(\n Multilocation memory multilocation) \n external view returns(uint64, uint256, uint64);\n\n /** Transact through XCM using fee based on its multilocation\n *\n * @dev The token transfer burns/transfers the corresponding amount before sending\n * @param transactor The transactor to be used\n * @param index The index to be used\n * @param fee_asset The asset in which we want to pay fees. \n * It has to be a reserve of the destination chain\n * @param weight The weight we want to buy in the destination chain\n * @param inner_call The inner call to be executed in the destination chain\n */\n function transact_through_derivative_multilocation(\n uint8 transactor,\n uint16 index,\n Multilocation memory fee_asset,\n uint64 weight,\n bytes memory inner_call\n ) external;\n \n /** Transact through XCM using fee based on its currency_id\n *\n * @dev The token transfer burns/transfers the corresponding amount before sending\n * @param transactor The transactor to be used\n * @param index The index to be used\n * @param currency_id Address of the currencyId of the asset to be used for fees\n * It has to be a reserve of the destination chain\n * @param weight The weight we want to buy in the destination chain\n * @param inner_call The inner call to be executed in the destination chain\n */\n function transact_through_derivative(\n uint8 transactor,\n uint16 index,\n address currency_id,\n uint64 weight,\n bytes memory inner_call\n ) external;\n }\n\n contract XcmTransactorInstance is XcmTransactor {\n\n /// The Xcm Transactor wrapper at the known pre-compile address.\n XcmTransactor public xcmtransactor = XcmTransactor(0x0000000000000000000000000000000000000806);\n\n function index_to_account(uint16 index) external view override returns(address) {\n // We nominate our target collator with all the tokens provided\n return xcmtransactor.index_to_account(index);\n }\n\n function transact_info(\n Multilocation memory multilocation\n ) external view override returns(uint64, uint256, uint64) {\n // We nominate our target collator with all the tokens provided\n return xcmtransactor.transact_info(multilocation);\n }\n\n function transact_through_derivative_multilocation(\n uint8 transactor,\n uint16 index,\n Multilocation memory fee_asset,\n uint64 weight,\n bytes memory inner_call\n ) override external {\n xcmtransactor.transact_through_derivative_multilocation(\n transactor,\n index,\n fee_asset,\n weight,\n inner_call\n );\n }\n \n function transact_through_derivative(\n uint8 transactor,\n uint16 index,\n address currency_id,\n uint64 weight,\n bytes memory inner_call\n ) override external {\n xcmtransactor.transact_through_derivative(\n transactor,\n index,\n currency_id,\n weight,\n inner_call\n );\n }\n }" } diff --git a/tests/contracts/sources.ts b/tests/contracts/sources.ts index 6156254da6..3e0d1b6c09 100644 --- a/tests/contracts/sources.ts +++ b/tests/contracts/sources.ts @@ -801,7 +801,7 @@ export const contractSources: { [key: string]: string } = { */ function transact_info( Multilocation memory multilocation) - external view returns(uint64, uint256, uint64, uint64, uint256); + external view returns(uint64, uint256, uint64); /** Transact through XCM using fee based on its multilocation * @@ -852,7 +852,7 @@ export const contractSources: { [key: string]: string } = { function transact_info( Multilocation memory multilocation - ) external view override returns(uint64, uint256, uint64, uint64, uint256) { + ) external view override returns(uint64, uint256, uint64) { // We nominate our target collator with all the tokens provided return xcmtransactor.transact_info(multilocation); } diff --git a/tests/tests/test-precompile/test-precompile-xcm-transactor.ts b/tests/tests/test-precompile/test-precompile-xcm-transactor.ts index fb496a3a3c..d141ee0e86 100644 --- a/tests/tests/test-precompile/test-precompile-xcm-transactor.ts +++ b/tests/tests/test-precompile/test-precompile-xcm-transactor.ts @@ -164,10 +164,8 @@ describeDevMoonbeam("Precompiles - xcm transactor", (context) => { expect(tx_call.result).to.equal( "0x0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000000001" + "0000000000000000000000000000000000000000000000000000000000000001" + + "00000000000000000000000000000000000000000000000000000004a817c800" ); }); From c0f698636b354c8623c23a31655bf74f29cb1601 Mon Sep 17 00:00:00 2001 From: gorka Date: Wed, 22 Dec 2021 12:18:06 +0100 Subject: [PATCH 19/66] Toml sort --- runtime/moonbase/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/moonbase/Cargo.toml b/runtime/moonbase/Cargo.toml index 27f52dc767..c5bde9e9d6 100644 --- a/runtime/moonbase/Cargo.toml +++ b/runtime/moonbase/Cargo.toml @@ -260,4 +260,4 @@ try-runtime = [ "pallet-society/try-runtime", "pallet-timestamp/try-runtime", "parachain-staking/try-runtime", -] \ No newline at end of file +] From d036fde2d8bb262e20f35ad6c16206367276641f Mon Sep 17 00:00:00 2001 From: gorka Date: Wed, 22 Dec 2021 16:38:33 +0100 Subject: [PATCH 20/66] Start by using a separate storage for supported assets --- pallets/asset-manager/src/lib.rs | 58 +++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/pallets/asset-manager/src/lib.rs b/pallets/asset-manager/src/lib.rs index a1466883c3..cc6bad33b6 100644 --- a/pallets/asset-manager/src/lib.rs +++ b/pallets/asset-manager/src/lib.rs @@ -130,6 +130,11 @@ pub mod pallet { #[pallet::getter(fn asset_id_units_per_second)] pub type AssetIdUnitsPerSecond = StorageMap<_, Blake2_128Concat, T::AssetId, u128>; + // Supported fee asset payments + #[pallet::storage] + #[pallet::getter(fn supported_fee_payment_assets)] + pub type SupportedFeePaymentAssets = StorageValue<_, Vec, ValueQuery>; + #[pallet::call] impl Pallet { /// Register new asset with the asset manager @@ -165,16 +170,61 @@ pub mod pallet { ) -> DispatchResult { T::AssetModifierOrigin::ensure_origin(origin)?; - ensure!( - AssetIdType::::get(&asset_id).is_some(), - Error::::AssetDoesNotExist - ); + let asset_type = + AssetIdType::::get(&asset_id).ok_or(Error::::AssetDoesNotExist)?; + + // Grab supported assets + let mut supported_assets = SupportedFeePaymentAssets::::get(); + + // If not in our supported asset list, then put it + if !supported_assets.contains(&asset_type) { + supported_assets.push(asset_type); + SupportedFeePaymentAssets::::put(supported_assets); + } AssetIdUnitsPerSecond::::insert(&asset_id, &units_per_second); Self::deposit_event(Event::UnitsPerSecondChanged(asset_id, units_per_second)); Ok(()) } + + /// Change the amount of units we are charging per execution second for a given AssetId + #[pallet::weight(0)] + pub fn remote_supported_asset( + origin: OriginFor, + asset_id: T::AssetId, + ) -> DispatchResult { + T::AssetModifierOrigin::ensure_origin(origin)?; + + let asset_type = + AssetIdType::::get(&asset_id).ok_or(Error::::AssetDoesNotExist)?; + + // Grab supported assets + let mut supported_assets = SupportedFeePaymentAssets::::get(); + + let index = supported_assets + .iter() + .enumerate() + .find_map(|(index, asset)| { + if asset_type == asset.clone() { + Some(index) + } else { + None + } + }) + .ok_or(Error::::AssetDoesNotExist)?; + + // Remove + supported_assets.remove(index); + + // Insert + SupportedFeePaymentAssets::::put(supported_assets); + + // Remove + AssetIdUnitsPerSecond::::remove(&asset_id); + + Ok(()) + } } impl Pallet { From 65ce1d0d2f77c5c8c97370aa788a8b2260f58c7d Mon Sep 17 00:00:00 2001 From: gorka Date: Wed, 22 Dec 2021 16:58:05 +0100 Subject: [PATCH 21/66] Updated tests --- pallets/asset-manager/src/lib.rs | 4 +- pallets/asset-manager/src/tests.rs | 71 ++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/pallets/asset-manager/src/lib.rs b/pallets/asset-manager/src/lib.rs index cc6bad33b6..ebbcb06526 100644 --- a/pallets/asset-manager/src/lib.rs +++ b/pallets/asset-manager/src/lib.rs @@ -117,6 +117,7 @@ pub mod pallet { pub enum Event { AssetRegistered(T::AssetId, T::AssetType, T::AssetRegistrarMetadata), UnitsPerSecondChanged(T::AssetId, u128), + SupportedAssetRemoved(T::AssetId), } /// Stores the asset TYPE @@ -190,7 +191,7 @@ pub mod pallet { /// Change the amount of units we are charging per execution second for a given AssetId #[pallet::weight(0)] - pub fn remote_supported_asset( + pub fn remove_supported_asset( origin: OriginFor, asset_id: T::AssetId, ) -> DispatchResult { @@ -223,6 +224,7 @@ pub mod pallet { // Remove AssetIdUnitsPerSecond::::remove(&asset_id); + Self::deposit_event(Event::SupportedAssetRemoved(asset_id)); Ok(()) } } diff --git a/pallets/asset-manager/src/tests.rs b/pallets/asset-manager/src/tests.rs index 5873fedab7..294c8b0674 100644 --- a/pallets/asset-manager/src/tests.rs +++ b/pallets/asset-manager/src/tests.rs @@ -85,6 +85,7 @@ fn test_root_can_change_units_per_second() { )); assert_eq!(AssetManager::asset_id_units_per_second(1).unwrap(), 200); + assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); expect_events(vec![ crate::Event::AssetRegistered(1, MockAssetType::MockAsset(1), 0), @@ -93,6 +94,71 @@ fn test_root_can_change_units_per_second() { }); } +#[test] +fn test_change_units_per_second_after_setting_it_once() { + new_test_ext().execute_with(|| { + assert_ok!(AssetManager::register_asset( + Origin::root(), + MockAssetType::MockAsset(1), + 0u32.into(), + 1u32.into(), + )); + + assert_ok!(AssetManager::set_asset_units_per_second( + Origin::root(), + 1, + 200u128.into() + )); + + assert_eq!(AssetManager::asset_id_units_per_second(1).unwrap(), 200); + assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); + + assert_ok!(AssetManager::set_asset_units_per_second( + Origin::root(), + 1, + 100u128.into() + )); + + assert_eq!(AssetManager::asset_id_units_per_second(1).unwrap(), 100); + assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); + + expect_events(vec![ + crate::Event::AssetRegistered(1, MockAssetType::MockAsset(1), 0), + crate::Event::UnitsPerSecondChanged(1, 200), + crate::Event::UnitsPerSecondChanged(1, 100), + ]); + }); +} + +#[test] +fn test_root_can_change_units_per_second_and_then_remove() { + new_test_ext().execute_with(|| { + assert_ok!(AssetManager::register_asset( + Origin::root(), + MockAssetType::MockAsset(1), + 0u32.into(), + 1u32.into(), + )); + + assert_ok!(AssetManager::set_asset_units_per_second( + Origin::root(), + 1, + 200u128.into() + )); + + assert_eq!(AssetManager::asset_id_units_per_second(1).unwrap(), 200); + assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); + + assert_ok!(AssetManager::remove_supported_asset(Origin::root(), 1,)); + + expect_events(vec![ + crate::Event::AssetRegistered(1, MockAssetType::MockAsset(1), 0), + crate::Event::UnitsPerSecondChanged(1, 200), + crate::Event::SupportedAssetRemoved(1), + ]); + }); +} + #[test] fn test_asset_id_non_existent_error() { new_test_ext().execute_with(|| { @@ -100,5 +166,10 @@ fn test_asset_id_non_existent_error() { AssetManager::set_asset_units_per_second(Origin::root(), 1, 200u128.into()), Error::::AssetDoesNotExist ); + + assert_noop!( + AssetManager::remove_supported_asset(Origin::root(), 1), + Error::::AssetDoesNotExist + ); }); } From 8c001115a685616f444ac3612001190f1c48d5b0 Mon Sep 17 00:00:00 2001 From: gorka Date: Wed, 22 Dec 2021 17:49:22 +0100 Subject: [PATCH 22/66] Add usage of new storage item to trader --- pallets/asset-manager/src/lib.rs | 18 ++++++++++-------- pallets/asset-manager/src/tests.rs | 8 ++++---- primitives/xcm/src/lib.rs | 8 ++++++++ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/pallets/asset-manager/src/lib.rs b/pallets/asset-manager/src/lib.rs index ebbcb06526..42f1469d0f 100644 --- a/pallets/asset-manager/src/lib.rs +++ b/pallets/asset-manager/src/lib.rs @@ -49,6 +49,7 @@ pub mod pallet { use frame_system::pallet_prelude::*; use parity_scale_codec::HasCompact; use sp_runtime::traits::{AccountIdConversion, AtLeast32BitUnsigned}; + use sp_std::vec::Vec; #[pallet::pallet] pub struct Pallet(PhantomData); @@ -74,6 +75,9 @@ pub mod pallet { } impl xcm_primitives::UnitsToWeightRatio for Pallet { + fn payment_is_supported(asset_id: T::AssetId) -> bool { + SupportedFeePaymentAssets::::get().contains(&asset_id) + } fn get_units_per_second(asset_id: T::AssetId) -> Option { AssetIdUnitsPerSecond::::get(asset_id) } @@ -134,7 +138,7 @@ pub mod pallet { // Supported fee asset payments #[pallet::storage] #[pallet::getter(fn supported_fee_payment_assets)] - pub type SupportedFeePaymentAssets = StorageValue<_, Vec, ValueQuery>; + pub type SupportedFeePaymentAssets = StorageValue<_, Vec, ValueQuery>; #[pallet::call] impl Pallet { @@ -171,15 +175,14 @@ pub mod pallet { ) -> DispatchResult { T::AssetModifierOrigin::ensure_origin(origin)?; - let asset_type = - AssetIdType::::get(&asset_id).ok_or(Error::::AssetDoesNotExist)?; + AssetIdType::::get(&asset_id).ok_or(Error::::AssetDoesNotExist)?; // Grab supported assets let mut supported_assets = SupportedFeePaymentAssets::::get(); // If not in our supported asset list, then put it - if !supported_assets.contains(&asset_type) { - supported_assets.push(asset_type); + if !supported_assets.contains(&asset_id) { + supported_assets.push(asset_id); SupportedFeePaymentAssets::::put(supported_assets); } @@ -197,8 +200,7 @@ pub mod pallet { ) -> DispatchResult { T::AssetModifierOrigin::ensure_origin(origin)?; - let asset_type = - AssetIdType::::get(&asset_id).ok_or(Error::::AssetDoesNotExist)?; + AssetIdType::::get(&asset_id).ok_or(Error::::AssetDoesNotExist)?; // Grab supported assets let mut supported_assets = SupportedFeePaymentAssets::::get(); @@ -207,7 +209,7 @@ pub mod pallet { .iter() .enumerate() .find_map(|(index, asset)| { - if asset_type == asset.clone() { + if asset_id == asset.clone() { Some(index) } else { None diff --git a/pallets/asset-manager/src/tests.rs b/pallets/asset-manager/src/tests.rs index 294c8b0674..58e38ee3d4 100644 --- a/pallets/asset-manager/src/tests.rs +++ b/pallets/asset-manager/src/tests.rs @@ -85,7 +85,7 @@ fn test_root_can_change_units_per_second() { )); assert_eq!(AssetManager::asset_id_units_per_second(1).unwrap(), 200); - assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); + assert!(AssetManager::supported_fee_payment_assets().contains(&1)); expect_events(vec![ crate::Event::AssetRegistered(1, MockAssetType::MockAsset(1), 0), @@ -111,7 +111,7 @@ fn test_change_units_per_second_after_setting_it_once() { )); assert_eq!(AssetManager::asset_id_units_per_second(1).unwrap(), 200); - assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); + assert!(AssetManager::supported_fee_payment_assets().contains(&1)); assert_ok!(AssetManager::set_asset_units_per_second( Origin::root(), @@ -120,7 +120,7 @@ fn test_change_units_per_second_after_setting_it_once() { )); assert_eq!(AssetManager::asset_id_units_per_second(1).unwrap(), 100); - assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); + assert!(AssetManager::supported_fee_payment_assets().contains(&1)); expect_events(vec![ crate::Event::AssetRegistered(1, MockAssetType::MockAsset(1), 0), @@ -147,7 +147,7 @@ fn test_root_can_change_units_per_second_and_then_remove() { )); assert_eq!(AssetManager::asset_id_units_per_second(1).unwrap(), 200); - assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); + assert!(AssetManager::supported_fee_payment_assets().contains(&1)); assert_ok!(AssetManager::remove_supported_asset(Origin::root(), 1,)); diff --git a/primitives/xcm/src/lib.rs b/primitives/xcm/src/lib.rs index dad03c6cf3..42971eff39 100644 --- a/primitives/xcm/src/lib.rs +++ b/primitives/xcm/src/lib.rs @@ -150,6 +150,12 @@ impl< (xcmAssetId::Concrete(id), Fungibility::Fungible(_)) => { let asset_type: AssetType = id.clone().into(); let asset_id: AssetId = AssetId::from(asset_type); + // Shortcut if we know the asset is not supported + // This involves the same db read per block, mitigating any attack based on + // non-supported assets + if !AssetIdInfoGetter::payment_is_supported(asset_id.clone()) { + return Err(XcmError::TooExpensive); + } if let Some(units_per_second) = AssetIdInfoGetter::get_units_per_second(asset_id) { let amount = units_per_second * (weight as u128) / (WEIGHT_PER_SECOND as u128); let required = MultiAsset { @@ -275,6 +281,8 @@ pub trait AssetTypeGetter { // Defines the trait to obtain the units per second of a give assetId for local execution // This parameter will be used to charge for fees upon assetId deposit pub trait UnitsToWeightRatio { + // Whether payment in a particular assetId is suppotrted + fn payment_is_supported(asset_id: AssetId) -> bool; // Get units per second from asset type fn get_units_per_second(asset_id: AssetId) -> Option; } From 1b432c0d9d241a0f23ca99920e9528eb32656f18 Mon Sep 17 00:00:00 2001 From: gorka Date: Thu, 23 Dec 2021 13:31:25 +0100 Subject: [PATCH 23/66] Add migration and first test --- Cargo.lock | 1 + pallets/asset-manager/Cargo.toml | 1 + pallets/asset-manager/src/lib.rs | 1 + pallets/asset-manager/src/tests.rs | 35 +++++++++++++++++++++++++++++- 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 8ab40764bd..d1ef70587d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6251,6 +6251,7 @@ dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "log", "pallet-balances", "parity-scale-codec", "scale-info", diff --git a/pallets/asset-manager/Cargo.toml b/pallets/asset-manager/Cargo.toml index 7a6714a440..19e2039cb4 100644 --- a/pallets/asset-manager/Cargo.toml +++ b/pallets/asset-manager/Cargo.toml @@ -6,6 +6,7 @@ version = "0.1.0" [dependencies] serde = { version = "1.0.124", optional = true } +log = { version = "0.4", default-features = false } # Moonbeam xcm-primitives = { path = "../../primitives/xcm/", default-features = false } diff --git a/pallets/asset-manager/src/lib.rs b/pallets/asset-manager/src/lib.rs index 42f1469d0f..ea3ab4aad5 100644 --- a/pallets/asset-manager/src/lib.rs +++ b/pallets/asset-manager/src/lib.rs @@ -35,6 +35,7 @@ use frame_support::pallet; pub use pallet::*; #[cfg(any(test, feature = "runtime-benchmarks"))] mod benchmarks; +pub mod migrations; #[cfg(test)] pub mod mock; #[cfg(test)] diff --git a/pallets/asset-manager/src/tests.rs b/pallets/asset-manager/src/tests.rs index 58e38ee3d4..e7f484f414 100644 --- a/pallets/asset-manager/src/tests.rs +++ b/pallets/asset-manager/src/tests.rs @@ -18,7 +18,9 @@ use crate::*; use mock::*; -use frame_support::{assert_noop, assert_ok}; +use frame_support::{ + assert_noop, assert_ok, storage::migration::put_storage_value, Blake2_128Concat, +}; #[test] fn registering_works() { @@ -173,3 +175,34 @@ fn test_asset_id_non_existent_error() { ); }); } + +#[test] +fn test_populate_supported_fee_payment_assets_works() { + new_test_ext().execute_with(|| { + use frame_support::StorageHasher; + let pallet_prefix: &[u8] = b"AssetManager"; + let storage_item_prefix: &[u8] = b"AssetIdUnitsPerSecond"; + use frame_support::traits::OnRuntimeUpgrade; + use parity_scale_codec::Encode; + + put_storage_value( + pallet_prefix, + storage_item_prefix, + &Blake2_128Concat::hash(&1u32.encode()), + 10u128, + ); + + assert_noop!( + AssetManager::set_asset_units_per_second(Origin::root(), 1, 200u128.into()), + Error::::AssetDoesNotExist + ); + + assert!(AssetManager::supported_fee_payment_assets().len() == 0); + + // We run the migration + crate::migrations::PopulateSupportedFeePaymentAssets::::on_runtime_upgrade(); + + assert!(AssetManager::supported_fee_payment_assets().len() == 1); + assert!(AssetManager::supported_fee_payment_assets().contains(&1)); + }); +} From 07629f658a46fb56e65b953bea85ca20b5c862f0 Mon Sep 17 00:00:00 2001 From: gorka Date: Thu, 23 Dec 2021 15:34:29 +0100 Subject: [PATCH 24/66] Add migration to migrations --- runtime/common/Cargo.toml | 2 +- runtime/common/src/migrations.rs | 35 ++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 2b0f7e4e7c..8e61cb488c 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -42,4 +42,4 @@ std = [ "sp-std/std", "xcm-transactor/std", ] -xcm-support = [ "xcm-transactor" ] +xcm-support = [ "xcm-transactor", "pallet-asset-manager" ] diff --git a/runtime/common/src/migrations.rs b/runtime/common/src/migrations.rs index c30c471f63..3c32279644 100644 --- a/runtime/common/src/migrations.rs +++ b/runtime/common/src/migrations.rs @@ -21,6 +21,11 @@ use frame_support::{ traits::{OnRuntimeUpgrade, PalletInfoAccess}, weights::Weight, }; + +#[cfg(feature = "xcm-support")] +use pallet_asset_manager::{ + migrations::PopulateSupportedFeePaymentAssets, Config as AssetManagerConfig, +}; use pallet_author_mapping::{migrations::TwoXToBlake, Config as AuthorMappingConfig}; use pallet_migrations::{GetMigrations, Migration}; use parachain_staking::{ @@ -30,7 +35,6 @@ use parachain_staking::{ use sp_std::{marker::PhantomData, prelude::*}; #[cfg(feature = "xcm-support")] use xcm_transactor::{migrations::MaxTransactWeight, Config as XcmTransactorConfig}; - /// This module acts as a registry where each migration is defined. Each migration should implement /// the "Migration" trait declared in the pallet-migrations crate. @@ -193,6 +197,31 @@ impl Migration for XcmTransactorMaxTransactWeight { } } +#[cfg(feature = "xcm-support")] +pub struct XcmPaymentSupportedAssets(PhantomData); +#[cfg(feature = "xcm-support")] +impl Migration for XcmPaymentSupportedAssets { + fn friendly_name(&self) -> &str { + "MM_Xcm_Payment_Supported_Assets" + } + + fn migrate(&self, _available_weight: Weight) -> Weight { + PopulateSupportedFeePaymentAssets::::on_runtime_upgrade() + } + + /// Run a standard pre-runtime test. This works the same way as in a normal runtime upgrade. + #[cfg(feature = "try-runtime")] + fn pre_upgrade(&self) -> Result<(), &'static str> { + PopulateSupportedFeePaymentAssets::::pre_upgrade() + } + + /// Run a standard post-runtime test. This works the same way as in a normal runtime upgrade. + #[cfg(feature = "try-runtime")] + fn post_upgrade(&self) -> Result<(), &'static str> { + PopulateSupportedFeePaymentAssets::::post_upgrade() + } +} + pub struct CommonMigrations(PhantomData<(Runtime, Council, Tech)>); impl GetMigrations for CommonMigrations @@ -235,11 +264,12 @@ pub struct XcmMigrations(PhantomData); #[cfg(feature = "xcm-support")] impl GetMigrations for XcmMigrations where - Runtime: xcm_transactor::Config + pallet_migrations::Config, + Runtime: xcm_transactor::Config + pallet_asset_manager::Config + pallet_migrations::Config, { fn get_migrations() -> Vec> { let xcm_transactor_max_weight = XcmTransactorMaxTransactWeight::(Default::default()); + let xcm_supported_assets = XcmPaymentSupportedAssets::(Default::default()); // TODO: this is a lot of allocation to do upon every get() call. this *should* be avoided // except when pallet_migrations undergoes a runtime upgrade -- but TODO: review @@ -254,6 +284,7 @@ where // completed in runtime 1000 // Box::new(migration_parachain_staking_manual_exits), Box::new(xcm_transactor_max_weight), + Box::new(xcm_supported_assets), ] } } From 8b64ad9d9c24d7cb610bb011253c4685cd7b7492 Mon Sep 17 00:00:00 2001 From: gorka Date: Thu, 23 Dec 2021 16:06:07 +0100 Subject: [PATCH 25/66] Commit migrations --- pallets/asset-manager/src/migrations.rs | 133 ++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 pallets/asset-manager/src/migrations.rs diff --git a/pallets/asset-manager/src/migrations.rs b/pallets/asset-manager/src/migrations.rs new file mode 100644 index 0000000000..a7eca97387 --- /dev/null +++ b/pallets/asset-manager/src/migrations.rs @@ -0,0 +1,133 @@ +// Copyright 2019-2021 PureStake Inc. +// This file is part of Moonbeam. + +// Moonbeam is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Moonbeam is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Moonbeam. If not, see . + +use crate::{Config, SupportedFeePaymentAssets}; +use frame_support::{ + pallet_prelude::PhantomData, + storage::migration::storage_key_iter, + traits::{Get, OnRuntimeUpgrade}, + weights::Weight, + Blake2_128Concat, +}; +use sp_std::convert::TryInto; +//TODO sometimes this is unused, sometimes its necessary +use sp_std::vec::Vec; + +pub struct PopulateSupportedFeePaymentAssets(PhantomData); +impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { + fn on_runtime_upgrade() -> Weight { + log::info!(target: "PopulateSupportedFeePaymentAssets", "actually running it"); + let pallet_prefix: &[u8] = b"AssetManager"; + let storage_item_prefix: &[u8] = b"AssetIdUnitsPerSecond"; + + // Read all the data into memory. + // https://crates.parity.io/frame_support/storage/migration/fn.storage_key_iter.html + let stored_data: Vec<_> = storage_key_iter::( + pallet_prefix, + storage_item_prefix, + ) + .collect(); + + let migrated_count: Weight = stored_data + .len() + .try_into() + .expect("There are between 0 and 2**64 mappings stored."); + + log::info!(target: "AssetIdUnitsPerSecond", "Migrating {:?} elements", migrated_count); + + // Collect in a vec + let mut supported_assets: Vec = Vec::new(); + for (asset_id, _) in stored_data { + supported_assets.push(asset_id); + } + + // Push value + SupportedFeePaymentAssets::::put(supported_assets); + + log::info!(target: "AssetIdUnitsPerSecond", "almost done"); + + // Return the weight used. For each migrated mapping there is a red to get it into + // memory + // A final one write makes it push to the new storage item + let db_weights = T::DbWeight::get(); + let weight = migrated_count.saturating_mul(db_weights.read); + weight.saturating_add(db_weights.write) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result<(), &'static str> { + use frame_support::storage::migration::{storage_iter, storage_key_iter}; + use frame_support::traits::OnRuntimeUpgradeHelpersExt; + + let pallet_prefix: &[u8] = b"AssetManager"; + let storage_item_prefix: &[u8] = b"AssetIdUnitsPerSecond"; + + // We want to test that: + // There are no entries in the new storage beforehand + // The same number of mappings exist before and after + // As long as there are some mappings stored, one representative key maps to the + // same value after the migration. + // There are no entries in the old storage afterward + + // Assert new storage is empty + // Because the pallet and item prefixes are the same, the old storage is still at this + // key. However, the values can't be decoded so the assertion passes. + assert!(SupportedFeePaymentAssets::::get().len() == 0); + + // Check number of entries, and set it aside in temp storage + let stored_data: Vec<_> = storage_key_iter::( + pallet_prefix, + storage_item_prefix, + ) + .collect(); + let mapping_count = stored_data.len(); + Self::set_temp_storage(mapping_count as u32, "mapping_count"); + + // Read an example pair from old storage and set it aside in temp storage + if mapping_count > 0 { + let example_key = stored_data + .iter() + .next() + .expect("We already confirmed that there was at least one item stored") + .0; + + Self::set_temp_storage(example_key, "example_key"); + } + + Ok(()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade() -> Result<(), &'static str> { + use frame_support::traits::OnRuntimeUpgradeHelpersExt; + + // Check number of entries matches what was set aside in pre_upgrade + let old_mapping_count: u64 = Self::get_temp_storage("mapping_count") + .expect("We stored a mapping count; it should be there; qed"); + let new_mapping_count = SupportedFeePaymentAssets::::get().len() as u64; + assert_eq!(old_mapping_count, new_mapping_count); + + // Check that our example pair is still well-mapped after the migration + if new_mapping_count > 0 { + let asset_id: T::AssetId = Self::get_temp_storage("example_pair").expect("qed"); + let migrated_info = SupportedFeePaymentAssets::::get(); + // Check that the asset_id exists in migrated_info + assert!(migrated_info.contais(asset_id)); + } + + Ok(()) + } +} From 77137f435bd11bdb46acb94067f2d2c62d4cd220 Mon Sep 17 00:00:00 2001 From: gorka Date: Thu, 23 Dec 2021 16:06:55 +0100 Subject: [PATCH 26/66] Cargo sort --- pallets/asset-manager/Cargo.toml | 2 +- runtime/common/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pallets/asset-manager/Cargo.toml b/pallets/asset-manager/Cargo.toml index 19e2039cb4..12ab635a2c 100644 --- a/pallets/asset-manager/Cargo.toml +++ b/pallets/asset-manager/Cargo.toml @@ -5,8 +5,8 @@ edition = "2018" version = "0.1.0" [dependencies] -serde = { version = "1.0.124", optional = true } log = { version = "0.4", default-features = false } +serde = { version = "1.0.124", optional = true } # Moonbeam xcm-primitives = { path = "../../primitives/xcm/", default-features = false } diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 8e61cb488c..922b3a9fee 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -42,4 +42,4 @@ std = [ "sp-std/std", "xcm-transactor/std", ] -xcm-support = [ "xcm-transactor", "pallet-asset-manager" ] +xcm-support = [ "pallet-asset-manager", "xcm-transactor" ] From b0104668f2cd5bfa296814affd25ded5d11446ac Mon Sep 17 00:00:00 2001 From: gorka Date: Thu, 23 Dec 2021 17:33:50 +0100 Subject: [PATCH 27/66] Update benchmarks --- pallets/asset-manager/src/benchmarks.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pallets/asset-manager/src/benchmarks.rs b/pallets/asset-manager/src/benchmarks.rs index 314c3d2e1b..d0784fdb6d 100644 --- a/pallets/asset-manager/src/benchmarks.rs +++ b/pallets/asset-manager/src/benchmarks.rs @@ -43,8 +43,24 @@ benchmarks! { }: _(RawOrigin::Root, asset_id, 1) verify { + assert!(Pallet::::supported_fee_payment_assets().contains(&asset_id)); assert_eq!(Pallet::::asset_id_units_per_second(asset_id), Some(1)); } + + remove_supported_asset { + // does not really matter what we register + let asset_type = T::AssetType::default(); + let metadata = T::AssetRegistrarMetadata::default(); + let amount = 1u32.into(); + let asset_id: T::AssetId = asset_type.clone().into(); + Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount)?; + Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_id, 1)?; + }: _(RawOrigin::Root, asset_id) + verify { + assert!(Pallet::::supported_fee_payment_assets().is_empty()); + assert_eq!(Pallet::::asset_id_units_per_second(asset_id), None); + + } } #[cfg(test)] From decbd6fbf40b43a1f8aa841647ff3b72e6ecc85a Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 27 Dec 2021 10:50:35 +0100 Subject: [PATCH 28/66] adapt tests to master --- Cargo.lock | 4 ++-- pallets/xcm-transactor/src/tests.rs | 2 +- runtime/moonbase/tests/integration_test.rs | 2 +- runtime/moonriver/tests/integration_test.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b9000e1a21..c17400bdac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7121,7 +7121,7 @@ dependencies = [ "environmental", "frame-support", "frame-system", - "impl-trait-for-tuples 0.2.1", + "impl-trait-for-tuples", "log", "parity-scale-codec", "scale-info", @@ -10002,7 +10002,7 @@ version = "0.8.0-dev" dependencies = [ "frame-support", "frame-system", - "impl-trait-for-tuples 0.2.1", + "impl-trait-for-tuples", "log", "pallet-asset-manager", "pallet-author-mapping", diff --git a/pallets/xcm-transactor/src/tests.rs b/pallets/xcm-transactor/src/tests.rs index c987da24ff..9f0b54297a 100644 --- a/pallets/xcm-transactor/src/tests.rs +++ b/pallets/xcm-transactor/src/tests.rs @@ -114,7 +114,7 @@ fn test_transact_through_derivative_errors() { // Root can set transact info assert_ok!(XcmTransactor::set_transact_info( Origin::root(), - xcm::VersionedMultiLocation::V1(MultiLocation::parent()), + Box::new(xcm::VersionedMultiLocation::V1(MultiLocation::parent())), 0, 1, 10000 diff --git a/runtime/moonbase/tests/integration_test.rs b/runtime/moonbase/tests/integration_test.rs index 29c1339a98..9677eaf4fa 100644 --- a/runtime/moonbase/tests/integration_test.rs +++ b/runtime/moonbase/tests/integration_test.rs @@ -1710,7 +1710,7 @@ fn transactor_cannot_use_more_than_max_weight() { // Root can set transact info assert_ok!(XcmTransactor::set_transact_info( root_origin(), - xcm::VersionedMultiLocation::V1(MultiLocation::parent()), + Box::new(xcm::VersionedMultiLocation::V1(MultiLocation::parent())), // Relay charges 1000 for every instruction, and we have 3, so 3000 3000, 1, diff --git a/runtime/moonriver/tests/integration_test.rs b/runtime/moonriver/tests/integration_test.rs index 70e988a15b..80d030dec3 100644 --- a/runtime/moonriver/tests/integration_test.rs +++ b/runtime/moonriver/tests/integration_test.rs @@ -1839,7 +1839,7 @@ fn transactor_cannot_use_more_than_max_weight() { // Root can set transact info assert_ok!(XcmTransactor::set_transact_info( root_origin(), - xcm::VersionedMultiLocation::V1(MultiLocation::parent()), + Box::new(xcm::VersionedMultiLocation::V1(MultiLocation::parent())), // Relay charges 1000 for every instruction, and we have 3, so 3000 3000, 1, From 87de8b1af669fbe1862f57860164698b819e3cf5 Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 27 Dec 2021 11:42:48 +0100 Subject: [PATCH 29/66] Adapt tests and remove unneded polkadot-runtime-common --- pallets/xcm-transactor/Cargo.toml | 3 +-- pallets/xcm-transactor/src/tests.rs | 5 +---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/pallets/xcm-transactor/Cargo.toml b/pallets/xcm-transactor/Cargo.toml index 03f032b0e3..3c71303fa8 100644 --- a/pallets/xcm-transactor/Cargo.toml +++ b/pallets/xcm-transactor/Cargo.toml @@ -25,7 +25,6 @@ cumulus-primitives-core = { git = "https://github.com/purestake/cumulus", branch # Polkadot / XCM orml-traits = { git = "https://github.com/purestake/open-runtime-module-library", branch = "moonbeam-polkadot-v0.9.13", default-features = false } -polkadot-runtime-common = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.13", default-features = false } xcm = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.13", default-features = false } xcm-builder = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.13", default-features = false } xcm-executor = { git = "https://github.com/purestake/polkadot", branch = "moonbeam-polkadot-v0.9.13", default-features = false } @@ -44,7 +43,6 @@ std = [ "frame-support/std", "frame-system/std", "parity-scale-codec/std", - "polkadot-runtime-common/std", "serde", "sp-io/std", "sp-runtime/std", @@ -52,5 +50,6 @@ std = [ "xcm-executor/std", "xcm-primitives/std", "xcm/std", + "orml-traits/std", ] try-runtime = [ "frame-support/try-runtime" ] diff --git a/pallets/xcm-transactor/src/tests.rs b/pallets/xcm-transactor/src/tests.rs index 9f0b54297a..e2e37c3457 100644 --- a/pallets/xcm-transactor/src/tests.rs +++ b/pallets/xcm-transactor/src/tests.rs @@ -126,10 +126,7 @@ fn test_transact_through_derivative_errors() { Origin::signed(1u64), Transactors::Relay, 1, - Box::new(xcm::VersionedMultiLocation::V1(MultiLocation::new( - 1, - Junctions::X1(Junction::PalletInstance(1)) - ))), + Box::new(xcm::VersionedMultiLocation::V1(MultiLocation::parent())), 10001u64, vec![0u8] ), From b97d5d1bd52cbf8c03ca8c84024bb4e1019a3c10 Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 27 Dec 2021 11:43:07 +0100 Subject: [PATCH 30/66] Cargo lock --- Cargo.lock | 1 - 1 file changed, 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index c17400bdac..23306733f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13901,7 +13901,6 @@ dependencies = [ "pallet-timestamp", "pallet-xcm", "parity-scale-codec", - "polkadot-runtime-common", "scale-info", "serde", "sp-core", From 915bdecfbccc188a7bce72cb346fbc1f341bbd36 Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 27 Dec 2021 11:45:28 +0100 Subject: [PATCH 31/66] Cargo sort --- pallets/xcm-transactor/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/xcm-transactor/Cargo.toml b/pallets/xcm-transactor/Cargo.toml index 3c71303fa8..b2b322efe4 100644 --- a/pallets/xcm-transactor/Cargo.toml +++ b/pallets/xcm-transactor/Cargo.toml @@ -42,6 +42,7 @@ std = [ "cumulus-primitives-core/std", "frame-support/std", "frame-system/std", + "orml-traits/std", "parity-scale-codec/std", "serde", "sp-io/std", @@ -50,6 +51,5 @@ std = [ "xcm-executor/std", "xcm-primitives/std", "xcm/std", - "orml-traits/std", ] try-runtime = [ "frame-support/try-runtime" ] From 87636a5a67eae24d773d8100b122d875eac483a8 Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 28 Dec 2021 09:24:33 +0100 Subject: [PATCH 32/66] Adapt to latest asset manager --- pallets/asset-manager/src/tests.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pallets/asset-manager/src/tests.rs b/pallets/asset-manager/src/tests.rs index 2cfd6aecf5..b63b3a4ec8 100644 --- a/pallets/asset-manager/src/tests.rs +++ b/pallets/asset-manager/src/tests.rs @@ -108,6 +108,7 @@ fn test_change_units_per_second_after_setting_it_once() { MockAssetType::MockAsset(1), 0u32.into(), 1u32.into(), + true, )); assert_ok!(AssetManager::set_asset_units_per_second( @@ -144,6 +145,7 @@ fn test_root_can_change_units_per_second_and_then_remove() { MockAssetType::MockAsset(1), 0u32.into(), 1u32.into(), + true, )); assert_ok!(AssetManager::set_asset_units_per_second( From 25a212e28fcd473ed112f2d4db87346c03322c83 Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 28 Dec 2021 16:36:22 +0100 Subject: [PATCH 33/66] Update benchmark --- pallets/asset-manager/src/benchmarks.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/asset-manager/src/benchmarks.rs b/pallets/asset-manager/src/benchmarks.rs index 950eff92ed..b2de870bf8 100644 --- a/pallets/asset-manager/src/benchmarks.rs +++ b/pallets/asset-manager/src/benchmarks.rs @@ -53,7 +53,7 @@ benchmarks! { let metadata = T::AssetRegistrarMetadata::default(); let amount = 1u32.into(); let asset_id: T::AssetId = asset_type.clone().into(); - Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount)?; + Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?; Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_id, 1)?; }: _(RawOrigin::Root, asset_id) verify { From 4ee189c77fb62a479b457595cfb099cc1bf80d1d Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 28 Dec 2021 18:40:07 +0100 Subject: [PATCH 34/66] Update weights --- pallets/asset-manager/src/lib.rs | 2 +- pallets/asset-manager/src/weights.rs | 29 +++++++++++++++++++--------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/pallets/asset-manager/src/lib.rs b/pallets/asset-manager/src/lib.rs index f1e44112c0..da435b765e 100644 --- a/pallets/asset-manager/src/lib.rs +++ b/pallets/asset-manager/src/lib.rs @@ -197,7 +197,7 @@ pub mod pallet { } /// Change the amount of units we are charging per execution second for a given AssetId - #[pallet::weight(0)] + #[pallet::weight(T::WeightInfo::remove_supported_asset())] pub fn remove_supported_asset( origin: OriginFor, asset_id: T::AssetId, diff --git a/pallets/asset-manager/src/weights.rs b/pallets/asset-manager/src/weights.rs index 643cb96fad..d0491d344a 100644 --- a/pallets/asset-manager/src/weights.rs +++ b/pallets/asset-manager/src/weights.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for pallet_asset_manager //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2021-11-15, STEPS: `32`, REPEAT: 64, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-12-28, STEPS: `32`, REPEAT: 64, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 128 // Executed Command: @@ -54,33 +54,44 @@ use sp_std::marker::PhantomData; pub trait WeightInfo { fn register_asset() -> Weight; fn set_asset_units_per_second() -> Weight; + fn remove_supported_asset() -> Weight; } /// Weights for pallet_asset_manager using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { fn register_asset() -> Weight { - (52_572_000 as Weight) + (51_598_000 as Weight) .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(5 as Weight)) } fn set_asset_units_per_second() -> Weight { - (22_860_000 as Weight) - .saturating_add(T::DbWeight::get().reads(5 as Weight)) - .saturating_add(T::DbWeight::get().writes(3 as Weight)) + (27_252_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn remove_supported_asset() -> Weight { + (27_820_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) } } // For backwards compatibility and tests impl WeightInfo for () { fn register_asset() -> Weight { - (52_572_000 as Weight) + (51_598_000 as Weight) .saturating_add(RocksDbWeight::get().reads(7 as Weight)) .saturating_add(RocksDbWeight::get().writes(5 as Weight)) } fn set_asset_units_per_second() -> Weight { - (22_860_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(5 as Weight)) - .saturating_add(RocksDbWeight::get().writes(3 as Weight)) + (27_252_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(6 as Weight)) + .saturating_add(RocksDbWeight::get().writes(4 as Weight)) + } + fn remove_supported_asset() -> Weight { + (27_820_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(6 as Weight)) + .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } } From fd1fd63e557cbc8a5676c19d73f8955bf3904621 Mon Sep 17 00:00:00 2001 From: gorka Date: Wed, 29 Dec 2021 10:26:56 +0100 Subject: [PATCH 35/66] Update fee in test since for whatever reason requires one unit more --- tests/tests/test-assets-sufficients.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests/test-assets-sufficients.ts b/tests/tests/test-assets-sufficients.ts index f7340a984e..cd4a702daa 100644 --- a/tests/tests/test-assets-sufficients.ts +++ b/tests/tests/test-assets-sufficients.ts @@ -170,7 +170,7 @@ describeDevMoonbeam( // For some reason paymentInfo overestimates by 4358 await context.polkadotApi.tx.balances - .transfer(freshAccount.address, BigInt(fee) - BigInt(4358)) + .transfer(freshAccount.address, BigInt(fee) - BigInt(4359)) .signAndSend(alith); await context.createBlock(); From 06a74773efe4160dd13784a05889ee8bd976bd1c Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 24 Jan 2022 12:10:28 +0100 Subject: [PATCH 36/66] Left overs from rebasing --- pallets/asset-manager/src/lib.rs | 22 +++++----- pallets/asset-manager/src/migrations.rs | 16 +++---- pallets/asset-manager/src/tests.rs | 56 ++++++++++++++++--------- pallets/asset-manager/src/weights.rs | 5 +-- primitives/xcm/src/lib.rs | 13 +++--- runtime/common/src/migrations.rs | 30 ++++++++++++- 6 files changed, 91 insertions(+), 51 deletions(-) diff --git a/pallets/asset-manager/src/lib.rs b/pallets/asset-manager/src/lib.rs index 45cf904f8e..4306d22353 100644 --- a/pallets/asset-manager/src/lib.rs +++ b/pallets/asset-manager/src/lib.rs @@ -85,8 +85,8 @@ pub mod pallet { } impl xcm_primitives::UnitsToWeightRatio for Pallet { - fn payment_is_supported(asset_id: T::AssetId) -> bool { - SupportedFeePaymentAssets::::get().contains(&asset_id) + fn payment_is_supported(asset_type: T::AssetType) -> bool { + SupportedFeePaymentAssets::::get().contains(&asset_type) } fn get_units_per_second(asset_type: T::AssetType) -> Option { AssetTypeUnitsPerSecond::::get(asset_type) @@ -132,7 +132,7 @@ pub mod pallet { AssetRegistered(T::AssetId, T::AssetType, T::AssetRegistrarMetadata), UnitsPerSecondChanged(T::AssetType, u128), AssetTypeChanged(T::AssetId, T::AssetType), - SupportedAssetRemoved(T::AssetId), + SupportedAssetRemoved(T::AssetType), } /// Mapping from an asset id to asset type. @@ -161,7 +161,7 @@ pub mod pallet { // Supported fee asset payments #[pallet::storage] #[pallet::getter(fn supported_fee_payment_assets)] - pub type SupportedFeePaymentAssets = StorageValue<_, Vec, ValueQuery>; + pub type SupportedFeePaymentAssets = StorageValue<_, Vec, ValueQuery>; #[pallet::call] impl Pallet { @@ -209,8 +209,8 @@ pub mod pallet { let mut supported_assets = SupportedFeePaymentAssets::::get(); // If not in our supported asset list, then put it - if !supported_assets.contains(&asset_id) { - supported_assets.push(asset_id); + if !supported_assets.contains(&asset_type) { + supported_assets.push(asset_type.clone()); SupportedFeePaymentAssets::::put(supported_assets); } @@ -247,12 +247,10 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::remove_supported_asset())] pub fn remove_supported_asset( origin: OriginFor, - asset_id: T::AssetId, + asset_type: T::AssetType, ) -> DispatchResult { T::AssetModifierOrigin::ensure_origin(origin)?; - AssetIdType::::get(&asset_id).ok_or(Error::::AssetDoesNotExist)?; - // Grab supported assets let mut supported_assets = SupportedFeePaymentAssets::::get(); @@ -260,7 +258,7 @@ pub mod pallet { .iter() .enumerate() .find_map(|(index, asset)| { - if asset_id == asset.clone() { + if asset_type == asset.clone() { Some(index) } else { None @@ -275,9 +273,9 @@ pub mod pallet { SupportedFeePaymentAssets::::put(supported_assets); // Remove - AssetIdUnitsPerSecond::::remove(&asset_id); + AssetTypeUnitsPerSecond::::remove(&asset_type); - Self::deposit_event(Event::SupportedAssetRemoved(asset_id)); + Self::deposit_event(Event::SupportedAssetRemoved(asset_type)); Ok(()) } } diff --git a/pallets/asset-manager/src/migrations.rs b/pallets/asset-manager/src/migrations.rs index 44e7ed48d5..dfd01b2456 100644 --- a/pallets/asset-manager/src/migrations.rs +++ b/pallets/asset-manager/src/migrations.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Moonbeam. If not, see . -use crate::{AssetIdType, AssetTypeId, AssetTypeUnitsPerSecond, Config}; +use crate::{AssetIdType, AssetTypeId, AssetTypeUnitsPerSecond, Config, SupportedFeePaymentAssets}; use frame_support::{ pallet_prelude::PhantomData, storage::migration::storage_key_iter, @@ -429,11 +429,11 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { fn on_runtime_upgrade() -> Weight { log::info!(target: "PopulateSupportedFeePaymentAssets", "actually running it"); let pallet_prefix: &[u8] = b"AssetManager"; - let storage_item_prefix: &[u8] = b"AssetIdUnitsPerSecond"; + let storage_item_prefix: &[u8] = b"AssetTypeUnitsPerSecond"; // Read all the data into memory. // https://crates.parity.io/frame_support/storage/migration/fn.storage_key_iter.html - let stored_data: Vec<_> = storage_key_iter::( + let stored_data: Vec<_> = storage_key_iter::( pallet_prefix, storage_item_prefix, ) @@ -444,18 +444,18 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { .try_into() .expect("There are between 0 and 2**64 mappings stored."); - log::info!(target: "AssetIdUnitsPerSecond", "Migrating {:?} elements", migrated_count); + log::info!(target: "AssetTypeUnitsPerSecond", "Migrating {:?} elements", migrated_count); // Collect in a vec - let mut supported_assets: Vec = Vec::new(); - for (asset_id, _) in stored_data { - supported_assets.push(asset_id); + let mut supported_assets: Vec = Vec::new(); + for (asset_type, _) in stored_data { + supported_assets.push(asset_type); } // Push value SupportedFeePaymentAssets::::put(supported_assets); - log::info!(target: "AssetIdUnitsPerSecond", "almost done"); + log::info!(target: "AssetTypeUnitsPerSecond", "almost done"); // Return the weight used. For each migrated mapping there is a red to get it into // memory diff --git a/pallets/asset-manager/src/tests.rs b/pallets/asset-manager/src/tests.rs index 891c3698c1..ce72a0fec1 100644 --- a/pallets/asset-manager/src/tests.rs +++ b/pallets/asset-manager/src/tests.rs @@ -101,7 +101,7 @@ fn test_root_can_change_units_per_second() { AssetManager::asset_type_units_per_second(MockAssetType::MockAsset(1)).unwrap(), 200 ); - assert!(AssetManager::supported_fee_payment_assets().contains(&1)); + assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); expect_events(vec![ crate::Event::AssetRegistered(1, MockAssetType::MockAsset(1), 0), @@ -181,26 +181,32 @@ fn test_change_units_per_second_after_setting_it_once() { assert_ok!(AssetManager::set_asset_units_per_second( Origin::root(), - 1, + MockAssetType::MockAsset(1), 200u128.into() )); - assert_eq!(AssetManager::asset_id_units_per_second(1).unwrap(), 200); - assert!(AssetManager::supported_fee_payment_assets().contains(&1)); + assert_eq!( + AssetManager::asset_type_units_per_second(MockAssetType::MockAsset(1)).unwrap(), + 200 + ); + assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); assert_ok!(AssetManager::set_asset_units_per_second( Origin::root(), - 1, + MockAssetType::MockAsset(1), 100u128.into() )); - assert_eq!(AssetManager::asset_id_units_per_second(1).unwrap(), 100); - assert!(AssetManager::supported_fee_payment_assets().contains(&1)); + assert_eq!( + AssetManager::asset_type_units_per_second(MockAssetType::MockAsset(1)).unwrap(), + 100 + ); + assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); expect_events(vec![ crate::Event::AssetRegistered(1, MockAssetType::MockAsset(1), 0), - crate::Event::UnitsPerSecondChanged(1, 200), - crate::Event::UnitsPerSecondChanged(1, 100), + crate::Event::UnitsPerSecondChanged(MockAssetType::MockAsset(1), 200), + crate::Event::UnitsPerSecondChanged(MockAssetType::MockAsset(1), 100), ]); }); } @@ -218,19 +224,25 @@ fn test_root_can_change_units_per_second_and_then_remove() { assert_ok!(AssetManager::set_asset_units_per_second( Origin::root(), - 1, + MockAssetType::MockAsset(1), 200u128.into() )); - assert_eq!(AssetManager::asset_id_units_per_second(1).unwrap(), 200); - assert!(AssetManager::supported_fee_payment_assets().contains(&1)); + assert_eq!( + AssetManager::asset_type_units_per_second(MockAssetType::MockAsset(1)).unwrap(), + 200 + ); + assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); - assert_ok!(AssetManager::remove_supported_asset(Origin::root(), 1,)); + assert_ok!(AssetManager::remove_supported_asset( + Origin::root(), + MockAssetType::MockAsset(1), + )); expect_events(vec![ crate::Event::AssetRegistered(1, MockAssetType::MockAsset(1), 0), - crate::Event::UnitsPerSecondChanged(1, 200), - crate::Event::SupportedAssetRemoved(1), + crate::Event::UnitsPerSecondChanged(MockAssetType::MockAsset(1), 200), + crate::Event::SupportedAssetRemoved(MockAssetType::MockAsset(1)), ]); }); } @@ -256,7 +268,7 @@ fn test_asset_id_non_existent_error() { ); assert_noop!( - AssetManager::remove_supported_asset(Origin::root(), 1), + AssetManager::remove_supported_asset(Origin::root(), MockAssetType::MockAsset(1)), Error::::AssetDoesNotExist ); }); @@ -267,19 +279,23 @@ fn test_populate_supported_fee_payment_assets_works() { new_test_ext().execute_with(|| { use frame_support::StorageHasher; let pallet_prefix: &[u8] = b"AssetManager"; - let storage_item_prefix: &[u8] = b"AssetIdUnitsPerSecond"; + let storage_item_prefix: &[u8] = b"AssetTypeUnitsPerSecond"; use frame_support::traits::OnRuntimeUpgrade; use parity_scale_codec::Encode; put_storage_value( pallet_prefix, storage_item_prefix, - &Blake2_128Concat::hash(&1u32.encode()), + &Blake2_128Concat::hash(&MockAssetType::MockAsset(1).encode()), 10u128, ); assert_noop!( - AssetManager::set_asset_units_per_second(Origin::root(), 1, 200u128.into()), + AssetManager::set_asset_units_per_second( + Origin::root(), + MockAssetType::MockAsset(1), + 200u128.into() + ), Error::::AssetDoesNotExist ); @@ -289,7 +305,7 @@ fn test_populate_supported_fee_payment_assets_works() { crate::migrations::PopulateSupportedFeePaymentAssets::::on_runtime_upgrade(); assert!(AssetManager::supported_fee_payment_assets().len() == 1); - assert!(AssetManager::supported_fee_payment_assets().contains(&1)); + assert!(AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1))); }); } diff --git a/pallets/asset-manager/src/weights.rs b/pallets/asset-manager/src/weights.rs index abf2dff9a4..a4f78e72cd 100644 --- a/pallets/asset-manager/src/weights.rs +++ b/pallets/asset-manager/src/weights.rs @@ -70,13 +70,12 @@ impl WeightInfo for SubstrateWeight { (24_348_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(3 as Weight)) - + } fn remove_supported_asset() -> Weight { (27_820_000 as Weight) .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } - } fn change_existing_asset_type() -> Weight { (28_306_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) @@ -95,12 +94,12 @@ impl WeightInfo for () { (24_348_000 as Weight) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(3 as Weight)) + } fn remove_supported_asset() -> Weight { (27_820_000 as Weight) .saturating_add(RocksDbWeight::get().reads(6 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } - } fn change_existing_asset_type() -> Weight { (28_306_000 as Weight) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) diff --git a/primitives/xcm/src/lib.rs b/primitives/xcm/src/lib.rs index 6fde1f45b3..84b99f5c23 100644 --- a/primitives/xcm/src/lib.rs +++ b/primitives/xcm/src/lib.rs @@ -150,11 +150,10 @@ impl< match (first_asset.id, first_asset.fun) { (xcmAssetId::Concrete(id), Fungibility::Fungible(_)) => { let asset_type: AssetType = id.clone().into(); - let asset_id: AssetId = AssetId::from(asset_type); // Shortcut if we know the asset is not supported // This involves the same db read per block, mitigating any attack based on // non-supported assets - if !AssetIdInfoGetter::payment_is_supported(asset_id.clone()) { + if !AssetIdInfoGetter::payment_is_supported(asset_type.clone()) { return Err(XcmError::TooExpensive); } if let Some(units_per_second) = AssetIdInfoGetter::get_units_per_second(asset_type) @@ -283,11 +282,11 @@ pub trait AssetTypeGetter { fn get_asset_id(asset_type: AssetType) -> Option; } -// Defines the trait to obtain the units per second of a give assetId for local execution -// This parameter will be used to charge for fees upon assetId deposit -pub trait UnitsToWeightRatio { - // Whether payment in a particular assetId is suppotrted - fn payment_is_supported(asset_id: AssetId) -> bool; +// Defines the trait to obtain the units per second of a give asset_type for local execution +// This parameter will be used to charge for fees upon asset_type deposit +pub trait UnitsToWeightRatio { + // Whether payment in a particular asset_type is suppotrted + fn payment_is_supported(asset_type: AssetType) -> bool; // Get units per second from asset type fn get_units_per_second(asset_type: AssetType) -> Option; } diff --git a/runtime/common/src/migrations.rs b/runtime/common/src/migrations.rs index a9d85c0115..3dd95c93e0 100644 --- a/runtime/common/src/migrations.rs +++ b/runtime/common/src/migrations.rs @@ -23,7 +23,7 @@ use frame_support::{ }; #[cfg(feature = "xcm-support")] use pallet_asset_manager::{ - migrations::{ChangeStateminePrefixes, PopulateAssetTypeIdStorage, UnitsWithAssetType}, + migrations::{ChangeStateminePrefixes, PopulateAssetTypeIdStorage, UnitsWithAssetType, PopulateSupportedFeePaymentAssets}, Config as AssetManagerConfig, }; use pallet_author_mapping::{migrations::TwoXToBlake, Config as AuthorMappingConfig}; @@ -288,6 +288,31 @@ where } } +#[cfg(feature = "xcm-support")] +pub struct XcmPaymentSupportedAssets(PhantomData); +#[cfg(feature = "xcm-support")] +impl Migration for XcmPaymentSupportedAssets { + fn friendly_name(&self) -> &str { + "MM_Xcm_Payment_Supported_Assets" + } + + fn migrate(&self, _available_weight: Weight) -> Weight { + PopulateSupportedFeePaymentAssets::::on_runtime_upgrade() + } + + /// Run a standard pre-runtime test. This works the same way as in a normal runtime upgrade. + #[cfg(feature = "try-runtime")] + fn pre_upgrade(&self) -> Result<(), &'static str> { + PopulateSupportedFeePaymentAssets::::pre_upgrade() + } + + /// Run a standard post-runtime test. This works the same way as in a normal runtime upgrade. + #[cfg(feature = "try-runtime")] + fn post_upgrade(&self) -> Result<(), &'static str> { + PopulateSupportedFeePaymentAssets::::post_upgrade() + } +} + pub struct CommonMigrations(PhantomData<(Runtime, Council, Tech)>); impl GetMigrations for CommonMigrations @@ -359,6 +384,8 @@ where StatemineAssetsInstanceInfo, >(Default::default()); + let xcm_supported_assets = XcmPaymentSupportedAssets::(Default::default()); + // TODO: this is a lot of allocation to do upon every get() call. this *should* be avoided // except when pallet_migrations undergoes a runtime upgrade -- but TODO: review @@ -367,6 +394,7 @@ where Box::new(asset_manager_units_with_asset_type), Box::new(asset_manager_change_statemine_prefixes), Box::new(asset_manager_populate_asset_type_id_storage), + Box::new(xcm_supported_assets), ] } } From ff1564c1f8a100685f848fa186d108f3e981c99f Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 24 Jan 2022 13:17:10 +0100 Subject: [PATCH 37/66] Fix benchmarks --- pallets/asset-manager/src/benchmarks.rs | 8 ++++---- runtime/common/src/migrations.rs | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pallets/asset-manager/src/benchmarks.rs b/pallets/asset-manager/src/benchmarks.rs index 93b4e0ff75..bc6b403196 100644 --- a/pallets/asset-manager/src/benchmarks.rs +++ b/pallets/asset-manager/src/benchmarks.rs @@ -43,7 +43,7 @@ benchmarks! { }: _(RawOrigin::Root, asset_type.clone(), 1) verify { - assert!(Pallet::::supported_fee_payment_assets().contains(&asset_id)); + assert!(Pallet::::supported_fee_payment_assets().contains(&asset_type)); assert_eq!(Pallet::::asset_type_units_per_second(asset_type), Some(1)); } @@ -67,11 +67,11 @@ benchmarks! { let amount = 1u32.into(); let asset_id: T::AssetId = asset_type.clone().into(); Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?; - Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_id, 1)?; - }: _(RawOrigin::Root, asset_id) + Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1)?; + }: _(RawOrigin::Root, asset_type.clone()) verify { assert!(Pallet::::supported_fee_payment_assets().is_empty()); - assert_eq!(Pallet::::asset_type_units_per_second(asset_id), None); + assert_eq!(Pallet::::asset_type_units_per_second(asset_type), None); } } diff --git a/runtime/common/src/migrations.rs b/runtime/common/src/migrations.rs index 3dd95c93e0..a2c2c9a44f 100644 --- a/runtime/common/src/migrations.rs +++ b/runtime/common/src/migrations.rs @@ -23,7 +23,10 @@ use frame_support::{ }; #[cfg(feature = "xcm-support")] use pallet_asset_manager::{ - migrations::{ChangeStateminePrefixes, PopulateAssetTypeIdStorage, UnitsWithAssetType, PopulateSupportedFeePaymentAssets}, + migrations::{ + ChangeStateminePrefixes, PopulateAssetTypeIdStorage, PopulateSupportedFeePaymentAssets, + UnitsWithAssetType, + }, Config as AssetManagerConfig, }; use pallet_author_mapping::{migrations::TwoXToBlake, Config as AuthorMappingConfig}; From 970f72a255af700a97b95eaf046fc207287b70a0 Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 24 Jan 2022 13:18:48 +0100 Subject: [PATCH 38/66] Cosmetic fixes --- pallets/asset-manager/src/lib.rs | 4 ++-- pallets/asset-manager/src/migrations.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pallets/asset-manager/src/lib.rs b/pallets/asset-manager/src/lib.rs index 4306d22353..4bf8cca976 100644 --- a/pallets/asset-manager/src/lib.rs +++ b/pallets/asset-manager/src/lib.rs @@ -191,7 +191,7 @@ pub mod pallet { Ok(()) } - /// Change the amount of units we are charging per execution second for a given AssetId + /// Change the amount of units we are charging per execution second for a given AssetType #[pallet::weight(T::WeightInfo::set_asset_units_per_second())] pub fn set_asset_units_per_second( origin: OriginFor, @@ -243,7 +243,7 @@ pub mod pallet { Ok(()) } - /// Change the amount of units we are charging per execution second for a given AssetId + /// Remove a given assetType from the supported assets for fee payment #[pallet::weight(T::WeightInfo::remove_supported_asset())] pub fn remove_supported_asset( origin: OriginFor, diff --git a/pallets/asset-manager/src/migrations.rs b/pallets/asset-manager/src/migrations.rs index dfd01b2456..a6f4dec1b8 100644 --- a/pallets/asset-manager/src/migrations.rs +++ b/pallets/asset-manager/src/migrations.rs @@ -444,7 +444,7 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { .try_into() .expect("There are between 0 and 2**64 mappings stored."); - log::info!(target: "AssetTypeUnitsPerSecond", "Migrating {:?} elements", migrated_count); + log::info!(target: "PopulateSupportedFeePaymentAssets", "Migrating {:?} elements", migrated_count); // Collect in a vec let mut supported_assets: Vec = Vec::new(); @@ -455,7 +455,7 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { // Push value SupportedFeePaymentAssets::::put(supported_assets); - log::info!(target: "AssetTypeUnitsPerSecond", "almost done"); + log::info!(target: "PopulateSupportedFeePaymentAssets", "almost done"); // Return the weight used. For each migrated mapping there is a red to get it into // memory From 61c264aee7e86e5340bc93ea46c6543b8c3117c7 Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 25 Jan 2022 10:40:58 +0100 Subject: [PATCH 39/66] editorconfig --- pallets/asset-manager/src/migrations.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pallets/asset-manager/src/migrations.rs b/pallets/asset-manager/src/migrations.rs index a6f4dec1b8..90f66c52fc 100644 --- a/pallets/asset-manager/src/migrations.rs +++ b/pallets/asset-manager/src/migrations.rs @@ -444,7 +444,11 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { .try_into() .expect("There are between 0 and 2**64 mappings stored."); - log::info!(target: "PopulateSupportedFeePaymentAssets", "Migrating {:?} elements", migrated_count); + log::info!( + target: "PopulateSupportedFeePaymentAssets", + "Migrating {:?} elements", + migrated_count + ); // Collect in a vec let mut supported_assets: Vec = Vec::new(); From ca041c07c8c95a50eec62b7ab8bebf8a64f91a74 Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 25 Jan 2022 10:58:06 +0100 Subject: [PATCH 40/66] Include where clause in benchmarks --- pallets/asset-manager/src/benchmarks.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pallets/asset-manager/src/benchmarks.rs b/pallets/asset-manager/src/benchmarks.rs index bc6b403196..efd3875a63 100644 --- a/pallets/asset-manager/src/benchmarks.rs +++ b/pallets/asset-manager/src/benchmarks.rs @@ -19,8 +19,10 @@ use crate::{Call, Config, Pallet}; use frame_benchmarking::{benchmarks, impl_benchmark_test_suite}; use frame_system::RawOrigin; +use xcm::latest::MultiLocation; benchmarks! { + where_clause { where T::AssetType: From } register_asset { // does not really matter what we register let asset_type = T::AssetType::default(); From 165ca2df2f98b4a490e3cb218f8f91a12c3b1e75 Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 25 Jan 2022 11:04:46 +0100 Subject: [PATCH 41/66] Change the way change_existing_asset_type benchmark was written --- pallets/asset-manager/src/benchmarks.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pallets/asset-manager/src/benchmarks.rs b/pallets/asset-manager/src/benchmarks.rs index efd3875a63..55142ee1ef 100644 --- a/pallets/asset-manager/src/benchmarks.rs +++ b/pallets/asset-manager/src/benchmarks.rs @@ -19,7 +19,7 @@ use crate::{Call, Config, Pallet}; use frame_benchmarking::{benchmarks, impl_benchmark_test_suite}; use frame_system::RawOrigin; -use xcm::latest::MultiLocation; +use xcm::latest::prelude::*; benchmarks! { where_clause { where T::AssetType: From } @@ -52,14 +52,15 @@ benchmarks! { change_existing_asset_type { // does not really matter what we register let asset_type = T::AssetType::default(); + let new_asset_type: T::AssetType = MultiLocation::new(0, X1(GeneralIndex(0))).into(); let metadata = T::AssetRegistrarMetadata::default(); let amount = 1u32.into(); let asset_id: T::AssetId = asset_type.clone().into(); Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?; - }: _(RawOrigin::Root, asset_id, asset_type.clone()) + }: _(RawOrigin::Root, asset_id, new_asset_type.clone()) verify { - assert_eq!(Pallet::::asset_id_type(asset_id), Some(asset_type)); + assert_eq!(Pallet::::asset_id_type(asset_id), Some(new_asset_type)); } remove_supported_asset { From e850f32d17c124d95a02a0398a518444a86f63ca Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 25 Jan 2022 11:23:16 +0100 Subject: [PATCH 42/66] Re-write remove_supported_asset benchmark --- pallets/asset-manager/src/benchmarks.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/pallets/asset-manager/src/benchmarks.rs b/pallets/asset-manager/src/benchmarks.rs index 55142ee1ef..5dbe323739 100644 --- a/pallets/asset-manager/src/benchmarks.rs +++ b/pallets/asset-manager/src/benchmarks.rs @@ -64,17 +64,21 @@ benchmarks! { } remove_supported_asset { - // does not really matter what we register - let asset_type = T::AssetType::default(); - let metadata = T::AssetRegistrarMetadata::default(); - let amount = 1u32.into(); - let asset_id: T::AssetId = asset_type.clone().into(); - Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?; - Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1)?; - }: _(RawOrigin::Root, asset_type.clone()) + // We make it dependent on the number of existing assets already + let x in 5..100; + for i in 0..x { + let asset_type: T::AssetType = MultiLocation::new(0, X1(GeneralIndex(i as u128))).into(); + let metadata = T::AssetRegistrarMetadata::default(); + let amount = 1u32.into(); + Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?; + Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1)?; + } + let asset_type_to_be_removed: T::AssetType = MultiLocation::new(0, X1(GeneralIndex((x-1) as u128))).into(); + // We try to remove the last asset type + }: _(RawOrigin::Root, asset_type_to_be_removed.clone()) verify { - assert!(Pallet::::supported_fee_payment_assets().is_empty()); - assert_eq!(Pallet::::asset_type_units_per_second(asset_type), None); + assert!(!Pallet::::supported_fee_payment_assets().contains(&asset_type_to_be_removed)); + assert_eq!(Pallet::::asset_type_units_per_second(asset_type_to_be_removed), None); } } From 66a8ac054fcf6df21a4e7c3cc03d337b9c7d84ba Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 25 Jan 2022 11:50:24 +0100 Subject: [PATCH 43/66] Make remove_supported_assets dependent on weight hint --- pallets/asset-manager/src/benchmarks.rs | 2 +- pallets/asset-manager/src/lib.rs | 8 +++++- pallets/asset-manager/src/tests.rs | 27 +++++++++++++++++- pallets/asset-manager/src/weights.rs | 38 +++++++++++++------------ 4 files changed, 54 insertions(+), 21 deletions(-) diff --git a/pallets/asset-manager/src/benchmarks.rs b/pallets/asset-manager/src/benchmarks.rs index 5dbe323739..df07321b91 100644 --- a/pallets/asset-manager/src/benchmarks.rs +++ b/pallets/asset-manager/src/benchmarks.rs @@ -75,7 +75,7 @@ benchmarks! { } let asset_type_to_be_removed: T::AssetType = MultiLocation::new(0, X1(GeneralIndex((x-1) as u128))).into(); // We try to remove the last asset type - }: _(RawOrigin::Root, asset_type_to_be_removed.clone()) + }: _(RawOrigin::Root, asset_type_to_be_removed.clone(), x) verify { assert!(!Pallet::::supported_fee_payment_assets().contains(&asset_type_to_be_removed)); assert_eq!(Pallet::::asset_type_units_per_second(asset_type_to_be_removed), None); diff --git a/pallets/asset-manager/src/lib.rs b/pallets/asset-manager/src/lib.rs index 4bf8cca976..bff5a5d3fe 100644 --- a/pallets/asset-manager/src/lib.rs +++ b/pallets/asset-manager/src/lib.rs @@ -124,6 +124,7 @@ pub mod pallet { ErrorCreatingAsset, AssetAlreadyExists, AssetDoesNotExist, + TooLowNumAssetsWeightHint, } #[pallet::event] @@ -244,16 +245,21 @@ pub mod pallet { } /// Remove a given assetType from the supported assets for fee payment - #[pallet::weight(T::WeightInfo::remove_supported_asset())] + #[pallet::weight(T::WeightInfo::remove_supported_asset(*num_assets_weight_hint))] pub fn remove_supported_asset( origin: OriginFor, asset_type: T::AssetType, + num_assets_weight_hint: u32, ) -> DispatchResult { T::AssetModifierOrigin::ensure_origin(origin)?; // Grab supported assets let mut supported_assets = SupportedFeePaymentAssets::::get(); + ensure!( + num_assets_weight_hint >= (supported_assets.len() as u32), + Error::::TooLowNumAssetsWeightHint + ); let index = supported_assets .iter() .enumerate() diff --git a/pallets/asset-manager/src/tests.rs b/pallets/asset-manager/src/tests.rs index ce72a0fec1..0e6a37447c 100644 --- a/pallets/asset-manager/src/tests.rs +++ b/pallets/asset-manager/src/tests.rs @@ -237,6 +237,7 @@ fn test_root_can_change_units_per_second_and_then_remove() { assert_ok!(AssetManager::remove_supported_asset( Origin::root(), MockAssetType::MockAsset(1), + 1, )); expect_events(vec![ @@ -247,6 +248,30 @@ fn test_root_can_change_units_per_second_and_then_remove() { }); } +#[test] +fn test_weight_hint_error() { + new_test_ext().execute_with(|| { + assert_ok!(AssetManager::register_asset( + Origin::root(), + MockAssetType::MockAsset(1), + 0u32.into(), + 1u32.into(), + true, + )); + + assert_ok!(AssetManager::set_asset_units_per_second( + Origin::root(), + MockAssetType::MockAsset(1), + 200u128.into() + )); + + assert_noop!( + AssetManager::remove_supported_asset(Origin::root(), MockAssetType::MockAsset(1), 0), + Error::::TooLowNumAssetsWeightHint + ); + }); +} + #[test] fn test_asset_id_non_existent_error() { new_test_ext().execute_with(|| { @@ -268,7 +293,7 @@ fn test_asset_id_non_existent_error() { ); assert_noop!( - AssetManager::remove_supported_asset(Origin::root(), MockAssetType::MockAsset(1)), + AssetManager::remove_supported_asset(Origin::root(), MockAssetType::MockAsset(1), 0), Error::::AssetDoesNotExist ); }); diff --git a/pallets/asset-manager/src/weights.rs b/pallets/asset-manager/src/weights.rs index a4f78e72cd..b5c11592bd 100644 --- a/pallets/asset-manager/src/weights.rs +++ b/pallets/asset-manager/src/weights.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for pallet_asset_manager //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-01-19, STEPS: `32`, REPEAT: 64, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-01-25, STEPS: `32`, REPEAT: 64, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 128 // Executed Command: @@ -55,29 +55,30 @@ pub trait WeightInfo { fn register_asset() -> Weight; fn set_asset_units_per_second() -> Weight; fn change_existing_asset_type() -> Weight; - fn remove_supported_asset() -> Weight; + fn remove_supported_asset(x: u32) -> Weight; } /// Weights for pallet_asset_manager using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { fn register_asset() -> Weight { - (52_375_000 as Weight) + (53_553_000 as Weight) .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } fn set_asset_units_per_second() -> Weight { - (24_348_000 as Weight) - .saturating_add(T::DbWeight::get().reads(5 as Weight)) - .saturating_add(T::DbWeight::get().writes(3 as Weight)) - } - fn remove_supported_asset() -> Weight { - (27_820_000 as Weight) + (29_136_000 as Weight) .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn change_existing_asset_type() -> Weight { - (28_306_000 as Weight) + (29_659_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } + fn remove_supported_asset(x: u32) -> Weight { + (29_143_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_370_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } @@ -86,22 +87,23 @@ impl WeightInfo for SubstrateWeight { // For backwards compatibility and tests impl WeightInfo for () { fn register_asset() -> Weight { - (52_375_000 as Weight) + (53_553_000 as Weight) .saturating_add(RocksDbWeight::get().reads(7 as Weight)) .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } fn set_asset_units_per_second() -> Weight { - (24_348_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(5 as Weight)) - .saturating_add(RocksDbWeight::get().writes(3 as Weight)) - } - fn remove_supported_asset() -> Weight { - (27_820_000 as Weight) + (29_136_000 as Weight) .saturating_add(RocksDbWeight::get().reads(6 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } fn change_existing_asset_type() -> Weight { - (28_306_000 as Weight) + (29_659_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(5 as Weight)) + .saturating_add(RocksDbWeight::get().writes(5 as Weight)) + } + fn remove_supported_asset(x: u32) -> Weight { + (29_143_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_370_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } From 8db2b59fb6ec5f8c7e1b4e957351226a2d065b3f Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 25 Jan 2022 11:58:02 +0100 Subject: [PATCH 44/66] Add new weights --- pallets/asset-manager/src/weights.rs | 70 ++++++---------------------- 1 file changed, 14 insertions(+), 56 deletions(-) diff --git a/pallets/asset-manager/src/weights.rs b/pallets/asset-manager/src/weights.rs index b5c11592bd..d5ceff3b48 100644 --- a/pallets/asset-manager/src/weights.rs +++ b/pallets/asset-manager/src/weights.rs @@ -44,67 +44,25 @@ #![allow(unused_parens)] #![allow(unused_imports)] -use frame_support::{ - traits::Get, - weights::{constants::RocksDbWeight, Weight}, -}; +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use sp_std::marker::PhantomData; /// Weight functions needed for pallet_asset_manager. -pub trait WeightInfo { - fn register_asset() -> Weight; - fn set_asset_units_per_second() -> Weight; - fn change_existing_asset_type() -> Weight; - fn remove_supported_asset(x: u32) -> Weight; -} +pub trait WeightInfo { fn register_asset() -> Weight; fn set_asset_units_per_second() -> Weight; fn change_existing_asset_type() -> Weight; fn remove_supported_asset(x: u32, ) -> Weight;} /// Weights for pallet_asset_manager using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); -impl WeightInfo for SubstrateWeight { - fn register_asset() -> Weight { - (53_553_000 as Weight) - .saturating_add(T::DbWeight::get().reads(7 as Weight)) - .saturating_add(T::DbWeight::get().writes(6 as Weight)) - } - fn set_asset_units_per_second() -> Weight { - (29_136_000 as Weight) - .saturating_add(T::DbWeight::get().reads(6 as Weight)) - .saturating_add(T::DbWeight::get().writes(4 as Weight)) - } - fn change_existing_asset_type() -> Weight { - (29_659_000 as Weight) - .saturating_add(T::DbWeight::get().reads(5 as Weight)) - .saturating_add(T::DbWeight::get().writes(5 as Weight)) - } - fn remove_supported_asset(x: u32) -> Weight { - (29_143_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_370_000 as Weight).saturating_mul(x as Weight)) - .saturating_add(T::DbWeight::get().reads(5 as Weight)) - .saturating_add(T::DbWeight::get().writes(4 as Weight)) - } -} +impl WeightInfo for SubstrateWeight { fn register_asset() -> Weight { + (53_300_000 as Weight) .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } fn set_asset_units_per_second() -> Weight { + (28_811_000 as Weight) .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn change_existing_asset_type() -> Weight { + (29_674_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(5 as Weight)) } fn remove_supported_asset(x: u32, ) -> Weight { + (30_516_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_330_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) }} // For backwards compatibility and tests -impl WeightInfo for () { - fn register_asset() -> Weight { - (53_553_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(7 as Weight)) - .saturating_add(RocksDbWeight::get().writes(6 as Weight)) - } - fn set_asset_units_per_second() -> Weight { - (29_136_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(6 as Weight)) - .saturating_add(RocksDbWeight::get().writes(4 as Weight)) - } - fn change_existing_asset_type() -> Weight { - (29_659_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(5 as Weight)) - .saturating_add(RocksDbWeight::get().writes(5 as Weight)) - } - fn remove_supported_asset(x: u32) -> Weight { - (29_143_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_370_000 as Weight).saturating_mul(x as Weight)) - .saturating_add(RocksDbWeight::get().reads(5 as Weight)) - .saturating_add(RocksDbWeight::get().writes(4 as Weight)) - } -} +impl WeightInfo for () { fn register_asset() -> Weight { + (53_300_000 as Weight) .saturating_add(RocksDbWeight::get().reads(7 as Weight)) .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } fn set_asset_units_per_second() -> Weight { + (28_811_000 as Weight) .saturating_add(RocksDbWeight::get().reads(6 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } fn change_existing_asset_type() -> Weight { + (29_674_000 as Weight) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(5 as Weight)) } fn remove_supported_asset(x: u32, ) -> Weight { + (30_516_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_330_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) }} From 8f138bf30f69169ee2d517061689d4f3764eed3a Mon Sep 17 00:00:00 2001 From: gorka Date: Wed, 26 Jan 2022 15:31:01 +0100 Subject: [PATCH 45/66] EditorCOnfig --- pallets/asset-manager/src/benchmarks.rs | 5 +- pallets/asset-manager/src/weights.rs | 70 ++++++++++++++++++++----- 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/pallets/asset-manager/src/benchmarks.rs b/pallets/asset-manager/src/benchmarks.rs index df07321b91..52a8aff488 100644 --- a/pallets/asset-manager/src/benchmarks.rs +++ b/pallets/asset-manager/src/benchmarks.rs @@ -73,7 +73,10 @@ benchmarks! { Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?; Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1)?; } - let asset_type_to_be_removed: T::AssetType = MultiLocation::new(0, X1(GeneralIndex((x-1) as u128))).into(); + let asset_type_to_be_removed: T::AssetType = MultiLocation::new( + 0, + X1(GeneralIndex((x-1) as u128)) + ).into(); // We try to remove the last asset type }: _(RawOrigin::Root, asset_type_to_be_removed.clone(), x) verify { diff --git a/pallets/asset-manager/src/weights.rs b/pallets/asset-manager/src/weights.rs index d5ceff3b48..e76ed81f18 100644 --- a/pallets/asset-manager/src/weights.rs +++ b/pallets/asset-manager/src/weights.rs @@ -44,25 +44,67 @@ #![allow(unused_parens)] #![allow(unused_imports)] -use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use frame_support::{ + traits::Get, + weights::{constants::RocksDbWeight, Weight}, +}; use sp_std::marker::PhantomData; /// Weight functions needed for pallet_asset_manager. -pub trait WeightInfo { fn register_asset() -> Weight; fn set_asset_units_per_second() -> Weight; fn change_existing_asset_type() -> Weight; fn remove_supported_asset(x: u32, ) -> Weight;} +pub trait WeightInfo { + fn register_asset() -> Weight; + fn set_asset_units_per_second() -> Weight; + fn change_existing_asset_type() -> Weight; + fn remove_supported_asset(x: u32) -> Weight; +} /// Weights for pallet_asset_manager using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); -impl WeightInfo for SubstrateWeight { fn register_asset() -> Weight { - (53_300_000 as Weight) .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } fn set_asset_units_per_second() -> Weight { - (28_811_000 as Weight) .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn change_existing_asset_type() -> Weight { - (29_674_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(5 as Weight)) } fn remove_supported_asset(x: u32, ) -> Weight { - (30_516_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_330_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) }} +impl WeightInfo for SubstrateWeight { + fn register_asset() -> Weight { + (53_300_000 as Weight) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(6 as Weight)) + } + fn set_asset_units_per_second() -> Weight { + (28_811_000 as Weight) + .saturating_add(T::DbWeight::get().reads(6 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } + fn change_existing_asset_type() -> Weight { + (29_674_000 as Weight) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(5 as Weight)) + } + fn remove_supported_asset(x: u32) -> Weight { + (30_516_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_330_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(5 as Weight)) + .saturating_add(T::DbWeight::get().writes(4 as Weight)) + } +} // For backwards compatibility and tests -impl WeightInfo for () { fn register_asset() -> Weight { - (53_300_000 as Weight) .saturating_add(RocksDbWeight::get().reads(7 as Weight)) .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } fn set_asset_units_per_second() -> Weight { - (28_811_000 as Weight) .saturating_add(RocksDbWeight::get().reads(6 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } fn change_existing_asset_type() -> Weight { - (29_674_000 as Weight) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(5 as Weight)) } fn remove_supported_asset(x: u32, ) -> Weight { - (30_516_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_330_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) }} +impl WeightInfo for () { + fn register_asset() -> Weight { + (53_300_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(7 as Weight)) + .saturating_add(RocksDbWeight::get().writes(6 as Weight)) + } + fn set_asset_units_per_second() -> Weight { + (28_811_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(6 as Weight)) + .saturating_add(RocksDbWeight::get().writes(4 as Weight)) + } + fn change_existing_asset_type() -> Weight { + (29_674_000 as Weight) + .saturating_add(RocksDbWeight::get().reads(5 as Weight)) + .saturating_add(RocksDbWeight::get().writes(5 as Weight)) + } + fn remove_supported_asset(x: u32) -> Weight { + (30_516_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_330_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(RocksDbWeight::get().reads(5 as Weight)) + .saturating_add(RocksDbWeight::get().writes(4 as Weight)) + } +} From 8bc35ff2d3752374a0f081c11e1f88b67b218371 Mon Sep 17 00:00:00 2001 From: gorka Date: Fri, 11 Feb 2022 11:19:46 +0100 Subject: [PATCH 46/66] missing brace --- runtime/common/src/migrations.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/common/src/migrations.rs b/runtime/common/src/migrations.rs index a5f3a1778c..31f2d6d85b 100644 --- a/runtime/common/src/migrations.rs +++ b/runtime/common/src/migrations.rs @@ -327,6 +327,7 @@ impl Migration for XcmPaymentSupportedAssets { fn migrate(&self, _available_weight: Weight) -> Weight { PopulateSupportedFeePaymentAssets::::on_runtime_upgrade() + } /// Run a standard pre-runtime test. This works the same way as in a normal runtime upgrade. #[cfg(feature = "try-runtime")] @@ -359,7 +360,6 @@ impl Migration for SchedulerMigrationV3 { /// Run a standard post-runtime test. This works the same way as in a normal runtime upgrade. #[cfg(feature = "try-runtime")] fn post_upgrade(&self) -> Result<(), &'static str> { - pallet_scheduler::Pallet::::post_migrate_to_v3() } } From db40475b3595061f17dd4a5dfbbdf64f11143d90 Mon Sep 17 00:00:00 2001 From: gorka Date: Fri, 11 Feb 2022 11:31:56 +0100 Subject: [PATCH 47/66] Missing try runtime --- runtime/common/src/migrations.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/runtime/common/src/migrations.rs b/runtime/common/src/migrations.rs index 31f2d6d85b..e42e8d507f 100644 --- a/runtime/common/src/migrations.rs +++ b/runtime/common/src/migrations.rs @@ -335,6 +335,7 @@ impl Migration for XcmPaymentSupportedAssets { PopulateSupportedFeePaymentAssets::::pre_upgrade() } + #[cfg(feature = "try-runtime")] /// Run a standard post-runtime test. This works the same way as in a normal runtime upgrade. fn post_upgrade(&self) -> Result<(), &'static str> { PopulateSupportedFeePaymentAssets::::post_upgrade() From ba3136d62a8f74e2f831a1cddcc6fcdeea988568 Mon Sep 17 00:00:00 2001 From: gorka Date: Thu, 17 Feb 2022 10:40:00 +0100 Subject: [PATCH 48/66] Add test proving supported fee works --- tests/tests/test-mock-hrmp.ts | 175 ++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) diff --git a/tests/tests/test-mock-hrmp.ts b/tests/tests/test-mock-hrmp.ts index 82dabce06f..21381b01a5 100644 --- a/tests/tests/test-mock-hrmp.ts +++ b/tests/tests/test-mock-hrmp.ts @@ -39,6 +39,19 @@ const statemintLocation = { }, }; +const statemintLocationAssetOne = { + XCM: { + parents: 1, + interior: { + X3: [ + { Parachain: statemint_para_id }, + { PalletInstance: statemint_assets_pallet_instance }, + { GeneralIndex: 1 }, + ], + }, + }, +}; + describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { let assetId: string; let alith: KeyringPair; @@ -631,3 +644,165 @@ describeDevMoonbeam( }); } ); + +describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { + let assetIdZero: string; + let assetIdOne: string; + let alith: KeyringPair; + + before( + "Should Register two asset from same para but set unit per sec for one", + async function () { + const keyringEth = new Keyring({ type: "ethereum" }); + alith = keyringEth.addFromUri(ALITH_PRIV_KEY, null, "ethereum"); + + // registerAsset Asset 0 + // We register statemine with the new prefix + const { events: eventsRegisterZero } = await createBlockWithExtrinsic( + context, + alith, + context.polkadotApi.tx.sudo.sudo( + context.polkadotApi.tx.assetManager.registerAsset( + statemintLocation, + assetMetadata, + new BN(1), + true + ) + ) + ); + // Look for assetId in events + eventsRegisterZero.forEach((e) => { + if (e.section.toString() === "assetManager") { + assetIdZero = e.data[0].toHex(); + } + }); + assetIdZero = assetIdZero.replace(/,/g, ""); + + // registerAsset Asset 1 + // We register statemine with the new prefix + const { events: eventsRegisterOne } = await createBlockWithExtrinsic( + context, + alith, + context.polkadotApi.tx.sudo.sudo( + context.polkadotApi.tx.assetManager.registerAsset( + statemintLocationAssetOne, + assetMetadata, + new BN(1), + true + ) + ) + ); + // Look for assetId in events + eventsRegisterOne.forEach((e) => { + if (e.section.toString() === "assetManager") { + assetIdOne = e.data[0].toHex(); + } + }); + assetIdOne = assetIdOne.replace(/,/g, ""); + + // setAssetUnitsPerSecond.We only set it for statemintLocationAssetOne + const { events } = await createBlockWithExtrinsic( + context, + alith, + context.polkadotApi.tx.sudo.sudo( + context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(statemintLocationAssetOne, 0) + ) + ); + expect(events[1].method.toString()).to.eq("UnitsPerSecondChanged"); + expect(events[4].method.toString()).to.eq("ExtrinsicSuccess"); + + // check assets in storage + const registeredAssetZero = ( + (await context.polkadotApi.query.assets.asset(assetIdZero)) as any + ).unwrap(); + expect(registeredAssetZero.owner.toHex()).to.eq(palletId.toLowerCase()); + const registeredAssetOne = ( + (await context.polkadotApi.query.assets.asset(assetIdZero)) as any + ).unwrap(); + expect(registeredAssetOne.owner.toHex()).to.eq(palletId.toLowerCase()); + } + ); + + it("Should receive 10 Statemine asset 0 tokens to Alith using statemint asset 1 as fee payment ", async function () { + // We are going to test that, using one of them as fee payment (assetOne), we can receive the other + let xcmMessage = { + V2: [ + { + ReserveAssetDeposited: [ + { + id: { + Concrete: { + parents: 1, + interior: { X2: [{ Parachain: statemint_para_id }, { GeneralIndex: 0 }] }, + }, + }, + fun: { Fungible: new BN(10000000000000) }, + }, + { + id: { + Concrete: { + parents: 1, + interior: { X2: [{ Parachain: statemint_para_id }, { GeneralIndex: 1 }] }, + }, + }, + fun: { Fungible: new BN(10000000000000) }, + }, + ], + }, + { ClearOrigin: null }, + { + BuyExecution: { + fees: { + id: { + Concrete: { + parents: new BN(1), + interior: { X2: [{ Parachain: statemint_para_id }, { GeneralIndex: 1 }] }, + }, + }, + fun: { Fungible: new BN(10000000000000) }, + }, + weightLimit: { Limited: new BN(4000000000) }, + }, + }, + { + DepositAsset: { + assets: { Wild: "All" }, + maxAssets: new BN(2), + beneficiary: { + parents: 0, + interior: { X1: { AccountKey20: { network: "Any", key: alith.address } } }, + }, + }, + }, + ], + }; + const xcmpFormat: XcmpMessageFormat = context.polkadotApi.createType( + "XcmpMessageFormat", + "ConcatenatedVersionedXcm" + ); + const receivedMessage: XcmVersionedXcm = context.polkadotApi.createType( + "XcmVersionedXcm", + xcmMessage + ); + + const totalMessage = [...xcmpFormat.toU8a(), ...receivedMessage.toU8a()]; + // Send RPC call to inject XCM message + // We will set a specific message knowing that it should mint the statemint asset + await customWeb3Request(context.web3, "xcm_injectHrmpMessage", [ + statemint_para_id, + totalMessage, + ]); + + // Create a block in which the XCM will be executed + await context.createBlock(); + + // Make sure the state has ALITH's foreign parachain tokens + let alithAssetZeroBalance = ( + (await context.polkadotApi.query.assets.account(assetIdZero, alith.address)) as any + ) + .unwrap() + ["balance"].toBigInt(); + + expect(alithAssetZeroBalance).to.eq(10n * FOREIGN_TOKEN); + }); +}); From 2347dab7f211d911d55d7fdca0373f80af3855e2 Mon Sep 17 00:00:00 2001 From: gorka Date: Thu, 17 Feb 2022 10:47:48 +0100 Subject: [PATCH 49/66] add not supported storage --- tests/tests/test-mock-hrmp.ts | 111 ++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/tests/tests/test-mock-hrmp.ts b/tests/tests/test-mock-hrmp.ts index 21381b01a5..22a2c469ac 100644 --- a/tests/tests/test-mock-hrmp.ts +++ b/tests/tests/test-mock-hrmp.ts @@ -806,3 +806,114 @@ describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { expect(alithAssetZeroBalance).to.eq(10n * FOREIGN_TOKEN); }); }); + +describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { + let assetIdZero: string; + let alith: KeyringPair; + + before("Should register one asset without setting units per second", async function () { + const keyringEth = new Keyring({ type: "ethereum" }); + alith = keyringEth.addFromUri(ALITH_PRIV_KEY, null, "ethereum"); + + // registerAsset Asset 0 + // We register statemine with the new prefix + const { events: eventsRegisterZero } = await createBlockWithExtrinsic( + context, + alith, + context.polkadotApi.tx.sudo.sudo( + context.polkadotApi.tx.assetManager.registerAsset( + statemintLocation, + assetMetadata, + new BN(1), + true + ) + ) + ); + // Look for assetId in events + eventsRegisterZero.forEach((e) => { + if (e.section.toString() === "assetManager") { + assetIdZero = e.data[0].toHex(); + } + }); + assetIdZero = assetIdZero.replace(/,/g, ""); + + // check assets in storage + const registeredAssetZero = ( + (await context.polkadotApi.query.assets.asset(assetIdZero)) as any + ).unwrap(); + expect(registeredAssetZero.owner.toHex()).to.eq(palletId.toLowerCase()); + }); + + it("Should not receive 10 Statemine asset 0 tokens because fee payment not supported ", async function () { + // We are going to test that, using one of them as fee payment (assetOne), we can receive the other + let xcmMessage = { + V2: [ + { + ReserveAssetDeposited: [ + { + id: { + Concrete: { + parents: 1, + interior: { X2: [{ Parachain: statemint_para_id }, { GeneralIndex: 0 }] }, + }, + }, + fun: { Fungible: new BN(10000000000000) }, + }, + ], + }, + { ClearOrigin: null }, + { + BuyExecution: { + fees: { + id: { + Concrete: { + parents: new BN(1), + interior: { X2: [{ Parachain: statemint_para_id }, { GeneralIndex: 0 }] }, + }, + }, + fun: { Fungible: new BN(10000000000000) }, + }, + weightLimit: { Limited: new BN(4000000000) }, + }, + }, + { + DepositAsset: { + assets: { Wild: "All" }, + maxAssets: new BN(2), + beneficiary: { + parents: 0, + interior: { X1: { AccountKey20: { network: "Any", key: alith.address } } }, + }, + }, + }, + ], + }; + const xcmpFormat: XcmpMessageFormat = context.polkadotApi.createType( + "XcmpMessageFormat", + "ConcatenatedVersionedXcm" + ); + const receivedMessage: XcmVersionedXcm = context.polkadotApi.createType( + "XcmVersionedXcm", + xcmMessage + ); + + const totalMessage = [...xcmpFormat.toU8a(), ...receivedMessage.toU8a()]; + // Send RPC call to inject XCM message + // We will set a specific message knowing that it should mint the statemint asset + await customWeb3Request(context.web3, "xcm_injectHrmpMessage", [ + statemint_para_id, + totalMessage, + ]); + + // Create a block in which the XCM will be executed + await context.createBlock(); + + // Make sure the state has ALITH's foreign parachain tokens + let alithAssetZeroBalance = (await context.polkadotApi.query.assets.account( + assetIdZero, + alith.address + )) as any; + + expect(alithAssetZeroBalance.isNone).to.eq(true); + }); +}); From ed0e8c0e3c25cb82c786fb33e19416de7554cf74 Mon Sep 17 00:00:00 2001 From: gorka Date: Thu, 17 Feb 2022 18:31:45 +0100 Subject: [PATCH 50/66] Fix migration --- pallets/asset-manager/src/migrations.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pallets/asset-manager/src/migrations.rs b/pallets/asset-manager/src/migrations.rs index 865fbb8e97..43e6db7af3 100644 --- a/pallets/asset-manager/src/migrations.rs +++ b/pallets/asset-manager/src/migrations.rs @@ -481,11 +481,10 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result<(), &'static str> { - use frame_support::storage::migration::{storage_iter, storage_key_iter}; use frame_support::traits::OnRuntimeUpgradeHelpersExt; let pallet_prefix: &[u8] = b"AssetManager"; - let storage_item_prefix: &[u8] = b"AssetIdUnitsPerSecond"; + let storage_item_prefix: &[u8] = b"AssetTypeUnitsPerSecond"; // We want to test that: // There are no entries in the new storage beforehand @@ -500,7 +499,7 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { assert!(SupportedFeePaymentAssets::::get().len() == 0); // Check number of entries, and set it aside in temp storage - let stored_data: Vec<_> = storage_key_iter::( + let stored_data: Vec<_> = storage_key_iter::( pallet_prefix, storage_item_prefix, ) @@ -514,6 +513,7 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { .iter() .next() .expect("We already confirmed that there was at least one item stored") + .clone() .0; Self::set_temp_storage(example_key, "example_key"); @@ -534,10 +534,10 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { // Check that our example pair is still well-mapped after the migration if new_mapping_count > 0 { - let asset_id: T::AssetId = Self::get_temp_storage("example_pair").expect("qed"); + let asset_type: T::AssetType = Self::get_temp_storage("example_pair").expect("qed"); let migrated_info = SupportedFeePaymentAssets::::get(); // Check that the asset_id exists in migrated_info - assert!(migrated_info.contais(asset_id)); + assert!(migrated_info.contains(&asset_type)); } Ok(()) From 20dde4e2782ecc4197926b94ddd9ee881334272c Mon Sep 17 00:00:00 2001 From: gorka Date: Fri, 18 Feb 2022 10:04:04 +0100 Subject: [PATCH 51/66] Editorconfig --- tests/tests/test-mock-hrmp.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/tests/test-mock-hrmp.ts b/tests/tests/test-mock-hrmp.ts index 22a2c469ac..70f2c9f188 100644 --- a/tests/tests/test-mock-hrmp.ts +++ b/tests/tests/test-mock-hrmp.ts @@ -723,8 +723,9 @@ describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { } ); - it("Should receive 10 Statemine asset 0 tokens to Alith using statemint asset 1 as fee payment ", async function () { - // We are going to test that, using one of them as fee payment (assetOne), we can receive the other + it("Should receive 10 asset 0 tokens using statemint asset 1 as fee ", async function () { + // We are going to test that, using one of them as fee payment (assetOne), + // we can receive the other let xcmMessage = { V2: [ { @@ -844,8 +845,9 @@ describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { expect(registeredAssetZero.owner.toHex()).to.eq(palletId.toLowerCase()); }); - it("Should not receive 10 Statemine asset 0 tokens because fee payment not supported ", async function () { - // We are going to test that, using one of them as fee payment (assetOne), we can receive the other + it("Should not receive 10 asset 0 tokens because fee not supported ", async function () { + // We are going to test that, using one of them as fee payment (assetOne), + // we can receive the other let xcmMessage = { V2: [ { From 1cd99553c9d2f1acbc3a701a3988733d5e761d14 Mon Sep 17 00:00:00 2001 From: gorka Date: Fri, 18 Feb 2022 10:24:48 +0100 Subject: [PATCH 52/66] Evaluate set units per second based on the existing assets already --- pallets/asset-manager/src/benchmarks.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pallets/asset-manager/src/benchmarks.rs b/pallets/asset-manager/src/benchmarks.rs index 2fbef3bade..7f374bd419 100644 --- a/pallets/asset-manager/src/benchmarks.rs +++ b/pallets/asset-manager/src/benchmarks.rs @@ -37,7 +37,17 @@ benchmarks! { } set_asset_units_per_second { - // does not really matter what we register + // We make it dependent on the number of existing assets already + let x in 5..100; + for i in 0..x { + let asset_type: T::AssetType = MultiLocation::new(0, X1(GeneralIndex(i as u128))).into(); + let metadata = T::AssetRegistrarMetadata::default(); + let amount = 1u32.into(); + Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?; + Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1)?; + } + + // does not really matter what we register, as long as it is different than the previous let asset_type = T::AssetType::default(); let metadata = T::AssetRegistrarMetadata::default(); let amount = 1u32.into(); From e1dcf3b587bcd0114128197913b9e02663ce8b30 Mon Sep 17 00:00:00 2001 From: gorka Date: Fri, 18 Feb 2022 11:06:03 +0100 Subject: [PATCH 53/66] UPdate benchmarks to take into account vec length --- pallets/asset-manager/src/benchmarks.rs | 36 ++++++++++++++---------- pallets/asset-manager/src/lib.rs | 37 ++++++++++++++++++++++++- pallets/asset-manager/src/tests.rs | 30 +++++++++++++------- pallets/asset-manager/src/weights.rs | 32 +++++++++++---------- 4 files changed, 95 insertions(+), 40 deletions(-) diff --git a/pallets/asset-manager/src/benchmarks.rs b/pallets/asset-manager/src/benchmarks.rs index 7f374bd419..8358bddb16 100644 --- a/pallets/asset-manager/src/benchmarks.rs +++ b/pallets/asset-manager/src/benchmarks.rs @@ -44,7 +44,7 @@ benchmarks! { let metadata = T::AssetRegistrarMetadata::default(); let amount = 1u32.into(); Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?; - Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1)?; + Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1, i)?; } // does not really matter what we register, as long as it is different than the previous @@ -54,27 +54,35 @@ benchmarks! { let asset_id: T::AssetId = asset_type.clone().into(); Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?; - }: _(RawOrigin::Root, asset_type.clone(), 1) + }: _(RawOrigin::Root, asset_type.clone(), 1, x) verify { assert!(Pallet::::supported_fee_payment_assets().contains(&asset_type)); assert_eq!(Pallet::::asset_type_units_per_second(asset_type), Some(1)); } change_existing_asset_type { - // does not really matter what we register - let asset_type = T::AssetType::default(); - let new_asset_type: T::AssetType = MultiLocation::new(0, X1(GeneralIndex(0))).into(); - let metadata = T::AssetRegistrarMetadata::default(); - let amount = 1u32.into(); - let asset_id: T::AssetId = asset_type.clone().into(); - Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?; - // Worst case: we also set assets units per second - Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1)?; + // We make it dependent on the number of existing assets already + let x in 5..100; + for i in 0..x { + let asset_type: T::AssetType = MultiLocation::new(0, X1(GeneralIndex(i as u128))).into(); + let metadata = T::AssetRegistrarMetadata::default(); + let amount = 1u32.into(); + Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?; + Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1, i)?; + } + + let new_asset_type = T::AssetType::default(); + let asset_type_to_be_changed: T::AssetType = MultiLocation::new( + 0, + X1(GeneralIndex((x-1) as u128)) + ).into(); + let asset_id_to_be_changed = asset_type_to_be_changed.into(); - }: _(RawOrigin::Root, asset_id, new_asset_type.clone()) + }: _(RawOrigin::Root, asset_id_to_be_changed, new_asset_type.clone()) verify { - assert_eq!(Pallet::::asset_id_type(asset_id), Some(new_asset_type.clone())); + assert_eq!(Pallet::::asset_id_type(asset_id_to_be_changed), Some(new_asset_type.clone())); assert_eq!(Pallet::::asset_type_units_per_second(&new_asset_type), Some(1)); + assert!(Pallet::::supported_fee_payment_assets().contains(&new_asset_type)); } remove_supported_asset { @@ -85,7 +93,7 @@ benchmarks! { let metadata = T::AssetRegistrarMetadata::default(); let amount = 1u32.into(); Pallet::::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?; - Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1)?; + Pallet::::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1, i)?; } let asset_type_to_be_removed: T::AssetType = MultiLocation::new( 0, diff --git a/pallets/asset-manager/src/lib.rs b/pallets/asset-manager/src/lib.rs index 02388e9fb2..d2e77c6db8 100644 --- a/pallets/asset-manager/src/lib.rs +++ b/pallets/asset-manager/src/lib.rs @@ -194,11 +194,12 @@ pub mod pallet { } /// Change the amount of units we are charging per execution second for a given AssetType - #[pallet::weight(T::WeightInfo::set_asset_units_per_second())] + #[pallet::weight(T::WeightInfo::set_asset_units_per_second(*num_assets_weight_hint))] pub fn set_asset_units_per_second( origin: OriginFor, asset_type: T::AssetType, units_per_second: u128, + num_assets_weight_hint: u32, ) -> DispatchResult { T::AssetModifierOrigin::ensure_origin(origin)?; @@ -210,6 +211,11 @@ pub mod pallet { // Grab supported assets let mut supported_assets = SupportedFeePaymentAssets::::get(); + ensure!( + num_assets_weight_hint >= (supported_assets.len() as u32), + Error::::TooLowNumAssetsWeightHint + ); + // If not in our supported asset list, then put it if !supported_assets.contains(&asset_type) { supported_assets.push(asset_type.clone()); @@ -243,7 +249,36 @@ pub mod pallet { // Remove previous asset type info AssetTypeId::::remove(&previous_asset_type); + // Grab supported assets + let mut supported_assets = SupportedFeePaymentAssets::::get(); + + // Change AssetTypeUnitsPerSecond if let Some(units) = AssetTypeUnitsPerSecond::::get(&previous_asset_type) { + + // If the old exists in supported assts (it should), remove it + if let Some(index) = supported_assets + .iter() + .enumerate() + .find_map(|(index, asset)| { + if previous_asset_type == asset.clone() { + Some(index) + } else { + None + } + }) { + // Remove + supported_assets.remove(index); + } + + // If new is not in supported assets, push it + if !supported_assets.contains(&new_asset_type) { + // Push the new one + supported_assets.push(new_asset_type.clone()); + } + + // Insert supported fee payment assets + SupportedFeePaymentAssets::::put(supported_assets); + // Remove previous asset type info AssetTypeUnitsPerSecond::::remove(&previous_asset_type); AssetTypeUnitsPerSecond::::insert(&new_asset_type, units); diff --git a/pallets/asset-manager/src/tests.rs b/pallets/asset-manager/src/tests.rs index 67df62acf3..3ba95b1133 100644 --- a/pallets/asset-manager/src/tests.rs +++ b/pallets/asset-manager/src/tests.rs @@ -94,7 +94,8 @@ fn test_root_can_change_units_per_second() { assert_ok!(AssetManager::set_asset_units_per_second( Origin::root(), MockAssetType::MockAsset(1), - 200u128.into() + 200u128.into(), + 0 )); assert_eq!( @@ -128,7 +129,8 @@ fn test_regular_user_cannot_call_extrinsics() { AssetManager::set_asset_units_per_second( Origin::signed(1), MockAssetType::MockAsset(1), - 200u128.into() + 200u128.into(), + 0 ), sp_runtime::DispatchError::BadOrigin ); @@ -158,7 +160,8 @@ fn test_root_can_change_asset_id_type() { assert_ok!(AssetManager::set_asset_units_per_second( Origin::root(), MockAssetType::MockAsset(1), - 200u128.into() + 200u128.into(), + 0 )); assert_ok!(AssetManager::change_existing_asset_type( @@ -211,7 +214,8 @@ fn test_change_units_per_second_after_setting_it_once() { assert_ok!(AssetManager::set_asset_units_per_second( Origin::root(), MockAssetType::MockAsset(1), - 200u128.into() + 200u128.into(), + 0 )); assert_eq!( @@ -223,7 +227,8 @@ fn test_change_units_per_second_after_setting_it_once() { assert_ok!(AssetManager::set_asset_units_per_second( Origin::root(), MockAssetType::MockAsset(1), - 100u128.into() + 100u128.into(), + 1 )); assert_eq!( @@ -254,7 +259,8 @@ fn test_root_can_change_units_per_second_and_then_remove() { assert_ok!(AssetManager::set_asset_units_per_second( Origin::root(), MockAssetType::MockAsset(1), - 200u128.into() + 200u128.into(), + 0 )); assert_eq!( @@ -291,7 +297,8 @@ fn test_weight_hint_error() { assert_ok!(AssetManager::set_asset_units_per_second( Origin::root(), MockAssetType::MockAsset(1), - 200u128.into() + 200u128.into(), + 0 )); assert_noop!( @@ -308,7 +315,8 @@ fn test_asset_id_non_existent_error() { AssetManager::set_asset_units_per_second( Origin::root(), MockAssetType::MockAsset(1), - 200u128.into() + 200u128.into(), + 0 ), Error::::AssetDoesNotExist ); @@ -348,7 +356,8 @@ fn test_populate_supported_fee_payment_assets_works() { AssetManager::set_asset_units_per_second( Origin::root(), MockAssetType::MockAsset(1), - 200u128.into() + 200u128.into(), + 0 ), Error::::AssetDoesNotExist ); @@ -509,7 +518,8 @@ fn test_asset_manager_change_statemine_prefixes() { assert_ok!(AssetManager::set_asset_units_per_second( Origin::root(), statemine_multilocation_3.clone(), - 1u128 + 1u128, + 0 )); // We run the migration diff --git a/pallets/asset-manager/src/weights.rs b/pallets/asset-manager/src/weights.rs index 9d50be1845..ebf275d39c 100644 --- a/pallets/asset-manager/src/weights.rs +++ b/pallets/asset-manager/src/weights.rs @@ -17,8 +17,8 @@ //! Autogenerated weights for pallet_asset_manager //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-01-26, STEPS: `32`, REPEAT: 64, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 128 +//! DATE: 2022-02-18, STEPS: `32`, REPEAT: 64, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: // ./target/release/moonbeam @@ -53,7 +53,7 @@ use sp_std::marker::PhantomData; /// Weight functions needed for pallet_asset_manager. pub trait WeightInfo { fn register_asset() -> Weight; - fn set_asset_units_per_second() -> Weight; + fn set_asset_units_per_second(x: u32) -> Weight; fn change_existing_asset_type() -> Weight; fn remove_supported_asset(x: u32) -> Weight; } @@ -62,23 +62,24 @@ pub trait WeightInfo { pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { fn register_asset() -> Weight { - (53_300_000 as Weight) + (42_413_000 as Weight) .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } - fn set_asset_units_per_second() -> Weight { - (28_811_000 as Weight) + fn set_asset_units_per_second(x: u32) -> Weight { + (30_074_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_110_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn change_existing_asset_type() -> Weight { - (36_357_000 as Weight) + (30_855_000 as Weight) .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().writes(7 as Weight)) } fn remove_supported_asset(x: u32) -> Weight { - (30_516_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_330_000 as Weight).saturating_mul(x as Weight)) + (25_889_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_127_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } @@ -87,23 +88,24 @@ impl WeightInfo for SubstrateWeight { // For backwards compatibility and tests impl WeightInfo for () { fn register_asset() -> Weight { - (53_300_000 as Weight) + (42_413_000 as Weight) .saturating_add(RocksDbWeight::get().reads(7 as Weight)) .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } - fn set_asset_units_per_second() -> Weight { - (28_811_000 as Weight) + fn set_asset_units_per_second(x: u32) -> Weight { + (30_074_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_110_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(6 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } fn change_existing_asset_type() -> Weight { - (36_357_000 as Weight) + (30_855_000 as Weight) .saturating_add(RocksDbWeight::get().reads(6 as Weight)) .saturating_add(RocksDbWeight::get().writes(7 as Weight)) } fn remove_supported_asset(x: u32) -> Weight { - (30_516_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_330_000 as Weight).saturating_mul(x as Weight)) + (25_889_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_127_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } From f131de00419becf28590a43efaa6bc4f9b70a116 Mon Sep 17 00:00:00 2001 From: gorka Date: Fri, 18 Feb 2022 11:16:16 +0100 Subject: [PATCH 54/66] Keep adapting benchmarks --- pallets/asset-manager/src/benchmarks.rs | 2 +- pallets/asset-manager/src/lib.rs | 38 +++++++++++++---------- pallets/asset-manager/src/tests.rs | 3 ++ pallets/asset-manager/src/weights.rs | 40 +++++++++++++------------ 4 files changed, 47 insertions(+), 36 deletions(-) diff --git a/pallets/asset-manager/src/benchmarks.rs b/pallets/asset-manager/src/benchmarks.rs index 8358bddb16..4753c9bbb0 100644 --- a/pallets/asset-manager/src/benchmarks.rs +++ b/pallets/asset-manager/src/benchmarks.rs @@ -78,7 +78,7 @@ benchmarks! { ).into(); let asset_id_to_be_changed = asset_type_to_be_changed.into(); - }: _(RawOrigin::Root, asset_id_to_be_changed, new_asset_type.clone()) + }: _(RawOrigin::Root, asset_id_to_be_changed, new_asset_type.clone(), x) verify { assert_eq!(Pallet::::asset_id_type(asset_id_to_be_changed), Some(new_asset_type.clone())); assert_eq!(Pallet::::asset_type_units_per_second(&new_asset_type), Some(1)); diff --git a/pallets/asset-manager/src/lib.rs b/pallets/asset-manager/src/lib.rs index d2e77c6db8..c3098d4e77 100644 --- a/pallets/asset-manager/src/lib.rs +++ b/pallets/asset-manager/src/lib.rs @@ -231,14 +231,23 @@ pub mod pallet { /// Change the xcm type mapping for a given assetId /// We also change this if the previous units per second where pointing at the old /// assetType - #[pallet::weight(T::WeightInfo::change_existing_asset_type())] + #[pallet::weight(T::WeightInfo::change_existing_asset_type(*num_assets_weight_hint))] pub fn change_existing_asset_type( origin: OriginFor, asset_id: T::AssetId, new_asset_type: T::AssetType, + num_assets_weight_hint: u32, ) -> DispatchResult { T::AssetModifierOrigin::ensure_origin(origin)?; + // Grab supported assets + let mut supported_assets = SupportedFeePaymentAssets::::get(); + + ensure!( + num_assets_weight_hint >= (supported_assets.len() as u32), + Error::::TooLowNumAssetsWeightHint + ); + let previous_asset_type = AssetIdType::::get(&asset_id).ok_or(Error::::AssetDoesNotExist)?; @@ -249,23 +258,20 @@ pub mod pallet { // Remove previous asset type info AssetTypeId::::remove(&previous_asset_type); - // Grab supported assets - let mut supported_assets = SupportedFeePaymentAssets::::get(); - // Change AssetTypeUnitsPerSecond if let Some(units) = AssetTypeUnitsPerSecond::::get(&previous_asset_type) { - // If the old exists in supported assts (it should), remove it - if let Some(index) = supported_assets - .iter() - .enumerate() - .find_map(|(index, asset)| { - if previous_asset_type == asset.clone() { - Some(index) - } else { - None - } - }) { + if let Some(index) = + supported_assets + .iter() + .enumerate() + .find_map(|(index, asset)| { + if previous_asset_type == asset.clone() { + Some(index) + } else { + None + } + }) { // Remove supported_assets.remove(index); } @@ -278,7 +284,7 @@ pub mod pallet { // Insert supported fee payment assets SupportedFeePaymentAssets::::put(supported_assets); - + // Remove previous asset type info AssetTypeUnitsPerSecond::::remove(&previous_asset_type); AssetTypeUnitsPerSecond::::insert(&new_asset_type, units); diff --git a/pallets/asset-manager/src/tests.rs b/pallets/asset-manager/src/tests.rs index 3ba95b1133..8c10877ffe 100644 --- a/pallets/asset-manager/src/tests.rs +++ b/pallets/asset-manager/src/tests.rs @@ -140,6 +140,7 @@ fn test_regular_user_cannot_call_extrinsics() { Origin::signed(1), 1, MockAssetType::MockAsset(2), + 1 ), sp_runtime::DispatchError::BadOrigin ); @@ -168,6 +169,7 @@ fn test_root_can_change_asset_id_type() { Origin::root(), 1, MockAssetType::MockAsset(2), + 1 )); // New one contains the new asset type units per second @@ -325,6 +327,7 @@ fn test_asset_id_non_existent_error() { Origin::root(), 1, MockAssetType::MockAsset(2), + 1 ), Error::::AssetDoesNotExist ); diff --git a/pallets/asset-manager/src/weights.rs b/pallets/asset-manager/src/weights.rs index ebf275d39c..12a8ddba40 100644 --- a/pallets/asset-manager/src/weights.rs +++ b/pallets/asset-manager/src/weights.rs @@ -54,7 +54,7 @@ use sp_std::marker::PhantomData; pub trait WeightInfo { fn register_asset() -> Weight; fn set_asset_units_per_second(x: u32) -> Weight; - fn change_existing_asset_type() -> Weight; + fn change_existing_asset_type(x: u32) -> Weight; fn remove_supported_asset(x: u32) -> Weight; } @@ -62,24 +62,25 @@ pub trait WeightInfo { pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { fn register_asset() -> Weight { - (42_413_000 as Weight) + (43_646_000 as Weight) .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } fn set_asset_units_per_second(x: u32) -> Weight { - (30_074_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_110_000 as Weight).saturating_mul(x as Weight)) + (31_027_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_097_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } - fn change_existing_asset_type() -> Weight { - (30_855_000 as Weight) - .saturating_add(T::DbWeight::get().reads(6 as Weight)) - .saturating_add(T::DbWeight::get().writes(7 as Weight)) + fn change_existing_asset_type(x: u32) -> Weight { + (39_517_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_370_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(T::DbWeight::get().reads(7 as Weight)) + .saturating_add(T::DbWeight::get().writes(8 as Weight)) } fn remove_supported_asset(x: u32) -> Weight { - (25_889_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_127_000 as Weight).saturating_mul(x as Weight)) + (24_672_000 as Weight) // Standard Error: 3_000 + .saturating_add((1_336_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } @@ -88,24 +89,25 @@ impl WeightInfo for SubstrateWeight { // For backwards compatibility and tests impl WeightInfo for () { fn register_asset() -> Weight { - (42_413_000 as Weight) + (43_646_000 as Weight) .saturating_add(RocksDbWeight::get().reads(7 as Weight)) .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } fn set_asset_units_per_second(x: u32) -> Weight { - (30_074_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_110_000 as Weight).saturating_mul(x as Weight)) + (31_027_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_097_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(6 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } - fn change_existing_asset_type() -> Weight { - (30_855_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(6 as Weight)) - .saturating_add(RocksDbWeight::get().writes(7 as Weight)) + fn change_existing_asset_type(x: u32) -> Weight { + (39_517_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_370_000 as Weight).saturating_mul(x as Weight)) + .saturating_add(RocksDbWeight::get().reads(7 as Weight)) + .saturating_add(RocksDbWeight::get().writes(8 as Weight)) } fn remove_supported_asset(x: u32) -> Weight { - (25_889_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_127_000 as Weight).saturating_mul(x as Weight)) + (24_672_000 as Weight) // Standard Error: 3_000 + .saturating_add((1_336_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } From 2e9e9faa46d0d1937368ee59ea0a04028147afc0 Mon Sep 17 00:00:00 2001 From: gorka Date: Fri, 18 Feb 2022 11:23:49 +0100 Subject: [PATCH 55/66] Final weights --- pallets/asset-manager/src/weights.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pallets/asset-manager/src/weights.rs b/pallets/asset-manager/src/weights.rs index 12a8ddba40..f6992f0a4a 100644 --- a/pallets/asset-manager/src/weights.rs +++ b/pallets/asset-manager/src/weights.rs @@ -62,25 +62,25 @@ pub trait WeightInfo { pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { fn register_asset() -> Weight { - (43_646_000 as Weight) + (42_957_000 as Weight) .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } fn set_asset_units_per_second(x: u32) -> Weight { - (31_027_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_097_000 as Weight).saturating_mul(x as Weight)) + (30_194_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_138_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn change_existing_asset_type(x: u32) -> Weight { - (39_517_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_370_000 as Weight).saturating_mul(x as Weight)) + (40_251_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_198_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(8 as Weight)) } fn remove_supported_asset(x: u32) -> Weight { - (24_672_000 as Weight) // Standard Error: 3_000 - .saturating_add((1_336_000 as Weight).saturating_mul(x as Weight)) + (24_328_000 as Weight) // Standard Error: 3_000 + .saturating_add((1_170_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } @@ -89,25 +89,25 @@ impl WeightInfo for SubstrateWeight { // For backwards compatibility and tests impl WeightInfo for () { fn register_asset() -> Weight { - (43_646_000 as Weight) + (42_957_000 as Weight) .saturating_add(RocksDbWeight::get().reads(7 as Weight)) .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } fn set_asset_units_per_second(x: u32) -> Weight { - (31_027_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_097_000 as Weight).saturating_mul(x as Weight)) + (30_194_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_138_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(6 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } fn change_existing_asset_type(x: u32) -> Weight { - (39_517_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_370_000 as Weight).saturating_mul(x as Weight)) + (40_251_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_198_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(7 as Weight)) .saturating_add(RocksDbWeight::get().writes(8 as Weight)) } fn remove_supported_asset(x: u32) -> Weight { - (24_672_000 as Weight) // Standard Error: 3_000 - .saturating_add((1_336_000 as Weight).saturating_mul(x as Weight)) + (24_328_000 as Weight) // Standard Error: 3_000 + .saturating_add((1_170_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } From 7bde5b39c487ef927e6116ab864a6707e004133f Mon Sep 17 00:00:00 2001 From: gorka Date: Fri, 18 Feb 2022 11:43:08 +0100 Subject: [PATCH 56/66] weight hint for setAssetsUnitsPerSecond --- runtime/moonbase/tests/xcm_tests.rs | 69 ++++++++++++++------- runtime/moonbeam/tests/xcm_tests.rs | 57 +++++++++++------ runtime/moonriver/tests/xcm_tests.rs | 57 +++++++++++------ tests/tests/test-asset-manager.ts | 2 +- tests/tests/test-mock-dmp.ts | 2 +- tests/tests/test-mock-hrmp.ts | 8 +-- tests/tests/test-pallet-maintenance-mode.ts | 4 +- 7 files changed, 130 insertions(+), 69 deletions(-) diff --git a/runtime/moonbase/tests/xcm_tests.rs b/runtime/moonbase/tests/xcm_tests.rs index c8ebca560c..c37f7436a1 100644 --- a/runtime/moonbase/tests/xcm_tests.rs +++ b/runtime/moonbase/tests/xcm_tests.rs @@ -54,7 +54,8 @@ fn receive_relay_asset_from_relay() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -107,7 +108,8 @@ fn send_relay_asset_to_relay() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -190,7 +192,8 @@ fn send_relay_asset_to_para_b() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location.clone(), - 0u128 + 0u128, + 0 )); }); @@ -205,7 +208,8 @@ fn send_relay_asset_to_para_b() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -287,7 +291,8 @@ fn send_para_a_asset_to_para_b() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -351,7 +356,8 @@ fn send_para_a_asset_from_para_b_to_para_c() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location.clone(), - 0u128 + 0u128, + 0 )); }); @@ -366,7 +372,8 @@ fn send_para_a_asset_from_para_b_to_para_c() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -458,7 +465,8 @@ fn send_para_a_asset_to_para_b_and_back_to_para_a() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -552,7 +560,8 @@ fn send_para_a_asset_to_para_b_and_back_to_para_a_with_new_reanchoring() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -665,7 +674,8 @@ fn receive_relay_asset_with_trader() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 2500000000000u128 + 2500000000000u128, + 0 )); }); @@ -723,7 +733,8 @@ fn send_para_a_asset_to_para_b_with_trader() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 2500000000000u128 + 2500000000000u128, + 0 )); }); @@ -797,7 +808,8 @@ fn send_para_a_asset_to_para_b_with_trader_and_fee() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 12500000u128 + 12500000u128, + 0 )); }); @@ -870,7 +882,8 @@ fn error_when_not_paying_enough() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 2500000000000u128 + 2500000000000u128, + 0 )); }); @@ -917,7 +930,8 @@ fn transact_through_derivative_multilocation() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 1u128 + 1u128, + 0 )); // Root can set transact info @@ -1070,7 +1084,8 @@ fn transact_through_sovereign() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 1u128 + 1u128, + 0 )); // Root can set transact info @@ -1217,7 +1232,8 @@ fn test_automatic_versioning_on_runtime_upgrade_with_relay() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1366,7 +1382,8 @@ fn test_automatic_versioning_on_runtime_upgrade_with_para_b() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1498,7 +1515,8 @@ fn receive_asset_with_no_sufficients_not_possible_if_non_existent_account() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1575,7 +1593,8 @@ fn receive_assets_with_sufficients_true_allows_non_funded_account_to_receive_ass assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1634,7 +1653,8 @@ fn evm_account_receiving_assets_should_handle_sufficients_ref_count() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1696,7 +1716,8 @@ fn empty_account_should_not_be_reset() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1803,7 +1824,8 @@ fn test_statemint_like() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1911,7 +1933,8 @@ fn test_statemint_like_prefix_change() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); diff --git a/runtime/moonbeam/tests/xcm_tests.rs b/runtime/moonbeam/tests/xcm_tests.rs index e095807984..666748c2ee 100644 --- a/runtime/moonbeam/tests/xcm_tests.rs +++ b/runtime/moonbeam/tests/xcm_tests.rs @@ -61,7 +61,8 @@ fn receive_relay_asset_from_relay() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -114,7 +115,8 @@ fn send_relay_asset_to_relay() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -197,7 +199,8 @@ fn send_relay_asset_to_para_b() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location.clone(), - 0u128 + 0u128, + 0 )); }); @@ -212,7 +215,8 @@ fn send_relay_asset_to_para_b() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -294,7 +298,8 @@ fn send_para_a_asset_to_para_b() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -361,7 +366,8 @@ fn send_para_a_asset_from_para_b_to_para_c() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location.clone(), - 0u128 + 0u128, + 0 )); }); @@ -376,7 +382,8 @@ fn send_para_a_asset_from_para_b_to_para_c() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -473,7 +480,8 @@ fn send_para_a_asset_to_para_b_and_back_to_para_a() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -574,7 +582,8 @@ fn receive_relay_asset_with_trader() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 2500000000000u128 + 2500000000000u128, + 0 )); }); @@ -639,7 +648,8 @@ fn error_when_not_paying_enough() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 2500000000000u128 + 2500000000000u128, + 0 )); }); @@ -686,7 +696,8 @@ fn transact_through_derivative_multilocation() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 1u128 + 1u128, + 0 )); // Root can set transact info @@ -828,7 +839,8 @@ fn transact_through_sovereign() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 1u128 + 1u128, + 0 )); // Root can set transact info @@ -975,7 +987,8 @@ fn test_automatic_versioning_on_runtime_upgrade_with_relay() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1106,7 +1119,8 @@ fn receive_asset_with_no_sufficients_not_possible_if_non_existent_account() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1183,7 +1197,8 @@ fn receive_assets_with_sufficients_true_allows_non_funded_account_to_receive_ass assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1242,7 +1257,8 @@ fn evm_account_receiving_assets_should_handle_sufficients_ref_count() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1304,7 +1320,8 @@ fn empty_account_should_not_be_reset() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1411,7 +1428,8 @@ fn test_statemint_like() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1519,7 +1537,8 @@ fn test_statemint_like_prefix_change() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); diff --git a/runtime/moonriver/tests/xcm_tests.rs b/runtime/moonriver/tests/xcm_tests.rs index fca958e292..4b23c3b4fd 100644 --- a/runtime/moonriver/tests/xcm_tests.rs +++ b/runtime/moonriver/tests/xcm_tests.rs @@ -61,7 +61,8 @@ fn receive_relay_asset_from_relay() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -114,7 +115,8 @@ fn send_relay_asset_to_relay() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -197,7 +199,8 @@ fn send_relay_asset_to_para_b() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location.clone(), - 0u128 + 0u128, + 0 )); }); @@ -212,7 +215,8 @@ fn send_relay_asset_to_para_b() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -294,7 +298,8 @@ fn send_para_a_asset_to_para_b() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -361,7 +366,8 @@ fn send_para_a_asset_from_para_b_to_para_c() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location.clone(), - 0u128 + 0u128, + 0 )); }); @@ -376,7 +382,8 @@ fn send_para_a_asset_from_para_b_to_para_c() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -473,7 +480,8 @@ fn send_para_a_asset_to_para_b_and_back_to_para_a() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -574,7 +582,8 @@ fn receive_relay_asset_with_trader() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 2500000000000u128 + 2500000000000u128, + 0 )); }); @@ -639,7 +648,8 @@ fn error_when_not_paying_enough() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 2500000000000u128 + 2500000000000u128, + 0 )); }); @@ -686,7 +696,8 @@ fn transact_through_derivative_multilocation() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 1u128 + 1u128, + 0 )); // Root can set transact info @@ -828,7 +839,8 @@ fn transact_through_sovereign() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 1u128 + 1u128, + 0 )); // Root can set transact info @@ -975,7 +987,8 @@ fn test_automatic_versioning_on_runtime_upgrade_with_relay() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1106,7 +1119,8 @@ fn receive_asset_with_no_sufficients_not_possible_if_non_existent_account() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1183,7 +1197,8 @@ fn receive_assets_with_sufficients_true_allows_non_funded_account_to_receive_ass assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1242,7 +1257,8 @@ fn evm_account_receiving_assets_should_handle_sufficients_ref_count() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1304,7 +1320,8 @@ fn empty_account_should_not_be_reset() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1410,7 +1427,8 @@ fn test_statemine_like() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -1518,7 +1536,8 @@ fn test_statemine_like_prefix_change() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); diff --git a/tests/tests/test-asset-manager.ts b/tests/tests/test-asset-manager.ts index 6629d69ed1..b5d6a81cdb 100644 --- a/tests/tests/test-asset-manager.ts +++ b/tests/tests/test-asset-manager.ts @@ -45,7 +45,7 @@ describeDevMoonbeam("XCM - asset manager - register asset", (context) => { context, alith, parachainOne.tx.sudo.sudo( - parachainOne.tx.assetManager.setAssetUnitsPerSecond(sourceLocation, 0) + parachainOne.tx.assetManager.setAssetUnitsPerSecond(sourceLocation, 0, 0) ) ); expect(events[1].method.toString()).to.eq("UnitsPerSecondChanged"); diff --git a/tests/tests/test-mock-dmp.ts b/tests/tests/test-mock-dmp.ts index b5164bf56c..3bcb8abcd5 100644 --- a/tests/tests/test-mock-dmp.ts +++ b/tests/tests/test-mock-dmp.ts @@ -56,7 +56,7 @@ describeDevMoonbeam("Mock XCM - receive downward transfer", (context) => { context, alith, context.polkadotApi.tx.sudo.sudo( - context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(sourceLocation, 0) + context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(sourceLocation, 0, 0) ) ); expect(events[1].method.toString()).to.eq("UnitsPerSecondChanged"); diff --git a/tests/tests/test-mock-hrmp.ts b/tests/tests/test-mock-hrmp.ts index 70f2c9f188..c74ae78ba5 100644 --- a/tests/tests/test-mock-hrmp.ts +++ b/tests/tests/test-mock-hrmp.ts @@ -86,7 +86,7 @@ describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { context, alith, context.polkadotApi.tx.sudo.sudo( - context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(sourceLocation, 0) + context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(sourceLocation, 0, 0) ) ); expect(events[1].method.toString()).to.eq("UnitsPerSecondChanged"); @@ -153,7 +153,7 @@ describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { context, alith, context.polkadotApi.tx.sudo.sudo( - context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(statemintLocation, 0) + context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(statemintLocation, 0, 0) ) ); expect(events[1].method.toString()).to.eq("UnitsPerSecondChanged"); @@ -281,7 +281,7 @@ describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { context, alith, context.polkadotApi.tx.sudo.sudo( - context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(statemintLocation, 0) + context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(statemintLocation, 0, 0) ) ); expect(events[1].method.toString()).to.eq("UnitsPerSecondChanged"); @@ -705,7 +705,7 @@ describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { context, alith, context.polkadotApi.tx.sudo.sudo( - context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(statemintLocationAssetOne, 0) + context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(statemintLocationAssetOne, 0, 0) ) ); expect(events[1].method.toString()).to.eq("UnitsPerSecondChanged"); diff --git a/tests/tests/test-pallet-maintenance-mode.ts b/tests/tests/test-pallet-maintenance-mode.ts index 5501f6f878..9f8b76ee56 100644 --- a/tests/tests/test-pallet-maintenance-mode.ts +++ b/tests/tests/test-pallet-maintenance-mode.ts @@ -481,7 +481,7 @@ describeDevMoonbeam( context, sudoAccount, context.polkadotApi.tx.sudo.sudo( - context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(sourceLocation, 0) + context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(sourceLocation, 0, 0) ) ); expect(events[1].method.toString()).to.eq("UnitsPerSecondChanged"); @@ -575,7 +575,7 @@ describeDevMoonbeam( context, sudoAccount, context.polkadotApi.tx.sudo.sudo( - context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(sourceLocation, 0) + context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(sourceLocation, 0, 0) ) ); expect(events[1].method.toString()).to.eq("UnitsPerSecondChanged"); From 54ec016b53966aae7968d499014a8e5d7f5092e9 Mon Sep 17 00:00:00 2001 From: gorka Date: Fri, 18 Feb 2022 12:40:40 +0100 Subject: [PATCH 57/66] Prettier plus more tests --- tests/tests/test-asset-manager.ts | 84 ++++++++++++++++++++++++++++++- tests/tests/test-mock-hrmp.ts | 6 ++- 2 files changed, 87 insertions(+), 3 deletions(-) diff --git a/tests/tests/test-asset-manager.ts b/tests/tests/test-asset-manager.ts index b5d6a81cdb..6ce416f330 100644 --- a/tests/tests/test-asset-manager.ts +++ b/tests/tests/test-asset-manager.ts @@ -1,6 +1,7 @@ import Keyring from "@polkadot/keyring"; import { expect } from "chai"; -import { BN } from "@polkadot/util"; +import { BN, bnToHex } from "@polkadot/util"; +import { KeyringPair } from "@polkadot/keyring/types"; import { ALITH_PRIV_KEY } from "../util/constants"; import { describeDevMoonbeam } from "../util/setup-dev-tests"; @@ -15,7 +16,8 @@ const assetMetadata = { decimals: new BN(12), isFrozen: false, }; -const sourceLocation = { XCM: { X1: "Parent" } }; +const sourceLocation = { XCM: { parents: 1, interior: "Here" } }; +const newSourceLocation = { XCM: { parents: 1, interior: { X1: { Parachain: 1000 } } } }; describeDevMoonbeam("XCM - asset manager - register asset", (context) => { it("should be able to register an asset and set unit per sec", async function () { @@ -58,3 +60,81 @@ describeDevMoonbeam("XCM - asset manager - register asset", (context) => { await verifyLatestBlockFees(context, expect); }); }); + +describeDevMoonbeam("XCM - asset manager - register asset", (context) => { + let assetId: string; + let alith: KeyringPair; + before("should be able to change existing asset type", async function () { + const keyringEth = new Keyring({ type: "ethereum" }); + alith = keyringEth.addFromUri(ALITH_PRIV_KEY, null, "ethereum"); + + const parachainOne = context.polkadotApi; + // registerAsset + const { events: eventsRegister } = await createBlockWithExtrinsic( + context, + alith, + parachainOne.tx.sudo.sudo( + parachainOne.tx.assetManager.registerAsset(sourceLocation, assetMetadata, new BN(1), true) + ) + ); + + eventsRegister.forEach((e) => { + if (e.section.toString() === "assetManager") { + assetId = e.data[0].toHex(); + } + }); + assetId = assetId.replace(/,/g, ""); + + // setAssetUnitsPerSecond + const { events } = await createBlockWithExtrinsic( + context, + alith, + parachainOne.tx.sudo.sudo( + parachainOne.tx.assetManager.setAssetUnitsPerSecond(sourceLocation, 1, 0) + ) + ); + expect(events[1].method.toString()).to.eq("UnitsPerSecondChanged"); + expect(events[4].method.toString()).to.eq("ExtrinsicSuccess"); + + // check asset in storage + const registeredAsset = ((await parachainOne.query.assets.asset(assetId)) as any).unwrap(); + expect(registeredAsset.owner.toString()).to.eq(palletId); + + await verifyLatestBlockFees(context, expect); + }); + + it.only("should query asset balance", async function () { + // ChangeAssetType + await createBlockWithExtrinsic( + context, + alith, + context.polkadotApi.tx.sudo.sudo( + context.polkadotApi.tx.assetManager.changeExistingAssetType(assetId, newSourceLocation, 1) + ) + ); + + // asset_type + let assetType = (await context.polkadotApi.query.assetManager.assetIdType(assetId)) as Object; + + // assetId + let id = ( + (await context.polkadotApi.query.assetManager.assetTypeId(newSourceLocation)) as any + ).unwrap(); + + // asset units per second changed + let assetUnitsPerSecond = ( + (await context.polkadotApi.query.assetManager.assetTypeUnitsPerSecond( + newSourceLocation + )) as any + ).unwrap(); + + // Supported assets + let supportedAssets = + (await context.polkadotApi.query.assetManager.supportedFeePaymentAssets()) as any; + + expect(assetUnitsPerSecond.toString()).to.eq(new BN(1).toString()); + expect(assetType.toString()).to.eq(JSON.stringify(newSourceLocation).toLowerCase()); + expect(bnToHex(id)).to.eq(assetId); + expect(supportedAssets[0].toString()).to.eq(JSON.stringify(newSourceLocation).toLowerCase()); + }); +}); diff --git a/tests/tests/test-mock-hrmp.ts b/tests/tests/test-mock-hrmp.ts index c74ae78ba5..d3759533d0 100644 --- a/tests/tests/test-mock-hrmp.ts +++ b/tests/tests/test-mock-hrmp.ts @@ -705,7 +705,11 @@ describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { context, alith, context.polkadotApi.tx.sudo.sudo( - context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond(statemintLocationAssetOne, 0, 0) + context.polkadotApi.tx.assetManager.setAssetUnitsPerSecond( + statemintLocationAssetOne, + 0, + 0 + ) ) ); expect(events[1].method.toString()).to.eq("UnitsPerSecondChanged"); From 66d90402ac0f11f840b2525ea458b69733e7543b Mon Sep 17 00:00:00 2001 From: gorka Date: Fri, 18 Feb 2022 16:31:12 +0100 Subject: [PATCH 58/66] add remove supported fee typescript test --- tests/tests/test-asset-manager.ts | 75 ++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/tests/tests/test-asset-manager.ts b/tests/tests/test-asset-manager.ts index 6ce416f330..527bbe9a8e 100644 --- a/tests/tests/test-asset-manager.ts +++ b/tests/tests/test-asset-manager.ts @@ -103,7 +103,7 @@ describeDevMoonbeam("XCM - asset manager - register asset", (context) => { await verifyLatestBlockFees(context, expect); }); - it.only("should query asset balance", async function () { + it("should change the asset Id", async function () { // ChangeAssetType await createBlockWithExtrinsic( context, @@ -138,3 +138,76 @@ describeDevMoonbeam("XCM - asset manager - register asset", (context) => { expect(supportedAssets[0].toString()).to.eq(JSON.stringify(newSourceLocation).toLowerCase()); }); }); + +describeDevMoonbeam("XCM - asset manager - register asset", (context) => { + let assetId: string; + let alith: KeyringPair; + before("should be able to change existing asset type", async function () { + const keyringEth = new Keyring({ type: "ethereum" }); + alith = keyringEth.addFromUri(ALITH_PRIV_KEY, null, "ethereum"); + + const parachainOne = context.polkadotApi; + // registerAsset + const { events: eventsRegister } = await createBlockWithExtrinsic( + context, + alith, + parachainOne.tx.sudo.sudo( + parachainOne.tx.assetManager.registerAsset(sourceLocation, assetMetadata, new BN(1), true) + ) + ); + + eventsRegister.forEach((e) => { + if (e.section.toString() === "assetManager") { + assetId = e.data[0].toHex(); + } + }); + assetId = assetId.replace(/,/g, ""); + + // setAssetUnitsPerSecond + const { events } = await createBlockWithExtrinsic( + context, + alith, + parachainOne.tx.sudo.sudo( + parachainOne.tx.assetManager.setAssetUnitsPerSecond(sourceLocation, 1, 0) + ) + ); + expect(events[1].method.toString()).to.eq("UnitsPerSecondChanged"); + expect(events[4].method.toString()).to.eq("ExtrinsicSuccess"); + + // check asset in storage + const registeredAsset = ((await parachainOne.query.assets.asset(assetId)) as any).unwrap(); + expect(registeredAsset.owner.toString()).to.eq(palletId); + + await verifyLatestBlockFees(context, expect); + }); + + it("should remove an asset from our supported fee payments", async function () { + // ChangeAssetType + await createBlockWithExtrinsic( + context, + alith, + context.polkadotApi.tx.sudo.sudo( + context.polkadotApi.tx.assetManager.removeSupportedAsset(sourceLocation, 1) + ) + ); + + // assetId + let id = ( + (await context.polkadotApi.query.assetManager.assetTypeId(sourceLocation)) as any + ).unwrap(); + + // asset units per second removed + let assetUnitsPerSecond = (await context.polkadotApi.query.assetManager.assetTypeUnitsPerSecond( + sourceLocation + )) as any; + + // Supported assets should be 0 + let supportedAssets = + (await context.polkadotApi.query.assetManager.supportedFeePaymentAssets()) as any; + + expect(assetUnitsPerSecond.isNone).to.eq(true); + expect(bnToHex(id)).to.eq(assetId); + // the asset should not be supported + expect(supportedAssets.length).to.eq(0); + }); +}); From f7529cef9ebd83be1dda1b5548abce7d96e898fd Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 21 Feb 2022 10:29:41 +0100 Subject: [PATCH 59/66] Fix migration --- pallets/asset-manager/src/migrations.rs | 4 ++-- runtime/common/Cargo.toml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pallets/asset-manager/src/migrations.rs b/pallets/asset-manager/src/migrations.rs index 43e6db7af3..aaf67d041b 100644 --- a/pallets/asset-manager/src/migrations.rs +++ b/pallets/asset-manager/src/migrations.rs @@ -505,7 +505,7 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { ) .collect(); let mapping_count = stored_data.len(); - Self::set_temp_storage(mapping_count as u32, "mapping_count"); + Self::set_temp_storage(mapping_count as u64, "mapping_count"); // Read an example pair from old storage and set it aside in temp storage if mapping_count > 0 { @@ -516,7 +516,7 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { .clone() .0; - Self::set_temp_storage(example_key, "example_key"); + Self::set_temp_storage(example_key, "example_pair"); } Ok(()) diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 7c75528141..c2c808c9b9 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -53,5 +53,6 @@ std = [ try-runtime = [ "frame-support/try-runtime", "pallet-migrations/try-runtime", + "pallet-asset-manager/try-runtime", ] xcm-support = [ "pallet-asset-manager", "xcm", "xcm-transactor" ] From 61ac1524d286d5803b65014f005c89404ab260bf Mon Sep 17 00:00:00 2001 From: gorka Date: Mon, 21 Feb 2022 10:40:47 +0100 Subject: [PATCH 60/66] Include asset-manager with try-runtime --- runtime/common/Cargo.toml | 1 - runtime/moonbase/Cargo.toml | 1 + runtime/moonbeam/Cargo.toml | 1 + runtime/moonriver/Cargo.toml | 1 + 4 files changed, 3 insertions(+), 1 deletion(-) diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index c2c808c9b9..7c75528141 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -53,6 +53,5 @@ std = [ try-runtime = [ "frame-support/try-runtime", "pallet-migrations/try-runtime", - "pallet-asset-manager/try-runtime", ] xcm-support = [ "pallet-asset-manager", "xcm", "xcm-transactor" ] diff --git a/runtime/moonbase/Cargo.toml b/runtime/moonbase/Cargo.toml index 516c1008f9..a0fbb6a9ea 100644 --- a/runtime/moonbase/Cargo.toml +++ b/runtime/moonbase/Cargo.toml @@ -182,6 +182,7 @@ try-runtime = [ "frame-executive/try-runtime", "frame-system/try-runtime", "frame-try-runtime", + "pallet-asset-manager/try-runtime", "pallet-author-mapping/try-runtime", "pallet-balances/try-runtime", "pallet-collective/try-runtime", diff --git a/runtime/moonbeam/Cargo.toml b/runtime/moonbeam/Cargo.toml index 80a34f5ab6..e5350182a7 100644 --- a/runtime/moonbeam/Cargo.toml +++ b/runtime/moonbeam/Cargo.toml @@ -173,6 +173,7 @@ try-runtime = [ "frame-executive/try-runtime", "frame-system/try-runtime", "frame-try-runtime", + "pallet-asset-manager/try-runtime", "pallet-author-mapping/try-runtime", "pallet-balances/try-runtime", "pallet-collective/try-runtime", diff --git a/runtime/moonriver/Cargo.toml b/runtime/moonriver/Cargo.toml index a0268a9c00..3e8fae5a99 100644 --- a/runtime/moonriver/Cargo.toml +++ b/runtime/moonriver/Cargo.toml @@ -257,6 +257,7 @@ try-runtime = [ "frame-executive/try-runtime", "frame-system/try-runtime", "frame-try-runtime", + "pallet-asset-manager/try-runtime", "pallet-author-mapping/try-runtime", "pallet-balances/try-runtime", "pallet-collective/try-runtime", From bcab2b9496662acbbe16d6b68469991a23e73a7c Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 22 Feb 2022 11:21:11 +0100 Subject: [PATCH 61/66] apply PR suggestions --- pallets/asset-manager/src/migrations.rs | 24 ++++++++++++++++++------ pallets/asset-manager/src/tests.rs | 4 ++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/pallets/asset-manager/src/migrations.rs b/pallets/asset-manager/src/migrations.rs index aaf67d041b..7e11916305 100644 --- a/pallets/asset-manager/src/migrations.rs +++ b/pallets/asset-manager/src/migrations.rs @@ -437,10 +437,18 @@ where pub struct PopulateSupportedFeePaymentAssets(PhantomData); impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { fn on_runtime_upgrade() -> Weight { - log::info!(target: "PopulateSupportedFeePaymentAssets", "actually running it"); + log::trace!( + target: "PopulateSupportedFeePaymentAssets", + "Running PopulateSupportedFeePaymentAssets migration" + ); let pallet_prefix: &[u8] = b"AssetManager"; let storage_item_prefix: &[u8] = b"AssetTypeUnitsPerSecond"; + log::trace!( + target: "PopulateSupportedFeePaymentAssets", + "grabbing from AssetTypeUnitsPerSecond" + ); + // Read all the data into memory. // https://crates.parity.io/frame_support/storage/migration/fn.storage_key_iter.html let stored_data: Vec<_> = storage_key_iter::( @@ -454,9 +462,9 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { .try_into() .expect("There are between 0 and 2**64 mappings stored."); - log::info!( + log::trace!( target: "PopulateSupportedFeePaymentAssets", - "Migrating {:?} elements", + "PopulateSupportedFeePaymentAssets pushing {:?} elements to SupportedFeePaymentAssets", migrated_count ); @@ -467,11 +475,15 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { } // Push value - SupportedFeePaymentAssets::::put(supported_assets); + SupportedFeePaymentAssets::::put(&supported_assets); - log::info!(target: "PopulateSupportedFeePaymentAssets", "almost done"); + log::trace!( + target: "PopulateSupportedFeePaymentAssets", + "SupportedFeePaymentAssets populated now having {:?} elements", + supported_assets.len() + ); - // Return the weight used. For each migrated mapping there is a red to get it into + // Return the weight used. For each migrated mapping there is a read to get it into // memory // A final one write makes it push to the new storage item let db_weights = T::DbWeight::get(); diff --git a/pallets/asset-manager/src/tests.rs b/pallets/asset-manager/src/tests.rs index 1f10da3b1d..f99fa3414c 100644 --- a/pallets/asset-manager/src/tests.rs +++ b/pallets/asset-manager/src/tests.rs @@ -304,6 +304,10 @@ fn test_root_can_change_units_per_second_and_then_remove() { 1, )); + assert!( + !AssetManager::supported_fee_payment_assets().contains(&MockAssetType::MockAsset(1)) + ); + expect_events(vec![ crate::Event::AssetRegistered { asset_id: 1, From bc98d4c6c39ebd1c4203c4040f584adf43cff91b Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 22 Feb 2022 11:22:39 +0100 Subject: [PATCH 62/66] Keep old weight for register asset --- pallets/asset-manager/src/weights.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pallets/asset-manager/src/weights.rs b/pallets/asset-manager/src/weights.rs index f6992f0a4a..a7f9dfaf99 100644 --- a/pallets/asset-manager/src/weights.rs +++ b/pallets/asset-manager/src/weights.rs @@ -62,7 +62,7 @@ pub trait WeightInfo { pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { fn register_asset() -> Weight { - (42_957_000 as Weight) + (52_375_000 as Weight) .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(6 as Weight)) } @@ -89,7 +89,7 @@ impl WeightInfo for SubstrateWeight { // For backwards compatibility and tests impl WeightInfo for () { fn register_asset() -> Weight { - (42_957_000 as Weight) + (52_375_000 as Weight) .saturating_add(RocksDbWeight::get().reads(7 as Weight)) .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } From c65ecb415ff8e827ef518eeddf836b2fdf12be41 Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 22 Feb 2022 12:33:45 +0100 Subject: [PATCH 63/66] Fix hrmp tests --- tests/tests/test-mock-hrmp.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/tests/test-mock-hrmp.ts b/tests/tests/test-mock-hrmp.ts index c11271dfca..99bbdd0bdf 100644 --- a/tests/tests/test-mock-hrmp.ts +++ b/tests/tests/test-mock-hrmp.ts @@ -781,14 +781,15 @@ describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { }, ], }; + const xcmpFormat: XcmpMessageFormat = context.polkadotApi.createType( "XcmpMessageFormat", "ConcatenatedVersionedXcm" - ); + ) as any; const receivedMessage: XcmVersionedXcm = context.polkadotApi.createType( "XcmVersionedXcm", xcmMessage - ); + ) as any; const totalMessage = [...xcmpFormat.toU8a(), ...receivedMessage.toU8a()]; // Send RPC call to inject XCM message @@ -897,11 +898,11 @@ describeDevMoonbeam("Mock XCM - receive horizontal transfer", (context) => { const xcmpFormat: XcmpMessageFormat = context.polkadotApi.createType( "XcmpMessageFormat", "ConcatenatedVersionedXcm" - ); + ) as any; const receivedMessage: XcmVersionedXcm = context.polkadotApi.createType( "XcmVersionedXcm", xcmMessage - ); + ) as any; const totalMessage = [...xcmpFormat.toU8a(), ...receivedMessage.toU8a()]; // Send RPC call to inject XCM message From 9a2c41814da7e0cbb4af86dda97f76665f46cd94 Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 22 Feb 2022 21:14:27 +0100 Subject: [PATCH 64/66] Update to binary search --- pallets/asset-manager/src/lib.rs | 49 ++++++++----------------- pallets/asset-manager/src/migrations.rs | 2 + pallets/asset-manager/src/tests.rs | 5 --- 3 files changed, 17 insertions(+), 39 deletions(-) diff --git a/pallets/asset-manager/src/lib.rs b/pallets/asset-manager/src/lib.rs index 5c05066d27..bd161c8dd2 100644 --- a/pallets/asset-manager/src/lib.rs +++ b/pallets/asset-manager/src/lib.rs @@ -87,7 +87,9 @@ pub mod pallet { impl xcm_primitives::UnitsToWeightRatio for Pallet { fn payment_is_supported(asset_type: T::AssetType) -> bool { - SupportedFeePaymentAssets::::get().contains(&asset_type) + SupportedFeePaymentAssets::::get() + .binary_search(&asset_type) + .is_ok() } fn get_units_per_second(asset_type: T::AssetType) -> Option { AssetTypeUnitsPerSecond::::get(asset_type) @@ -234,9 +236,9 @@ pub mod pallet { Error::::TooLowNumAssetsWeightHint ); - // If not in our supported asset list, then put it - if !supported_assets.contains(&asset_type) { - supported_assets.push(asset_type.clone()); + // Only if the asset is not supported we need to push it + if let Err(index) = supported_assets.binary_search(&asset_type) { + supported_assets.insert(index, asset_type.clone()); SupportedFeePaymentAssets::::put(supported_assets); } @@ -281,26 +283,14 @@ pub mod pallet { // Change AssetTypeUnitsPerSecond if let Some(units) = AssetTypeUnitsPerSecond::::get(&previous_asset_type) { - // If the old exists in supported assts (it should), remove it - if let Some(index) = - supported_assets - .iter() - .enumerate() - .find_map(|(index, asset)| { - if previous_asset_type == asset.clone() { - Some(index) - } else { - None - } - }) { - // Remove + // Only if the old asset is supported we need to remove it + if let Ok(index) = supported_assets.binary_search(&previous_asset_type) { supported_assets.remove(index); } - // If new is not in supported assets, push it - if !supported_assets.contains(&new_asset_type) { - // Push the new one - supported_assets.push(new_asset_type.clone()); + // Only if the new asset is not supported we need to push it + if let Err(index) = supported_assets.binary_search(&new_asset_type) { + supported_assets.insert(index, new_asset_type.clone()); } // Insert supported fee payment assets @@ -334,20 +324,11 @@ pub mod pallet { num_assets_weight_hint >= (supported_assets.len() as u32), Error::::TooLowNumAssetsWeightHint ); - let index = supported_assets - .iter() - .enumerate() - .find_map(|(index, asset)| { - if asset_type == asset.clone() { - Some(index) - } else { - None - } - }) - .ok_or(Error::::AssetDoesNotExist)?; - // Remove - supported_assets.remove(index); + // Only if the old asset is supported we need to remove it + if let Ok(index) = supported_assets.binary_search(&asset_type) { + supported_assets.remove(index); + } // Insert SupportedFeePaymentAssets::::put(supported_assets); diff --git a/pallets/asset-manager/src/migrations.rs b/pallets/asset-manager/src/migrations.rs index 7e11916305..0ede9254b5 100644 --- a/pallets/asset-manager/src/migrations.rs +++ b/pallets/asset-manager/src/migrations.rs @@ -474,6 +474,8 @@ impl OnRuntimeUpgrade for PopulateSupportedFeePaymentAssets { supported_assets.push(asset_type); } + supported_assets.sort(); + // Push value SupportedFeePaymentAssets::::put(&supported_assets); diff --git a/pallets/asset-manager/src/tests.rs b/pallets/asset-manager/src/tests.rs index f99fa3414c..1666104027 100644 --- a/pallets/asset-manager/src/tests.rs +++ b/pallets/asset-manager/src/tests.rs @@ -371,11 +371,6 @@ fn test_asset_id_non_existent_error() { ), Error::::AssetDoesNotExist ); - - assert_noop!( - AssetManager::remove_supported_asset(Origin::root(), MockAssetType::MockAsset(1), 0), - Error::::AssetDoesNotExist - ); }); } From cf879dcf50d7dd31b253520df328304308334d7a Mon Sep 17 00:00:00 2001 From: gorka Date: Tue, 22 Feb 2022 21:43:59 +0100 Subject: [PATCH 65/66] Updated weights with benchmarks --- pallets/asset-manager/src/weights.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pallets/asset-manager/src/weights.rs b/pallets/asset-manager/src/weights.rs index a7f9dfaf99..f4df845eb5 100644 --- a/pallets/asset-manager/src/weights.rs +++ b/pallets/asset-manager/src/weights.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for pallet_asset_manager //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-02-18, STEPS: `32`, REPEAT: 64, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2022-02-22, STEPS: `32`, REPEAT: 64, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: @@ -67,20 +67,20 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().writes(6 as Weight)) } fn set_asset_units_per_second(x: u32) -> Weight { - (30_194_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_138_000 as Weight).saturating_mul(x as Weight)) + (31_655_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_258_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(6 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } fn change_existing_asset_type(x: u32) -> Weight { - (40_251_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_198_000 as Weight).saturating_mul(x as Weight)) + (39_476_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_338_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(7 as Weight)) .saturating_add(T::DbWeight::get().writes(8 as Weight)) } fn remove_supported_asset(x: u32) -> Weight { - (24_328_000 as Weight) // Standard Error: 3_000 - .saturating_add((1_170_000 as Weight).saturating_mul(x as Weight)) + (24_269_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_148_000 as Weight).saturating_mul(x as Weight)) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(4 as Weight)) } @@ -94,20 +94,20 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().writes(6 as Weight)) } fn set_asset_units_per_second(x: u32) -> Weight { - (30_194_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_138_000 as Weight).saturating_mul(x as Weight)) + (31_655_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_258_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(6 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } fn change_existing_asset_type(x: u32) -> Weight { - (40_251_000 as Weight) // Standard Error: 4_000 - .saturating_add((1_198_000 as Weight).saturating_mul(x as Weight)) + (39_476_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_338_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(7 as Weight)) .saturating_add(RocksDbWeight::get().writes(8 as Weight)) } fn remove_supported_asset(x: u32) -> Weight { - (24_328_000 as Weight) // Standard Error: 3_000 - .saturating_add((1_170_000 as Weight).saturating_mul(x as Weight)) + (24_269_000 as Weight) // Standard Error: 4_000 + .saturating_add((1_148_000 as Weight).saturating_mul(x as Weight)) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(4 as Weight)) } From 41f1739763017f078de57d0d3c0494b6f8baa14b Mon Sep 17 00:00:00 2001 From: gorka Date: Wed, 23 Feb 2022 09:48:23 +0100 Subject: [PATCH 66/66] Fix tests --- runtime/moonriver/tests/xcm_tests.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/runtime/moonriver/tests/xcm_tests.rs b/runtime/moonriver/tests/xcm_tests.rs index f5961c2950..c56883cdfb 100644 --- a/runtime/moonriver/tests/xcm_tests.rs +++ b/runtime/moonriver/tests/xcm_tests.rs @@ -557,7 +557,8 @@ fn send_para_a_asset_to_para_b_and_back_to_para_a_with_new_reanchoring() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); }); @@ -729,7 +730,8 @@ fn send_para_a_asset_to_para_b_with_trader() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 2500000000000u128 + 2500000000000u128, + 0 )); }); @@ -803,7 +805,8 @@ fn send_para_a_asset_to_para_b_with_trader_and_fee() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 12500000u128 + 12500000u128, + 0 )); }); @@ -1365,7 +1368,8 @@ fn test_automatic_versioning_on_runtime_upgrade_with_para_b() { assert_ok!(AssetManager::set_asset_units_per_second( parachain::Origin::root(), source_location, - 0u128 + 0u128, + 0 )); });