From af9083f53b57ddec38b8dd75c6181910c02e9074 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Mon, 16 Mar 2020 23:19:53 +0100 Subject: [PATCH] Refactor away from opaque hashes (#5226) * System.BlockHash * Fix hash * Introduce K/V iteration in all _concat maps Also move across: - System.Account (blake2_128_concat) - Balances.Locks (twox_64_concat) - ElectionsPhragmen.VotesOf (twox_64_concat) - ElectionsPhragmen.StakeOf (twox_64_concat) - Identity.IdentityOf (twox_64_concat) - Identity.SubsOf (twox_64_concat) - Society.Payouts (twox_64_concat) - Session.NextKeys (twox_64_concat) - Identity.SuperOf (blake2_128_concat) - Session.KeyOwner (blake2_128_concat) - Society.SuspendedCandidates (twox_64_concat) - Society.SuspendedMembers (twox_64_concat) - Society.Vouching (twox_64_concat) - Society.Strikes (twox_64_concat) - System.EventTopics - Balances.Account * Build fixes * Ensure migration happens in correct order * Staking.* * Vesting.* Offences.* * Democracy.* * Babe.* Collective.* * Grandpa.* * Assets.* Benchmark.* Contracts.* Elections.* Asset.* Nicks.* Also introduce real account list * ImOnline.* * Treasury.* * Recovery.* * Final bits. * Docs * Fix one test * Fix test * All passing except the UI tests * Remove linked_map part 1 * Remove linked_map * Some iterator utils for double maps. * Remove old migrations * Introduce tombstone for LinkedMap type * Migration for genesis hash * Fix build * Fix hash * Rename Map is_linked -> unused, keeping backwards compat (#5256) * Update frame/balances/src/lib.rs Co-Authored-By: Shawn Tabrizi * Update frame/elections/src/lib.rs Co-Authored-By: Shawn Tabrizi * Remove old migration code. * Update frame/system/src/lib.rs Co-Authored-By: Shawn Tabrizi * Update bin/node/runtime/src/lib.rs Co-Authored-By: Shawn Tabrizi * Fix hash * fix session migration * Fix watning Co-authored-by: Jaco Greeff Co-authored-by: Shawn Tabrizi Co-authored-by: Robert Habermeier --- .../pallets/template/src/mock.rs | 2 +- .../bin/node-template/runtime/src/lib.rs | 2 +- substrate/bin/node/runtime/src/lib.rs | 1 + substrate/frame/assets/src/lib.rs | 6 +- substrate/frame/aura/src/mock.rs | 2 +- .../frame/authority-discovery/src/lib.rs | 2 +- substrate/frame/authorship/src/lib.rs | 2 +- substrate/frame/babe/src/lib.rs | 8 +- substrate/frame/babe/src/mock.rs | 2 +- substrate/frame/balances/src/lib.rs | 14 +- .../frame/balances/src/tests_composite.rs | 2 +- substrate/frame/balances/src/tests_local.rs | 2 +- substrate/frame/benchmark/src/lib.rs | 6 +- substrate/frame/benchmarking/src/tests.rs | 2 +- substrate/frame/collective/src/lib.rs | 21 +- substrate/frame/contracts/src/lib.rs | 11 +- substrate/frame/contracts/src/migration.rs | 62 --- substrate/frame/contracts/src/tests.rs | 2 +- substrate/frame/democracy/src/lib.rs | 59 ++- substrate/frame/elections-phragmen/src/lib.rs | 24 +- substrate/frame/elections/src/lib.rs | 10 +- substrate/frame/elections/src/mock.rs | 2 +- substrate/frame/evm/src/lib.rs | 6 +- .../example-offchain-worker/src/tests.rs | 2 +- substrate/frame/example/src/lib.rs | 6 +- substrate/frame/executive/src/lib.rs | 11 +- substrate/frame/finality-tracker/src/lib.rs | 8 +- .../frame/finality-tracker/src/migration.rs | 54 -- substrate/frame/generic-asset/src/lib.rs | 12 +- substrate/frame/generic-asset/src/mock.rs | 2 +- substrate/frame/grandpa/src/lib.rs | 18 +- substrate/frame/grandpa/src/mock.rs | 2 +- substrate/frame/identity/src/lib.rs | 26 +- substrate/frame/identity/src/migration.rs | 52 -- substrate/frame/im-online/src/lib.rs | 36 +- substrate/frame/im-online/src/mock.rs | 2 +- substrate/frame/indices/src/mock.rs | 2 +- substrate/frame/membership/src/lib.rs | 2 +- substrate/frame/metadata/src/lib.rs | 4 +- substrate/frame/nicks/src/lib.rs | 4 +- substrate/frame/offences/src/lib.rs | 15 +- substrate/frame/offences/src/mock.rs | 2 +- .../randomness-collective-flip/src/lib.rs | 2 +- substrate/frame/recovery/src/lib.rs | 12 +- substrate/frame/recovery/src/mock.rs | 2 +- substrate/frame/scored-pool/src/lib.rs | 2 +- substrate/frame/scored-pool/src/mock.rs | 2 +- substrate/frame/session/src/historical.rs | 18 +- substrate/frame/session/src/lib.rs | 39 +- substrate/frame/session/src/mock.rs | 2 +- substrate/frame/society/src/lib.rs | 21 +- substrate/frame/society/src/mock.rs | 2 +- substrate/frame/staking/src/lib.rs | 76 ++- .../frame/staking/src/migration/deprecated.rs | 73 --- substrate/frame/staking/src/migration/mod.rs | 119 ----- .../test_upgrade_from_master_dataset.rs | 59 --- .../frame/staking/src/migration/tests.rs | 220 -------- substrate/frame/staking/src/mock.rs | 10 +- substrate/frame/staking/src/tests.rs | 8 +- substrate/frame/support/Cargo.toml | 2 +- substrate/frame/support/procedural/src/lib.rs | 76 ++- .../src/storage/genesis_config/builder_def.rs | 2 +- .../genesis_config/genesis_config_def.rs | 2 +- .../support/procedural/src/storage/getters.rs | 2 +- .../procedural/src/storage/metadata.rs | 15 +- .../support/procedural/src/storage/mod.rs | 14 +- .../support/procedural/src/storage/parse.rs | 60 +-- .../procedural/src/storage/storage_struct.rs | 41 -- substrate/frame/support/src/hash.rs | 31 ++ substrate/frame/support/src/lib.rs | 106 ++-- .../src/storage/generator/double_map.rs | 225 ++++++-- .../src/storage/generator/linked_map.rs | 499 ------------------ .../support/src/storage/generator/map.rs | 147 +++++- .../support/src/storage/generator/mod.rs | 45 +- substrate/frame/support/src/storage/mod.rs | 133 +++-- substrate/frame/support/src/traits.rs | 8 +- .../frame/support/test/tests/decl_storage.rs | 152 ++---- .../frame/support/test/tests/final_keys.rs | 120 ++--- .../frame/support/test/tests/genesisconfig.rs | 2 +- .../frame/support/test/tests/instance.rs | 67 +-- .../frame/support/test/tests/issue2219.rs | 6 +- substrate/frame/system/benches/bench.rs | 2 +- substrate/frame/system/src/accounts.scale | Bin 0 -> 181794 bytes substrate/frame/system/src/lib.rs | 47 +- substrate/frame/system/src/migration.rs | 37 ++ substrate/frame/timestamp/src/lib.rs | 2 +- .../frame/transaction-payment/src/lib.rs | 8 +- .../transaction-payment/src/migration.rs | 38 -- substrate/frame/treasury/src/lib.rs | 25 +- substrate/frame/utility/src/lib.rs | 2 +- substrate/frame/vesting/src/lib.rs | 16 +- substrate/test-utils/runtime/src/lib.rs | 2 +- substrate/test-utils/runtime/src/system.rs | 2 +- substrate/utils/frame/rpc/support/src/lib.rs | 18 +- 94 files changed, 1111 insertions(+), 2020 deletions(-) delete mode 100644 substrate/frame/contracts/src/migration.rs delete mode 100644 substrate/frame/finality-tracker/src/migration.rs delete mode 100644 substrate/frame/identity/src/migration.rs delete mode 100644 substrate/frame/staking/src/migration/deprecated.rs delete mode 100644 substrate/frame/staking/src/migration/mod.rs delete mode 100644 substrate/frame/staking/src/migration/test_upgrade_from_master_dataset.rs delete mode 100644 substrate/frame/staking/src/migration/tests.rs delete mode 100644 substrate/frame/support/src/storage/generator/linked_map.rs create mode 100644 substrate/frame/system/src/accounts.scale create mode 100644 substrate/frame/system/src/migration.rs delete mode 100644 substrate/frame/transaction-payment/src/migration.rs diff --git a/substrate/bin/node-template/pallets/template/src/mock.rs b/substrate/bin/node-template/pallets/template/src/mock.rs index 2ea81ffb45..3179b56b22 100644 --- a/substrate/bin/node-template/pallets/template/src/mock.rs +++ b/substrate/bin/node-template/pallets/template/src/mock.rs @@ -40,7 +40,7 @@ impl system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } impl Trait for Test { diff --git a/substrate/bin/node-template/runtime/src/lib.rs b/substrate/bin/node-template/runtime/src/lib.rs index 0414759a5a..707799eab4 100644 --- a/substrate/bin/node-template/runtime/src/lib.rs +++ b/substrate/bin/node-template/runtime/src/lib.rs @@ -162,7 +162,7 @@ impl system::Trait for Runtime { /// This type is being generated by `construct_runtime!`. type ModuleToIndex = ModuleToIndex; /// What to do if a new account is created. - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); /// What to do if an account is fully reaped from the system. type OnKilledAccount = (); /// The data to be stored in an account. diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 48b9037bf8..f15dbcbf5e 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -140,6 +140,7 @@ impl frame_system::Trait for Runtime { type Version = Version; type ModuleToIndex = ModuleToIndex; type AccountData = pallet_balances::AccountData; + type MigrateAccount = (Balances, Identity, Democracy, Elections, ImOnline, Recovery, Session, Society, Staking, Vesting); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/assets/src/lib.rs b/substrate/frame/assets/src/lib.rs index 042ff89913..af74f90461 100644 --- a/substrate/frame/assets/src/lib.rs +++ b/substrate/frame/assets/src/lib.rs @@ -228,11 +228,11 @@ decl_error! { decl_storage! { trait Store for Module as Assets { /// The number of units of assets held by any given account. - Balances: map hasher(blake2_256) (T::AssetId, T::AccountId) => T::Balance; + Balances: map hasher(blake2_128_concat) (T::AssetId, T::AccountId) => T::Balance; /// The next asset identifier up for grabs. NextAssetId get(fn next_asset_id): T::AssetId; /// The total unit supply of an asset. - TotalSupply: map hasher(blake2_256) T::AssetId => T::Balance; + TotalSupply: map hasher(twox_64_concat) T::AssetId => T::Balance; } } @@ -294,7 +294,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } impl Trait for Test { diff --git a/substrate/frame/aura/src/mock.rs b/substrate/frame/aura/src/mock.rs index 05a161ee49..b191e1d05d 100644 --- a/substrate/frame/aura/src/mock.rs +++ b/substrate/frame/aura/src/mock.rs @@ -62,7 +62,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/authority-discovery/src/lib.rs b/substrate/frame/authority-discovery/src/lib.rs index 8ee4931e48..0479e710c5 100644 --- a/substrate/frame/authority-discovery/src/lib.rs +++ b/substrate/frame/authority-discovery/src/lib.rs @@ -158,7 +158,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/authorship/src/lib.rs b/substrate/frame/authorship/src/lib.rs index d3c1bf752a..1869d408ca 100644 --- a/substrate/frame/authorship/src/lib.rs +++ b/substrate/frame/authorship/src/lib.rs @@ -432,7 +432,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/babe/src/lib.rs b/substrate/frame/babe/src/lib.rs index 4dc9304fa8..8013e0cd45 100644 --- a/substrate/frame/babe/src/lib.rs +++ b/substrate/frame/babe/src/lib.rs @@ -146,7 +146,7 @@ decl_storage! { /// We reset all segments and return to `0` at the beginning of every /// epoch. SegmentIndex build(|_| 0): u32; - UnderConstruction: map hasher(blake2_256) u32 => Vec<[u8; 32 /* VRF_OUTPUT_LENGTH */]>; + UnderConstruction: map hasher(twox_64_concat) u32 => Vec<[u8; 32 /* VRF_OUTPUT_LENGTH */]>; /// Temporary value (cleared at block finalization) which is `Some` /// if per-block initialization has already been called for current block. @@ -188,6 +188,12 @@ decl_module! { Self::deposit_vrf_output(&vrf_output); } } + + fn on_runtime_upgrade() { + for i in 0..=SegmentIndex::get() { + UnderConstruction::migrate_key_from_blake(i); + } + } } } diff --git a/substrate/frame/babe/src/mock.rs b/substrate/frame/babe/src/mock.rs index 2ec083728e..63943593b8 100644 --- a/substrate/frame/babe/src/mock.rs +++ b/substrate/frame/babe/src/mock.rs @@ -65,7 +65,7 @@ impl frame_system::Trait for Test { type MaximumBlockLength = MaximumBlockLength; type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/balances/src/lib.rs b/substrate/frame/balances/src/lib.rs index 6f4be24515..6e707caaa1 100644 --- a/substrate/frame/balances/src/lib.rs +++ b/substrate/frame/balances/src/lib.rs @@ -167,7 +167,7 @@ use frame_support::{ Currency, OnKilledAccount, OnUnbalanced, TryDrop, StoredMap, WithdrawReason, WithdrawReasons, LockIdentifier, LockableCurrency, ExistenceRequirement, Imbalance, SignedImbalance, ReservableCurrency, Get, ExistenceRequirement::KeepAlive, - ExistenceRequirement::AllowDeath, IsDeadAccount, BalanceStatus as Status + ExistenceRequirement::AllowDeath, IsDeadAccount, BalanceStatus as Status, MigrateAccount, } }; use sp_runtime::{ @@ -372,11 +372,11 @@ decl_storage! { /// is ever zero, then the entry *MUST* be removed. /// /// NOTE: This is only used in the case that this module is used to store balances. - pub Account: map hasher(blake2_256) T::AccountId => AccountData; + pub Account: map hasher(blake2_128_concat) T::AccountId => AccountData; /// Any liquidity locks on some account balances. /// NOTE: Should only be accessed when setting, changing and freeing a lock. - pub Locks get(fn locks): map hasher(blake2_256) T::AccountId => Vec>; + pub Locks get(fn locks): map hasher(blake2_128_concat) T::AccountId => Vec>; /// Storage version of the pallet. /// @@ -531,6 +531,12 @@ decl_module! { } } +impl, I: Instance> MigrateAccount for Module { + fn migrate_account(account: &T::AccountId) { + Locks::::migrate_key_from_blake(account); + } +} + impl, I: Instance> Module { // PRIVATE MUTABLES @@ -850,7 +856,7 @@ impl, I: Instance> frame_system::Trait for ElevatedTrait { type AvailableBlockRatio = T::AvailableBlockRatio; type Version = T::Version; type ModuleToIndex = T::ModuleToIndex; - type OnNewAccount = T::OnNewAccount; + type MigrateAccount = (); type OnNewAccount = T::OnNewAccount; type OnKilledAccount = T::OnKilledAccount; type AccountData = T::AccountData; } diff --git a/substrate/frame/balances/src/tests_composite.rs b/substrate/frame/balances/src/tests_composite.rs index 3a5c2178f8..8bf31ec36c 100644 --- a/substrate/frame/balances/src/tests_composite.rs +++ b/substrate/frame/balances/src/tests_composite.rs @@ -66,7 +66,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = super::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } parameter_types! { diff --git a/substrate/frame/balances/src/tests_local.rs b/substrate/frame/balances/src/tests_local.rs index 861c197212..c6beec0782 100644 --- a/substrate/frame/balances/src/tests_local.rs +++ b/substrate/frame/balances/src/tests_local.rs @@ -66,7 +66,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = super::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = Module; } parameter_types! { diff --git a/substrate/frame/benchmark/src/lib.rs b/substrate/frame/benchmark/src/lib.rs index ef7731eea4..a519e98930 100644 --- a/substrate/frame/benchmark/src/lib.rs +++ b/substrate/frame/benchmark/src/lib.rs @@ -41,10 +41,10 @@ pub trait Trait: system::Trait { decl_storage! { trait Store for Module as Benchmark { MyMemberList: Vec; - MyMemberMap: map hasher(blake2_256) T::AccountId => bool; + MyMemberMap: map hasher(blake2_128_concat) T::AccountId => bool; MyValue: u32; - MyMap: map hasher(blake2_256) u32 => u32; - MyDoubleMap: double_map hasher(blake2_256) u32, hasher(blake2_256) u32 => u32; + MyMap: map hasher(twox_64_concat) u32 => u32; + MyDoubleMap: double_map hasher(twox_64_concat) u32, hasher(identity) u32 => u32; } } diff --git a/substrate/frame/benchmarking/src/tests.rs b/substrate/frame/benchmarking/src/tests.rs index 4327476c4a..6e837ec241 100644 --- a/substrate/frame/benchmarking/src/tests.rs +++ b/substrate/frame/benchmarking/src/tests.rs @@ -71,7 +71,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/collective/src/lib.rs b/substrate/frame/collective/src/lib.rs index b5620e3406..30b1b19974 100644 --- a/substrate/frame/collective/src/lib.rs +++ b/substrate/frame/collective/src/lib.rs @@ -106,10 +106,10 @@ decl_storage! { pub Proposals get(fn proposals): Vec; /// Actual proposal for a given hash, if it's current. pub ProposalOf get(fn proposal_of): - map hasher(blake2_256) T::Hash => Option<>::Proposal>; + map hasher(identity) T::Hash => Option<>::Proposal>; /// Votes on a given proposal, if it is ongoing. pub Voting get(fn voting): - map hasher(blake2_256) T::Hash => Option>; + map hasher(identity) T::Hash => Option>; /// Proposals so far. pub ProposalCount get(fn proposal_count): u32; /// The current members of the collective. This is stored sorted (just by value). @@ -168,6 +168,17 @@ decl_error! { } } +mod migration { + use super::*; + + pub fn migrate, I: Instance>() { + for p in Proposals::::get().into_iter() { + ProposalOf::::migrate_key_from_blake(&p); + Voting::::migrate_key_from_blake(&p); + } + } +} + // Note: this module is not benchmarked. The weights are obtained based on the similarity of the // executed logic with other democracy function. Note that councillor operations are assigned to the // operational class. @@ -177,6 +188,10 @@ decl_module! { fn deposit_event() = default; + fn on_runtime_upgrade() { + migration::migrate::(); + } + /// Set the collective's membership. /// /// - `new_members`: The new member list. Be nice to the chain and @@ -535,7 +550,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } impl Trait for Test { diff --git a/substrate/frame/contracts/src/lib.rs b/substrate/frame/contracts/src/lib.rs index e1022859a1..eeaa35a53d 100644 --- a/substrate/frame/contracts/src/lib.rs +++ b/substrate/frame/contracts/src/lib.rs @@ -98,7 +98,6 @@ mod rent; #[cfg(test)] mod tests; -mod migration; use crate::exec::ExecutionContext; use crate::account_db::{AccountDb, DirectAccountDb}; @@ -667,10 +666,6 @@ decl_module! { fn on_finalize() { GasSpent::kill(); } - - fn on_runtime_upgrade() { - migration::on_runtime_upgrade::() - } } } @@ -934,13 +929,13 @@ decl_storage! { /// Current cost schedule for contracts. CurrentSchedule get(fn current_schedule) config(): Schedule = Schedule::default(); /// A mapping from an original code hash to the original code, untouched by instrumentation. - pub PristineCode: map hasher(blake2_256) CodeHash => Option>; + pub PristineCode: map hasher(identity) CodeHash => Option>; /// A mapping between an original code hash and instrumented wasm code, ready for execution. - pub CodeStorage: map hasher(blake2_256) CodeHash => Option; + pub CodeStorage: map hasher(identity) CodeHash => Option; /// The subtrie counter. pub AccountCounter: u64 = 0; /// The code associated with a given account. - pub ContractInfoOf: map hasher(blake2_256) T::AccountId => Option>; + pub ContractInfoOf: map hasher(twox_64_concat) T::AccountId => Option>; /// The price of one unit of gas. GasPrice get(fn gas_price) config(): BalanceOf = 1.into(); } diff --git a/substrate/frame/contracts/src/migration.rs b/substrate/frame/contracts/src/migration.rs deleted file mode 100644 index 83d3771c83..0000000000 --- a/substrate/frame/contracts/src/migration.rs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate 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. - -// Substrate 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 Substrate. If not, see . - -//! Migration code to update storage. - -use super::*; -use frame_support::storage::migration::{put_storage_value, take_storage_value, StorageIterator}; - -pub fn on_runtime_upgrade() { - change_name_contract_to_contracts::() -} - -// Change the storage name used by this pallet from `Contract` to `Contracts`. -// -// Since the format of the storage items themselves have not changed, we do not -// need to keep track of a storage version. If the runtime does not need to be -// upgraded, nothing here will happen anyway. - -fn change_name_contract_to_contracts() { - sp_runtime::print("Migrating Contracts."); - - if let Some(gas_spent) = take_storage_value::(b"Contract", b"GasSpent", &[]) { - put_storage_value(b"Contracts", b"GasSpent", &[], gas_spent); - } - - if let Some(current_schedule) = take_storage_value::(b"Contract", b"CurrentSchedule", &[]) { - put_storage_value(b"Contracts", b"CurrentSchedule", &[], current_schedule); - } - - for (hash, pristine_code) in StorageIterator::>::new(b"Contract", b"PristineCode").drain() { - put_storage_value(b"Contracts", b"PristineCode", &hash, pristine_code); - } - - for (hash, code_storage) in StorageIterator::::new(b"Contract", b"CodeStorage").drain() { - put_storage_value(b"Contracts", b"CodeStorage", &hash, code_storage); - } - - if let Some(current_schedule) = take_storage_value::(b"Contract", b"AccountCounter", &[]) { - put_storage_value(b"Contracts", b"AccountCounter", &[], current_schedule); - } - - for (hash, contract_info_of) in StorageIterator::>::new(b"Contract", b"ContractInfoOf").drain() { - put_storage_value(b"Contracts", b"ContractInfoOf", &hash, contract_info_of); - } - - if let Some(get_price) = take_storage_value::>(b"Contract", b"GetPrice", &[]) { - put_storage_value(b"Contracts", b"GetPrice", &[], get_price); - } -} diff --git a/substrate/frame/contracts/src/tests.rs b/substrate/frame/contracts/src/tests.rs index 1b85e32e7e..f6b9e0e57e 100644 --- a/substrate/frame/contracts/src/tests.rs +++ b/substrate/frame/contracts/src/tests.rs @@ -116,7 +116,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = Contracts; } impl pallet_balances::Trait for Test { diff --git a/substrate/frame/democracy/src/lib.rs b/substrate/frame/democracy/src/lib.rs index 2418bc7c3d..cbc766499f 100644 --- a/substrate/frame/democracy/src/lib.rs +++ b/substrate/frame/democracy/src/lib.rs @@ -159,7 +159,7 @@ use sp_runtime::{ }; use codec::{Ref, Encode, Decode, Input, Output}; use frame_support::{ - decl_module, decl_storage, decl_event, decl_error, ensure, Parameter, + decl_module, decl_storage, decl_event, decl_error, ensure, Parameter, IterableStorageMap, weights::SimpleDispatchInfo, traits::{ Currency, ReservableCurrency, LockableCurrency, WithdrawReason, LockIdentifier, Get, @@ -170,6 +170,7 @@ use frame_system::{self as system, ensure_signed, ensure_root}; mod vote_threshold; pub use vote_threshold::{Approved, VoteThreshold}; +use frame_support::traits::MigrateAccount; const DEMOCRACY_ID: LockIdentifier = *b"democrac"; @@ -420,11 +421,11 @@ decl_storage! { /// Map of hashes to the proposal preimage, along with who registered it and their deposit. /// The block number is the block at which it was deposited. pub Preimages: - map hasher(blake2_256) T::Hash + map hasher(identity) T::Hash => Option<(Vec, T::AccountId, BalanceOf, T::BlockNumber)>; /// Those who have locked a deposit. pub DepositOf get(fn deposit_of): - map hasher(blake2_256) PropIndex => Option<(BalanceOf, Vec)>; + map hasher(twox_64_concat) PropIndex => Option<(BalanceOf, Vec)>; /// The next free referendum index, aka the number of referenda started so far. pub ReferendumCount get(fn referendum_count) build(|_| 0 as ReferendumIndex): ReferendumIndex; @@ -433,32 +434,32 @@ decl_storage! { pub LowestUnbaked get(fn lowest_unbaked) build(|_| 0 as ReferendumIndex): ReferendumIndex; /// Information concerning any given referendum. pub ReferendumInfoOf get(fn referendum_info): - map hasher(blake2_256) ReferendumIndex + map hasher(twox_64_concat) ReferendumIndex => Option>; /// Queue of successful referenda to be dispatched. Stored ordered by block number. pub DispatchQueue get(fn dispatch_queue): Vec<(T::BlockNumber, T::Hash, ReferendumIndex)>; /// Get the voters for the current proposal. pub VotersFor get(fn voters_for): - map hasher(blake2_256) ReferendumIndex => Vec; + map hasher(twox_64_concat) ReferendumIndex => Vec; /// Get the vote in a given referendum of a particular voter. The result is meaningful only /// if `voters_for` includes the voter when called with the referendum (you'll get the /// default `Vote` value otherwise). If you don't want to check `voters_for`, then you can /// also check for simple existence with `VoteOf::contains_key` first. - pub VoteOf get(fn vote_of): map hasher(blake2_256) (ReferendumIndex, T::AccountId) => Vote; + pub VoteOf get(fn vote_of): map hasher(twox_64_concat) (ReferendumIndex, T::AccountId) => Vote; /// Who is able to vote for whom. Value is the fund-holding account, key is the /// vote-transaction-sending account. - pub Proxy get(fn proxy): map hasher(blake2_256) T::AccountId => Option>; + pub Proxy get(fn proxy): map hasher(twox_64_concat) T::AccountId => Option>; /// Get the account (and lock periods) to which another account is delegating vote. pub Delegations get(fn delegations): - linked_map hasher(blake2_256) T::AccountId => (T::AccountId, Conviction); + map hasher(twox_64_concat) T::AccountId => (T::AccountId, Conviction); /// Accounts for which there are locks in action which may be removed at some point in the /// future. The value is the block number at which the lock expires and may be removed. - pub Locks get(locks): map hasher(blake2_256) T::AccountId => Option; + pub Locks get(locks): map hasher(twox_64_concat) T::AccountId => Option; /// True if the last referendum tabled was submitted externally. False if it was a public /// proposal. @@ -473,10 +474,10 @@ decl_storage! { /// A record of who vetoed what. Maps proposal hash to a possible existent block number /// (until when it may not be resubmitted) and who vetoed it. pub Blacklist get(fn blacklist): - map hasher(blake2_256) T::Hash => Option<(T::BlockNumber, Vec)>; + map hasher(identity) T::Hash => Option<(T::BlockNumber, Vec)>; /// Record of all proposals that have been subject to emergency cancellation. - pub Cancellations: map hasher(blake2_256) T::Hash => bool; + pub Cancellations: map hasher(identity) T::Hash => bool; } } @@ -583,9 +584,41 @@ decl_error! { } } +impl MigrateAccount for Module { + fn migrate_account(a: &T::AccountId) { + Proxy::::migrate_key_from_blake(a); + Locks::::migrate_key_from_blake(a); + Delegations::::migrate_key_from_blake(a); + for i in LowestUnbaked::get()..ReferendumCount::get() { + VoteOf::::migrate_key_from_blake((i, a)); + } + } +} + +mod migration { + use super::*; + pub fn migrate() { + Blacklist::::remove_all(); + Cancellations::::remove_all(); + for i in LowestUnbaked::get()..ReferendumCount::get() { + VotersFor::::migrate_key_from_blake(i); + ReferendumInfoOf::::migrate_key_from_blake(i); + } + for (p, h, _) in PublicProps::::get().into_iter() { + DepositOf::::migrate_key_from_blake(p); + Preimages::::migrate_key_from_blake(h); + } + } +} + decl_module! { pub struct Module for enum Call where origin: T::Origin { type Error = Error; + + fn on_runtime_upgrade() { + migration::migrate::(); + } + /// The minimum period of locking and the period between a proposal being approved and enacted. /// /// It should generally be a little more than the unstake period to ensure that @@ -1290,7 +1323,7 @@ impl Module { recursion_limit: u32, ) -> (BalanceOf, BalanceOf) { if recursion_limit == 0 { return (Zero::zero(), Zero::zero()); } - >::enumerate() + >::iter() .filter(|(delegator, (delegate, _))| *delegate == to && !>::contains_key(&(ref_index, delegator.clone())) ).fold( @@ -1606,7 +1639,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } parameter_types! { diff --git a/substrate/frame/elections-phragmen/src/lib.rs b/substrate/frame/elections-phragmen/src/lib.rs index 55b7b3f128..ac85b3047d 100644 --- a/substrate/frame/elections-phragmen/src/lib.rs +++ b/substrate/frame/elections-phragmen/src/lib.rs @@ -84,18 +84,18 @@ use sp_std::prelude::*; use sp_runtime::{ - print, DispatchResult, DispatchError, Perbill, - traits::{Zero, StaticLookup, Convert}, + print, DispatchResult, DispatchError, Perbill, traits::{Zero, StaticLookup, Convert}, }; use frame_support::{ decl_storage, decl_event, ensure, decl_module, decl_error, weights::SimpleDispatchInfo, - traits::{ + storage::{StorageMap, IterableStorageMap}, traits::{ Currency, Get, LockableCurrency, LockIdentifier, ReservableCurrency, WithdrawReasons, ChangeMembers, OnUnbalanced, WithdrawReason, Contains, BalanceStatus } }; use sp_phragmen::ExtendedBalance; use frame_system::{self as system, ensure_signed, ensure_root}; +use frame_support::traits::MigrateAccount; const MODULE_ID: LockIdentifier = *b"phrelect"; @@ -160,9 +160,9 @@ decl_storage! { pub ElectionRounds get(fn election_rounds): u32 = Zero::zero(); /// Votes of a particular voter, with the round index of the votes. - pub VotesOf get(fn votes_of): linked_map hasher(blake2_256) T::AccountId => Vec; + pub VotesOf get(fn votes_of): map hasher(twox_64_concat) T::AccountId => Vec; /// Locked stake of a voter. - pub StakeOf get(fn stake_of): map hasher(blake2_256) T::AccountId => BalanceOf; + pub StakeOf get(fn stake_of): map hasher(twox_64_concat) T::AccountId => BalanceOf; /// The present candidate list. Sorted based on account-id. A current member or a runner can /// never enter this vector and is always implicitly assumed to be a candidate. @@ -474,6 +474,14 @@ decl_event!( } ); +impl MigrateAccount for Module { + fn migrate_account(a: &T::AccountId) { + if StakeOf::::migrate_key_from_blake(a).is_some() { + VotesOf::::migrate_key_from_blake(a); + } + } +} + impl Module { /// Attempts to remove a member `who`. If a runner up exists, it is used as the replacement. /// Otherwise, `Ok(false)` is returned to signal the caller. @@ -637,7 +645,7 @@ impl Module { // previous runners_up are also always candidates for the next round. candidates.append(&mut Self::runners_up_ids()); - let voters_and_votes = >::enumerate() + let voters_and_votes = VotesOf::::iter() .map(|(v, i)| (v, i)) .collect::)>>(); let maybe_phragmen_result = sp_phragmen::elect::<_, _, _, T::CurrencyToVote, Perbill>( @@ -817,7 +825,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } @@ -1001,7 +1009,7 @@ mod tests { } fn all_voters() -> Vec { - >::enumerate().map(|(v, _)| v).collect::>() + >::iter().map(|(v, _)| v).collect::>() } fn balances(who: &u64) -> (u64, u64) { diff --git a/substrate/frame/elections/src/lib.rs b/substrate/frame/elections/src/lib.rs index d93d18fe23..6f89c4b938 100644 --- a/substrate/frame/elections/src/lib.rs +++ b/substrate/frame/elections/src/lib.rs @@ -236,16 +236,16 @@ decl_storage! { // [`all_approvals_of`]. Furthermore, each vector of scalars is chunked with the cap of // `APPROVAL_SET_SIZE`. pub ApprovalsOf get(fn approvals_of): - map hasher(blake2_256) (T::AccountId, SetIndex) => Vec; + map hasher(twox_64_concat) (T::AccountId, SetIndex) => Vec; /// The vote index and list slot that the candidate `who` was registered or `None` if they /// are not currently registered. pub RegisterInfoOf get(fn candidate_reg_info): - map hasher(blake2_256) T::AccountId => Option<(VoteIndex, u32)>; + map hasher(twox_64_concat) T::AccountId => Option<(VoteIndex, u32)>; /// Basic information about a voter. pub VoterInfoOf get(fn voter_info): - map hasher(blake2_256) T::AccountId => Option>>; + map hasher(twox_64_concat) T::AccountId => Option>>; /// The present voter list (chunked and capped at [`VOTER_SET_SIZE`]). - pub Voters get(fn voters): map hasher(blake2_256) SetIndex => Vec>; + pub Voters get(fn voters): map hasher(twox_64_concat) SetIndex => Vec>; /// the next free set to store a voter in. This will keep growing. pub NextVoterSet get(fn next_nonfull_voter_set): SetIndex = 0; /// Current number of Voters. @@ -266,7 +266,7 @@ decl_storage! { /// Who is able to vote for whom. Value is the fund-holding account, key is the /// vote-transaction-sending account. - pub Proxy get(fn proxy): map hasher(blake2_256) T::AccountId => Option; + pub Proxy get(fn proxy): map hasher(blake2_128_concat) T::AccountId => Option; } } diff --git a/substrate/frame/elections/src/mock.rs b/substrate/frame/elections/src/mock.rs index b82e73d512..2a5e5fefbd 100644 --- a/substrate/frame/elections/src/mock.rs +++ b/substrate/frame/elections/src/mock.rs @@ -55,7 +55,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/evm/src/lib.rs b/substrate/frame/evm/src/lib.rs index df0ddaafbb..5a9cb852fd 100644 --- a/substrate/frame/evm/src/lib.rs +++ b/substrate/frame/evm/src/lib.rs @@ -132,9 +132,9 @@ pub trait Trait: frame_system::Trait + pallet_timestamp::Trait { decl_storage! { trait Store for Module as EVM { - Accounts get(fn accounts) config(): map hasher(blake2_256) H160 => Account; - AccountCodes: map hasher(blake2_256) H160 => Vec; - AccountStorages: double_map hasher(blake2_256) H160, hasher(blake2_256) H256 => H256; + Accounts get(fn accounts) config(): map hasher(blake2_128_concat) H160 => Account; + AccountCodes: map hasher(blake2_128_concat) H160 => Vec; + AccountStorages: double_map hasher(blake2_128_concat) H160, hasher(blake2_128_concat) H256 => H256; } } diff --git a/substrate/frame/example-offchain-worker/src/tests.rs b/substrate/frame/example-offchain-worker/src/tests.rs index 9b6a567a17..5e086aa3a6 100644 --- a/substrate/frame/example-offchain-worker/src/tests.rs +++ b/substrate/frame/example-offchain-worker/src/tests.rs @@ -66,7 +66,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/example/src/lib.rs b/substrate/frame/example/src/lib.rs index e0d89fc7f3..62e46e9cb2 100644 --- a/substrate/frame/example/src/lib.rs +++ b/substrate/frame/example/src/lib.rs @@ -345,7 +345,7 @@ decl_storage! { // - `Foo::put(1); Foo::get()` returns `1`; // - `Foo::kill(); Foo::get()` returns `0` (u32::default()). // e.g. Foo: u32; - // e.g. pub Bar get(fn bar): map hasher(blake2_256) T::AccountId => Vec<(T::Balance, u64)>; + // e.g. pub Bar get(fn bar): map hasher(blake2_128_concat) T::AccountId => Vec<(T::Balance, u64)>; // // For basic value items, you'll get a type which implements // `frame_support::StorageValue`. For map items, you'll get a type which @@ -357,7 +357,7 @@ decl_storage! { Dummy get(fn dummy) config(): Option; // A map that has enumerable entries. - Bar get(fn bar) config(): linked_map hasher(blake2_256) T::AccountId => T::Balance; + Bar get(fn bar) config(): map hasher(blake2_128_concat) T::AccountId => T::Balance; // this one uses the default, we'll demonstrate the usage of 'mutate' API. Foo get(fn foo) config(): T::Balance; @@ -731,7 +731,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } parameter_types! { diff --git a/substrate/frame/executive/src/lib.rs b/substrate/frame/executive/src/lib.rs index e81b883f00..8fbcb3bc60 100644 --- a/substrate/frame/executive/src/lib.rs +++ b/substrate/frame/executive/src/lib.rs @@ -191,6 +191,7 @@ where digest, frame_system::InitKind::Full, ); + as OnInitialize>::on_initialize(*block_number); >::on_initialize(*block_number); >::register_extra_weight_unchecked( >::on_initialize(*block_number) @@ -249,11 +250,11 @@ where /// Execute given extrinsics and take care of post-extrinsics book-keeping. fn execute_extrinsics_with_book_keeping(extrinsics: Vec, block_number: NumberFor) { - extrinsics.into_iter().for_each(Self::apply_extrinsic_no_note); // post-extrinsics book-keeping >::note_finished_extrinsics(); + as OnFinalize>::on_finalize(block_number); >::on_finalize(block_number); } @@ -261,7 +262,9 @@ where /// except state-root. pub fn finalize_block() -> System::Header { >::note_finished_extrinsics(); - >::on_finalize(>::block_number()); + let block_number = >::block_number(); + as OnFinalize>::on_finalize(block_number); + >::on_finalize(block_number); // set up extrinsics >::derive_extrinsics(); @@ -478,7 +481,7 @@ mod tests { type Version = RuntimeVersion; type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } parameter_types! { @@ -595,7 +598,7 @@ mod tests { header: Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("e97d724f480f6e3215bd5c24b9ba51250e2514ac1c99e563fd77bfb9d6100b1c").into(), + state_root: hex!("489ae9b57a19bb4733a264dc64bbcae9b140a904657a681ed3bb5fbbe8cf412b").into(), extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), digest: Digest { logs: vec![], }, }, diff --git a/substrate/frame/finality-tracker/src/lib.rs b/substrate/frame/finality-tracker/src/lib.rs index 3b6de38de8..953861dede 100644 --- a/substrate/frame/finality-tracker/src/lib.rs +++ b/substrate/frame/finality-tracker/src/lib.rs @@ -26,8 +26,6 @@ use frame_support::traits::Get; use frame_system::{ensure_none, Trait as SystemTrait}; use sp_finality_tracker::{INHERENT_IDENTIFIER, FinalizedInherentData}; -mod migration; - pub const DEFAULT_WINDOW_SIZE: u32 = 101; pub const DEFAULT_REPORT_LATENCY: u32 = 1000; @@ -91,10 +89,6 @@ decl_module! { fn on_finalize() { Self::update_hint(::Update::take()) } - - fn on_runtime_upgrade() { - migration::on_runtime_upgrade::() - } } } @@ -268,7 +262,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } parameter_types! { diff --git a/substrate/frame/finality-tracker/src/migration.rs b/substrate/frame/finality-tracker/src/migration.rs deleted file mode 100644 index 1eff123db3..0000000000 --- a/substrate/frame/finality-tracker/src/migration.rs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate 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. - -// Substrate 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 Substrate. If not, see . - -// Migration code to update storage. - -use super::*; -use frame_support::storage::migration::{put_storage_value, take_storage_value}; - -pub fn on_runtime_upgrade() { - change_name_timestamp_to_finality_tracker::() -} - -// Change the storage name used by this pallet from `Timestamp` to `FinalityTracker`. -// -// Since the format of the storage items themselves have not changed, we do not -// need to keep track of a storage version. If the runtime does not need to be -// upgraded, nothing here will happen anyway. - -fn change_name_timestamp_to_finality_tracker() { - sp_runtime::print("Migrating Finality Tracker."); - - if let Some(recent_hints) = take_storage_value::>(b"Timestamp", b"RecentHints", &[]) { - put_storage_value(b"FinalityTracker", b"RecentHints", &[], recent_hints); - } - - if let Some(ordered_hints) = take_storage_value::>(b"Timestamp", b"OrderedHints", &[]) { - put_storage_value(b"FinalityTracker", b"OrderedHints", &[], ordered_hints); - } - - if let Some(median) = take_storage_value::(b"Timestamp", b"Median", &[]) { - put_storage_value(b"FinalityTracker", b"Median", &[], median); - } - - if let Some(update) = take_storage_value::(b"Timestamp", b"Update", &[]) { - put_storage_value(b"FinalityTracker", b"Update", &[], update); - } - - if let Some(initialized) = take_storage_value::(b"Timestamp", b"Initialized", &[]) { - put_storage_value(b"FinalityTracker", b"Initialized", &[], initialized); - } -} diff --git a/substrate/frame/generic-asset/src/lib.rs b/substrate/frame/generic-asset/src/lib.rs index f1713dd586..29dbe3e781 100644 --- a/substrate/frame/generic-asset/src/lib.rs +++ b/substrate/frame/generic-asset/src/lib.rs @@ -439,26 +439,26 @@ decl_storage! { pub TotalIssuance get(fn total_issuance) build(|config: &GenesisConfig| { let issuance = config.initial_balance * (config.endowed_accounts.len() as u32).into(); config.assets.iter().map(|id| (id.clone(), issuance)).collect::>() - }): map hasher(blake2_256) T::AssetId => T::Balance; + }): map hasher(twox_64_concat) T::AssetId => T::Balance; /// The free balance of a given asset under an account. pub FreeBalance: - double_map hasher(blake2_256) T::AssetId, hasher(twox_128) T::AccountId => T::Balance; + double_map hasher(twox_64_concat) T::AssetId, hasher(blake2_128_concat) T::AccountId => T::Balance; /// The reserved balance of a given asset under an account. pub ReservedBalance: - double_map hasher(blake2_256) T::AssetId, hasher(twox_128) T::AccountId => T::Balance; + double_map hasher(twox_64_concat) T::AssetId, hasher(blake2_128_concat) T::AccountId => T::Balance; /// Next available ID for user-created asset. pub NextAssetId get(fn next_asset_id) config(): T::AssetId; /// Permission options for a given asset. pub Permissions get(fn get_permission): - map hasher(blake2_256) T::AssetId => PermissionVersions; + map hasher(twox_64_concat) T::AssetId => PermissionVersions; /// Any liquidity locks on some account balances. pub Locks get(fn locks): - map hasher(blake2_256) T::AccountId => Vec>; + map hasher(blake2_128_concat) T::AccountId => Vec>; /// The identity of the asset which is the one that is designated for the chain's staking system. pub StakingAssetId get(fn staking_asset_id) config(): T::AssetId; @@ -1123,7 +1123,7 @@ impl frame_system::Trait for ElevatedTrait { type Version = T::Version; type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } impl Trait for ElevatedTrait { diff --git a/substrate/frame/generic-asset/src/mock.rs b/substrate/frame/generic-asset/src/mock.rs index 8db140d90c..8daca2da38 100644 --- a/substrate/frame/generic-asset/src/mock.rs +++ b/substrate/frame/generic-asset/src/mock.rs @@ -63,7 +63,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/grandpa/src/lib.rs b/substrate/frame/grandpa/src/lib.rs index 3210627f91..ab8c384dfb 100644 --- a/substrate/frame/grandpa/src/lib.rs +++ b/substrate/frame/grandpa/src/lib.rs @@ -174,8 +174,9 @@ decl_storage! { /// in the "set" of Grandpa validators from genesis. CurrentSetId get(fn current_set_id) build(|_| fg_primitives::SetId::default()): SetId; - /// A mapping from grandpa set ID to the index of the *most recent* session for which its members were responsible. - SetIdSession get(fn session_for_set): map hasher(blake2_256) SetId => Option; + /// A mapping from grandpa set ID to the index of the *most recent* session for which its + /// members were responsible. + SetIdSession get(fn session_for_set): map hasher(twox_64_concat) SetId => Option; } add_extra_genesis { config(authorities): AuthorityList; @@ -183,6 +184,15 @@ decl_storage! { } } +mod migration { + use super::*; + pub fn migrate() { + for i in 0..=CurrentSetId::get() { + SetIdSession::migrate_key_from_blake(i); + } + } +} + decl_module! { pub struct Module for enum Call where origin: T::Origin { type Error = Error; @@ -195,6 +205,10 @@ decl_module! { // FIXME: https://github.com/paritytech/substrate/issues/1112 } + fn on_runtime_upgrade() { + migration::migrate::(); + } + fn on_initialize() { #[cfg(feature = "migrate-authorities")] Self::migrate_authorities(); diff --git a/substrate/frame/grandpa/src/mock.rs b/substrate/frame/grandpa/src/mock.rs index 8b94becd5a..24d7feab49 100644 --- a/substrate/frame/grandpa/src/mock.rs +++ b/substrate/frame/grandpa/src/mock.rs @@ -66,7 +66,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/identity/src/lib.rs b/substrate/frame/identity/src/lib.rs index e993a0bebc..d3098dcde2 100644 --- a/substrate/frame/identity/src/lib.rs +++ b/substrate/frame/identity/src/lib.rs @@ -77,10 +77,10 @@ use frame_support::{ weights::SimpleDispatchInfo, }; use frame_system::{self as system, ensure_signed, ensure_root}; +use frame_support::traits::MigrateAccount; #[cfg(feature = "runtime-benchmarks")] pub mod benchmarking; -mod migration; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; @@ -386,18 +386,18 @@ decl_storage! { trait Store for Module as Identity { /// Information that is pertinent to identify the entity behind an account. pub IdentityOf get(fn identity): - map hasher(blake2_256) T::AccountId => Option>>; + map hasher(twox_64_concat) T::AccountId => Option>>; /// The super-identity of an alternative "sub" identity together with its name, within that /// context. If the account is not some other account's sub-identity, then just `None`. pub SuperOf get(fn super_of): - map hasher(blake2_256) T::AccountId => Option<(T::AccountId, Data)>; + map hasher(blake2_128_concat) T::AccountId => Option<(T::AccountId, Data)>; /// Alternative "sub" identities of this account. /// /// The first item is the deposit, the second is a vector of the accounts. pub SubsOf get(fn subs_of): - map hasher(blake2_256) T::AccountId => (BalanceOf, Vec); + map hasher(twox_64_concat) T::AccountId => (BalanceOf, Vec); /// The set of registrars. Not expected to get very big as can only be added through a /// special origin (likely a council motion). @@ -874,10 +874,6 @@ decl_module! { Self::deposit_event(RawEvent::IdentityKilled(target, deposit)); } - - fn on_runtime_upgrade() { - migration::on_runtime_upgrade::() - } } } @@ -891,6 +887,18 @@ impl Module { } } +impl MigrateAccount for Module { + fn migrate_account(a: &T::AccountId) { + if IdentityOf::::migrate_key_from_blake(a).is_some() { + if let Some((_, subs)) = SubsOf::::migrate_key_from_blake(a) { + for sub in subs.into_iter() { + SuperOf::::migrate_key_from_blake(sub); + } + } + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -941,7 +949,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } parameter_types! { diff --git a/substrate/frame/identity/src/migration.rs b/substrate/frame/identity/src/migration.rs deleted file mode 100644 index e312d9e04f..0000000000 --- a/substrate/frame/identity/src/migration.rs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate 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. - -// Substrate 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 Substrate. If not, see . - -//! Migration code to update storage. - -use super::*; -use frame_support::storage::migration::{put_storage_value, take_storage_value, StorageIterator}; - -pub fn on_runtime_upgrade() { - change_name_sudo_to_identity::() -} - -// Change the storage name used by this pallet from `Sudo` to `Identity`. -// -// Since the format of the storage items themselves have not changed, we do not -// need to keep track of a storage version. If the runtime does not need to be -// upgraded, nothing here will happen anyway. - -fn change_name_sudo_to_identity() { - sp_runtime::print("Migrating Identity."); - - for (hash, identity_of) in StorageIterator::>>::new(b"Sudo", b"IdentityOf").drain() { - put_storage_value(b"Identity", b"IdentityOf", &hash, identity_of); - } - - for (hash, super_of) in StorageIterator::<(T::AccountId, Data)>::new(b"Sudo", b"SuperOf").drain() { - put_storage_value(b"Identity", b"SuperOf", &hash, super_of); - } - - for (hash, subs_of) in StorageIterator::<(BalanceOf, Vec)>::new(b"Sudo", b"SubsOf").drain() { - put_storage_value(b"Identity", b"SubsOf", &hash, subs_of); - } - - if let Some(registrars) = take_storage_value::, T::AccountId>>>>(b"Sudo", b"Registrars", &[]) { - put_storage_value(b"Identity", b"Registrars", &[], registrars); - } - - sp_runtime::print("Done Identity."); -} diff --git a/substrate/frame/im-online/src/lib.rs b/substrate/frame/im-online/src/lib.rs index 9aa8d2d67f..4d40decdfc 100644 --- a/substrate/frame/im-online/src/lib.rs +++ b/substrate/frame/im-online/src/lib.rs @@ -95,6 +95,7 @@ use frame_support::{ }; use frame_system::{self as system, ensure_none}; use frame_system::offchain::SubmitUnsignedTransaction; +use frame_support::traits::MigrateAccount; pub mod sr25519 { mod app_sr25519 { @@ -274,16 +275,17 @@ decl_storage! { /// The current set of keys that may issue a heartbeat. Keys get(fn keys): Vec; - /// For each session index, we keep a mapping of `AuthIndex` - /// to `offchain::OpaqueNetworkState`. + /// For each session index, we keep a mapping of `AuthIndex` to + /// `offchain::OpaqueNetworkState`. ReceivedHeartbeats get(fn received_heartbeats): - double_map hasher(blake2_256) SessionIndex, hasher(blake2_256) AuthIndex + double_map hasher(twox_64_concat) SessionIndex, hasher(twox_64_concat) AuthIndex => Option>; /// For each session index, we keep a mapping of `T::ValidatorId` to the /// number of blocks authored by the given authority. AuthoredBlocks get(fn authored_blocks): - double_map hasher(blake2_256) SessionIndex, hasher(blake2_256) T::ValidatorId => u32; + double_map hasher(twox_64_concat) SessionIndex, hasher(twox_64_concat) T::ValidatorId + => u32; } add_extra_genesis { config(keys): Vec; @@ -301,12 +303,38 @@ decl_error! { } } +mod migration { + use super::*; + use frame_support::Blake2_256; + pub fn migrate() { + let current_index = >::current_index(); + let key_count = Keys::::get().len() as AuthIndex; + for i in 0..key_count { + ReceivedHeartbeats::migrate_keys::(current_index, i); + } + } +} + +impl MigrateAccount for Module { + fn migrate_account(a: &T::AccountId) { + use frame_support::Blake2_256; + let current_index = >::current_index(); + if let Ok(v) = a.using_encoded(|mut d| T::ValidatorId::decode(&mut d)) { + AuthoredBlocks::::migrate_keys::(current_index, v); + } + } +} + decl_module! { pub struct Module for enum Call where origin: T::Origin { type Error = Error; fn deposit_event() = default; + fn on_runtime_upgrade() { + migration::migrate::(); + } + fn heartbeat( origin, heartbeat: Heartbeat, diff --git a/substrate/frame/im-online/src/mock.rs b/substrate/frame/im-online/src/mock.rs index 78b6409d54..e0ee2547bf 100644 --- a/substrate/frame/im-online/src/mock.rs +++ b/substrate/frame/im-online/src/mock.rs @@ -119,7 +119,7 @@ impl frame_system::Trait for Runtime { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/indices/src/mock.rs b/substrate/frame/indices/src/mock.rs index 355b3cc792..f5cd1009e6 100644 --- a/substrate/frame/indices/src/mock.rs +++ b/substrate/frame/indices/src/mock.rs @@ -66,7 +66,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/membership/src/lib.rs b/substrate/frame/membership/src/lib.rs index 129f3c4003..e9fa5a0630 100644 --- a/substrate/frame/membership/src/lib.rs +++ b/substrate/frame/membership/src/lib.rs @@ -321,7 +321,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } ord_parameter_types! { diff --git a/substrate/frame/metadata/src/lib.rs b/substrate/frame/metadata/src/lib.rs index 5ecb9f3443..bec69999b2 100644 --- a/substrate/frame/metadata/src/lib.rs +++ b/substrate/frame/metadata/src/lib.rs @@ -277,6 +277,7 @@ pub enum StorageHasher { Twox128, Twox256, Twox64Concat, + Identity, } /// A storage entry type. @@ -288,7 +289,8 @@ pub enum StorageEntryType { hasher: StorageHasher, key: DecodeDifferentStr, value: DecodeDifferentStr, - is_linked: bool, + // is_linked flag previously, unused now to keep backwards compat + unused: bool, }, DoubleMap { hasher: StorageHasher, diff --git a/substrate/frame/nicks/src/lib.rs b/substrate/frame/nicks/src/lib.rs index 4fa94b575f..ddfd71107f 100644 --- a/substrate/frame/nicks/src/lib.rs +++ b/substrate/frame/nicks/src/lib.rs @@ -78,7 +78,7 @@ pub trait Trait: frame_system::Trait { decl_storage! { trait Store for Module as Nicks { /// The lookup table for names. - NameOf: map hasher(blake2_256) T::AccountId => Option<(Vec, BalanceOf)>; + NameOf: map hasher(twox_64_concat) T::AccountId => Option<(Vec, BalanceOf)>; } } @@ -286,7 +286,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } parameter_types! { diff --git a/substrate/frame/offences/src/lib.rs b/substrate/frame/offences/src/lib.rs index 27983cbb53..325ceceb8b 100644 --- a/substrate/frame/offences/src/lib.rs +++ b/substrate/frame/offences/src/lib.rs @@ -54,11 +54,13 @@ pub trait Trait: frame_system::Trait { decl_storage! { trait Store for Module as Offences { /// The primary structure that holds all offence records keyed by report identifiers. - Reports get(fn reports): map hasher(blake2_256) ReportIdOf => Option>; + Reports get(fn reports): + map hasher(twox_64_concat) ReportIdOf + => Option>; /// A vector of reports of the same kind that happened at the same time slot. ConcurrentReportsIndex: - double_map hasher(blake2_256) Kind, hasher(blake2_256) OpaqueTimeSlot + double_map hasher(twox_64_concat) Kind, hasher(twox_64_concat) OpaqueTimeSlot => Vec>; /// Enumerates all reports of a kind along with the time they happened. @@ -67,7 +69,7 @@ decl_storage! { /// /// Note that the actual type of this mapping is `Vec`, this is because values of /// different types are not supported at the moment so we are doing the manual serialization. - ReportsByKindIndex: map hasher(blake2_256) Kind => Vec; // (O::TimeSlot, ReportIdOf) + ReportsByKindIndex: map hasher(twox_64_concat) Kind => Vec; // (O::TimeSlot, ReportIdOf) } } @@ -83,8 +85,15 @@ decl_module! { /// Offences module, currently just responsible for taking offence reports. pub struct Module for enum Call where origin: T::Origin { fn deposit_event() = default; + + fn on_runtime_upgrade() { + Reports::::remove_all(); + ConcurrentReportsIndex::::remove_all(); + ReportsByKindIndex::remove_all(); + } } } + impl> ReportOffence for Module where diff --git a/substrate/frame/offences/src/mock.rs b/substrate/frame/offences/src/mock.rs index a003ad6915..c617224716 100644 --- a/substrate/frame/offences/src/mock.rs +++ b/substrate/frame/offences/src/mock.rs @@ -90,7 +90,7 @@ impl frame_system::Trait for Runtime { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/randomness-collective-flip/src/lib.rs b/substrate/frame/randomness-collective-flip/src/lib.rs index 0ded7dd6b0..525bbedb40 100644 --- a/substrate/frame/randomness-collective-flip/src/lib.rs +++ b/substrate/frame/randomness-collective-flip/src/lib.rs @@ -192,7 +192,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/recovery/src/lib.rs b/substrate/frame/recovery/src/lib.rs index 1b3c941638..d995606e52 100644 --- a/substrate/frame/recovery/src/lib.rs +++ b/substrate/frame/recovery/src/lib.rs @@ -163,6 +163,7 @@ use frame_support::{ traits::{Currency, ReservableCurrency, Get, BalanceStatus}, }; use frame_system::{self as system, ensure_signed, ensure_root}; +use frame_support::traits::MigrateAccount; #[cfg(test)] mod mock; @@ -238,7 +239,7 @@ decl_storage! { trait Store for Module as Recovery { /// The set of recoverable accounts and their recovery configuration. pub Recoverable get(fn recovery_config): - map hasher(blake2_256) T::AccountId + map hasher(twox_64_concat) T::AccountId => Option, T::AccountId>>; /// Active recovery attempts. @@ -253,7 +254,14 @@ decl_storage! { /// /// Map from the user who can access it to the recovered account. pub Proxy get(fn proxy): - map hasher(blake2_256) T::AccountId => Option; + map hasher(blake2_128_concat) T::AccountId => Option; + } +} + +impl MigrateAccount for Module { + fn migrate_account(a: &T::AccountId) { + Recoverable::::migrate_key_from_blake(a); + Proxy::::migrate_key_from_blake(a); } } diff --git a/substrate/frame/recovery/src/mock.rs b/substrate/frame/recovery/src/mock.rs index a5b7731c22..3eaba0d6c1 100644 --- a/substrate/frame/recovery/src/mock.rs +++ b/substrate/frame/recovery/src/mock.rs @@ -79,7 +79,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/scored-pool/src/lib.rs b/substrate/frame/scored-pool/src/lib.rs index e3854c7524..ebabe79105 100644 --- a/substrate/frame/scored-pool/src/lib.rs +++ b/substrate/frame/scored-pool/src/lib.rs @@ -165,7 +165,7 @@ decl_storage! { /// check if a candidate is already in the pool, without having to /// iterate over the entire pool (the `Pool` is not sorted by /// `T::AccountId`, but by `T::Score` instead). - CandidateExists get(fn candidate_exists): map hasher(blake2_256) T::AccountId => bool; + CandidateExists get(fn candidate_exists): map hasher(twox_64_concat) T::AccountId => bool; /// The current membership, stored as an ordered Vec. Members get(fn members): Vec; diff --git a/substrate/frame/scored-pool/src/mock.rs b/substrate/frame/scored-pool/src/mock.rs index a28b789137..f50e918ee6 100644 --- a/substrate/frame/scored-pool/src/mock.rs +++ b/substrate/frame/scored-pool/src/mock.rs @@ -71,7 +71,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/session/src/historical.rs b/substrate/frame/session/src/historical.rs index 91719c27f2..848f6d5599 100644 --- a/substrate/frame/session/src/historical.rs +++ b/substrate/frame/session/src/historical.rs @@ -56,12 +56,12 @@ decl_storage! { trait Store for Module as Session { /// Mapping from historical session indices to session-data root hash and validator count. HistoricalSessions get(fn historical_root): - map hasher(blake2_256) SessionIndex => Option<(T::Hash, ValidatorCount)>; + map hasher(twox_64_concat) SessionIndex => Option<(T::Hash, ValidatorCount)>; /// The range of historical sessions we store. [first, last) StoredRange: Option<(SessionIndex, SessionIndex)>; /// Deprecated. CachedObsolete: - map hasher(blake2_256) SessionIndex + map hasher(twox_64_concat) SessionIndex => Option>; } } @@ -71,6 +71,20 @@ decl_module! { fn on_initialize(_n: T::BlockNumber) { CachedObsolete::::remove_all(); } + fn on_runtime_upgrade() { + migration::migrate::(); + } + } +} + +mod migration { + use super::*; + pub fn migrate() { + if let Some((begin, end)) = StoredRange::get() { + for i in begin..end { + HistoricalSessions::::migrate_key_from_blake(i); + } + } } } diff --git a/substrate/frame/session/src/lib.rs b/substrate/frame/session/src/lib.rs index 226003d933..e98ea2475d 100644 --- a/substrate/frame/session/src/lib.rs +++ b/substrate/frame/session/src/lib.rs @@ -109,6 +109,7 @@ use frame_support::{ensure, decl_module, decl_event, decl_storage, decl_error, C use frame_support::{traits::{Get, FindAuthor, ValidatorRegistration}, Parameter}; use frame_support::dispatch::{self, DispatchResult, DispatchError}; use frame_system::{self as system, ensure_signed}; +use frame_support::traits::MigrateAccount; #[cfg(test)] mod mock; @@ -364,10 +365,10 @@ decl_storage! { DisabledValidators get(fn disabled_validators): Vec; /// The next session keys for a validator. - NextKeys: map hasher(blake2_256) T::ValidatorId => Option; + NextKeys: map hasher(twox_64_concat) T::ValidatorId => Option; /// The owner of a key. The key is the `KeyTypeId` + the encoded key. - KeyOwner: map hasher(blake2_256) (KeyTypeId, Vec) => Option; + KeyOwner: map hasher(twox_64_concat) (KeyTypeId, Vec) => Option; } add_extra_genesis { config(keys): Vec<(T::AccountId, T::ValidatorId, T::Keys)>; @@ -498,36 +499,22 @@ decl_module! { Self::rotate_session(); } } + } +} - /// Called when the runtime is upgraded. - fn on_runtime_upgrade() { - Self::migrate(); +impl MigrateAccount for Module { + fn migrate_account(a: &T::AccountId) { + if let Some(v) = T::ValidatorIdOf::convert(a.clone()) { + if let Some(keys) = NextKeys::::migrate_key_from_blake(v) { + for id in T::Keys::key_ids() { + KeyOwner::::migrate_key_from_blake((*id, keys.get_raw(*id))); + } + } } } } impl Module { - /// Move keys from NextKeys and KeyOwner, if any exist. - fn migrate() { - use frame_support::storage::migration::{put_storage_value, StorageIterator}; - sp_runtime::print("Migrating session's double-maps..."); - - let prefix = { - const DEDUP_KEY_PREFIX: &[u8] = b":session:keys"; - let encoded_prefix_key_hash = codec::Encode::encode(&DEDUP_KEY_PREFIX); - let mut h = sp_io::hashing::twox_64(&encoded_prefix_key_hash[..]).to_vec(); - h.extend(&encoded_prefix_key_hash[..]); - h - }; - - for (hash, value) in StorageIterator::::with_suffix(b"Session", b"NextKeys", &prefix[..]).drain() { - put_storage_value(b"Session", b"NextKeys", &hash, value); - } - for (hash, value) in StorageIterator::::with_suffix(b"Session", b"KeyOwner", &prefix[..]).drain() { - put_storage_value(b"Session", b"KeyOwner", &hash, value); - } - } - /// Move on to next session. Register new validator set and session keys. Changes /// to the validator set have a session of delay to take effect. This allows for /// equivocation punishment after a fork. diff --git a/substrate/frame/session/src/mock.rs b/substrate/frame/session/src/mock.rs index 9d64285b90..6a60233222 100644 --- a/substrate/frame/session/src/mock.rs +++ b/substrate/frame/session/src/mock.rs @@ -179,7 +179,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/society/src/lib.rs b/substrate/frame/society/src/lib.rs index 38dc491b80..eafd5ec519 100644 --- a/substrate/frame/society/src/lib.rs +++ b/substrate/frame/society/src/lib.rs @@ -261,10 +261,7 @@ use sp_runtime::{Percent, ModuleId, RuntimeDebug, }; use frame_support::{decl_error, decl_module, decl_storage, decl_event, ensure, dispatch::DispatchResult}; use frame_support::weights::SimpleDispatchInfo; -use frame_support::traits::{ - Currency, ReservableCurrency, Randomness, Get, ChangeMembers, BalanceStatus, - ExistenceRequirement::AllowDeath, -}; +use frame_support::traits::{Currency, ReservableCurrency, Randomness, Get, ChangeMembers, BalanceStatus, ExistenceRequirement::AllowDeath, MigrateAccount}; use frame_system::{self as system, ensure_signed, ensure_root}; type BalanceOf = <>::Currency as Currency<::AccountId>>::Balance; @@ -414,7 +411,7 @@ decl_storage! { /// The set of suspended candidates. pub SuspendedCandidates get(suspended_candidate): - map hasher(blake2_256) T::AccountId + map hasher(twox_64_concat) T::AccountId => Option<(BalanceOf, BidKind>)>; /// Amount of our account balance that is specifically for the next round's bid(s). @@ -432,19 +429,19 @@ decl_storage! { }): Vec; /// The set of suspended members. - pub SuspendedMembers get(fn suspended_member): map hasher(blake2_256) T::AccountId => bool; + pub SuspendedMembers get(fn suspended_member): map hasher(twox_64_concat) T::AccountId => bool; /// The current bids, stored ordered by the value of the bid. Bids: Vec>>; /// Members currently vouching or banned from vouching again - Vouching get(fn vouching): map hasher(blake2_256) T::AccountId => Option; + Vouching get(fn vouching): map hasher(twox_64_concat) T::AccountId => Option; /// Pending payouts; ordered by block number, with the amount that should be paid out. - Payouts: map hasher(blake2_256) T::AccountId => Vec<(T::BlockNumber, BalanceOf)>; + Payouts: map hasher(twox_64_concat) T::AccountId => Vec<(T::BlockNumber, BalanceOf)>; /// The ongoing number of losing votes cast by the member. - Strikes: map hasher(blake2_256) T::AccountId => StrikeCount; + Strikes: map hasher(twox_64_concat) T::AccountId => StrikeCount; /// Double map from Candidate -> Voter -> (Maybe) Vote. Votes: double_map @@ -1133,6 +1130,12 @@ decl_event! { } } +impl MigrateAccount for Module { + fn migrate_account(a: &T::AccountId) { + Payouts::::migrate_key_from_blake(a); + } +} + /// Simple ensure origin struct to filter for the founder account. pub struct EnsureFounder(sp_std::marker::PhantomData); impl EnsureOrigin for EnsureFounder { diff --git a/substrate/frame/society/src/mock.rs b/substrate/frame/society/src/mock.rs index 158f139df5..b80e0cd2bf 100644 --- a/substrate/frame/society/src/mock.rs +++ b/substrate/frame/society/src/mock.rs @@ -77,7 +77,7 @@ impl frame_system::Trait for Test { type AvailableBlockRatio = AvailableBlockRatio; type Version = (); type ModuleToIndex = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); type AccountData = pallet_balances::AccountData; } diff --git a/substrate/frame/staking/src/lib.rs b/substrate/frame/staking/src/lib.rs index d8740f44e7..517069a3f0 100644 --- a/substrate/frame/staking/src/lib.rs +++ b/substrate/frame/staking/src/lib.rs @@ -254,19 +254,16 @@ mod mock; #[cfg(test)] mod tests; mod slashing; -mod migration; pub mod inflation; use sp_std::{prelude::*, result, collections::btree_map::BTreeMap}; use codec::{HasCompact, Encode, Decode}; use frame_support::{ - decl_module, decl_event, decl_storage, ensure, decl_error, - weights::SimpleDispatchInfo, - dispatch::DispatchResult, - traits::{ - Currency, LockIdentifier, LockableCurrency, - WithdrawReasons, OnUnbalanced, Imbalance, Get, Time + decl_module, decl_event, decl_storage, ensure, decl_error, weights::SimpleDispatchInfo, + dispatch::DispatchResult, storage::IterableStorageMap, traits::{ + Currency, LockIdentifier, LockableCurrency, WithdrawReasons, OnUnbalanced, Imbalance, Get, + Time } }; use pallet_session::historical::SessionManager; @@ -287,6 +284,7 @@ use sp_runtime::{Serialize, Deserialize}; use frame_system::{self as system, ensure_signed, ensure_root}; use sp_phragmen::ExtendedBalance; +use frame_support::traits::MigrateAccount; const DEFAULT_MINIMUM_VALIDATOR_COUNT: u32 = 4; const MAX_NOMINATIONS: usize = 16; @@ -685,13 +683,13 @@ impl Default for Forcing { // storage migration logic. This should match directly with the semantic versions of the Rust crate. #[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug)] enum Releases { - V1_0_0, + V1_0_0Ancient, V2_0_0, } impl Default for Releases { fn default() -> Self { - Releases::V1_0_0 + Releases::V2_0_0 } } @@ -719,23 +717,23 @@ decl_storage! { pub Invulnerables get(fn invulnerables) config(): Vec; /// Map from all locked "stash" accounts to the controller account. - pub Bonded get(fn bonded): map hasher(blake2_256) T::AccountId => Option; + pub Bonded get(fn bonded): map hasher(twox_64_concat) T::AccountId => Option; /// Map from all (unlocked) "controller" accounts to the info regarding the staking. pub Ledger get(fn ledger): - map hasher(blake2_256) T::AccountId + map hasher(blake2_128_concat) T::AccountId => Option>>; /// Where the reward payment should be made. Keyed by stash. - pub Payee get(fn payee): map hasher(blake2_256) T::AccountId => RewardDestination; + pub Payee get(fn payee): map hasher(twox_64_concat) T::AccountId => RewardDestination; /// The map from (wannabe) validator stash key to the preferences of that validator. pub Validators get(fn validators): - linked_map hasher(blake2_256) T::AccountId => ValidatorPrefs; + map hasher(twox_64_concat) T::AccountId => ValidatorPrefs; /// The map from nominator stash key to the set of stash keys of all validators to nominate. pub Nominators get(fn nominators): - linked_map hasher(blake2_256) T::AccountId => Option>; + map hasher(twox_64_concat) T::AccountId => Option>; /// The current era index. /// @@ -751,7 +749,7 @@ decl_storage! { /// The session index at which the era start for the last `HISTORY_DEPTH` eras pub ErasStartSessionIndex get(fn eras_start_session_index): - map hasher(blake2_256) EraIndex => Option; + map hasher(twox_64_concat) EraIndex => Option; /// Exposure of validator at era. /// @@ -780,7 +778,7 @@ decl_storage! { /// Similarly to `ErasStakers` this holds the preferences of validators. /// - /// This is keyed fist by the era index to allow bulk deletion and then the stash account. + /// This is keyed first by the era index to allow bulk deletion and then the stash account. /// /// Is it removed after `HISTORY_DEPTH` eras. // If prefs hasn't been set or has been removed then 0 commission is returned. @@ -792,17 +790,17 @@ decl_storage! { /// /// Eras that haven't finished yet or has been removed doesn't have reward. pub ErasValidatorReward get(fn eras_validator_reward): - map hasher(blake2_256) EraIndex => Option>; + map hasher(twox_64_concat) EraIndex => Option>; /// Rewards for the last `HISTORY_DEPTH` eras. /// If reward hasn't been set or has been removed then 0 reward is returned. pub ErasRewardPoints get(fn eras_reward_points): - map hasher(blake2_256) EraIndex => EraRewardPoints; + map hasher(twox_64_concat) EraIndex => EraRewardPoints; /// The total amount staked for the last `HISTORY_DEPTH` eras. /// If total hasn't been set or has been removed then 0 stake is returned. pub ErasTotalStake get(fn eras_total_stake): - map hasher(blake2_256) EraIndex => BalanceOf; + map hasher(twox_64_concat) EraIndex => BalanceOf; /// True if the next session change will be a new era regardless of index. pub ForceEra get(fn force_era) config(): Forcing; @@ -818,7 +816,7 @@ decl_storage! { /// All unapplied slashes that are queued for later. pub UnappliedSlashes: - map hasher(blake2_256) EraIndex => Vec>>; + map hasher(twox_64_concat) EraIndex => Vec>>; /// A mapping from still-bonded eras to the first session index of that era. /// @@ -829,21 +827,21 @@ decl_storage! { /// All slashing events on validators, mapped by era to the highest slash proportion /// and slash value of the era. ValidatorSlashInEra: - double_map hasher(blake2_256) EraIndex, hasher(twox_128) T::AccountId + double_map hasher(twox_64_concat) EraIndex, hasher(twox_64_concat) T::AccountId => Option<(Perbill, BalanceOf)>; /// All slashing events on nominators, mapped by era to the highest slash value of the era. NominatorSlashInEra: - double_map hasher(blake2_256) EraIndex, hasher(twox_128) T::AccountId + double_map hasher(twox_64_concat) EraIndex, hasher(twox_64_concat) T::AccountId => Option>; /// Slashing spans for stash accounts. - SlashingSpans: map hasher(blake2_256) T::AccountId => Option; + SlashingSpans: map hasher(twox_64_concat) T::AccountId => Option; /// Records information about the maximum slash of a stash within a slashing span, /// as well as how much reward has been paid out. SpanSlash: - map hasher(blake2_256) (T::AccountId, slashing::SpanIndex) + map hasher(twox_64_concat) (T::AccountId, slashing::SpanIndex) => slashing::SpanRecord>; /// The earliest era for which we have a pending, unapplied slash. @@ -957,7 +955,7 @@ decl_module! { fn deposit_event() = default; fn on_runtime_upgrade() { - migration::on_runtime_upgrade::(); + migrate::(); } fn on_finalize() { @@ -1480,6 +1478,30 @@ decl_module! { } } +impl MigrateAccount for Module { + fn migrate_account(a: &T::AccountId) { + if let Some(controller) = Bonded::::migrate_key_from_blake(a) { + Ledger::::migrate_key_from_blake(controller); + Payee::::migrate_key_from_blake(a); + Validators::::migrate_key_from_blake(a); + Nominators::::migrate_key_from_blake(a); + SlashingSpans::::migrate_key_from_blake(a); + } + } +} + +fn migrate() { + if let Some(current_era) = CurrentEra::get() { + let history_depth = HistoryDepth::get(); + for era in current_era.saturating_sub(history_depth)..=current_era { + ErasStartSessionIndex::migrate_key_from_blake(era); + ErasValidatorReward::::migrate_key_from_blake(era); + ErasRewardPoints::::migrate_key_from_blake(era); + ErasTotalStake::::migrate_key_from_blake(era); + } + } +} + impl Module { // PUBLIC IMMUTABLES @@ -1823,14 +1845,14 @@ impl Module { let mut all_nominators: Vec<(T::AccountId, Vec)> = Vec::new(); let mut all_validators_and_prefs = BTreeMap::new(); let mut all_validators = Vec::new(); - for (validator, preference) in >::enumerate() { + for (validator, preference) in >::iter() { let self_vote = (validator.clone(), vec![validator.clone()]); all_nominators.push(self_vote); all_validators_and_prefs.insert(validator.clone(), preference); all_validators.push(validator); } - let nominator_votes = >::enumerate().map(|(nominator, nominations)| { + let nominator_votes = >::iter().map(|(nominator, nominations)| { let Nominations { submitted_in, mut targets, suppressed: _ } = nominations; // Filter out nomination targets which were nominated before the most recent diff --git a/substrate/frame/staking/src/migration/deprecated.rs b/substrate/frame/staking/src/migration/deprecated.rs deleted file mode 100644 index b5ec26d32f..0000000000 --- a/substrate/frame/staking/src/migration/deprecated.rs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate 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. - -// Substrate 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 Substrate. If not, see . - -/// Deprecated storages used for migration from v1.0.0 to v2.0.0 only. - -use crate::{Trait, BalanceOf, MomentOf, SessionIndex, Exposure, UnlockChunk}; -use codec::{Encode, Decode, HasCompact}; -use frame_support::{decl_module, decl_storage}; -use sp_std::prelude::*; - -/// Reward points of an era. Used to split era total payout between validators. -#[derive(Encode, Decode, Default)] -pub struct EraPoints { - /// Total number of points. Equals the sum of reward points for each validator. - pub total: u32, - /// The reward points earned by a given validator. The index of this vec corresponds to the - /// index into the current validator set. - pub individual: Vec, -} - -#[derive(Encode, Decode)] -pub struct OldStakingLedger { - pub stash: AccountId, - #[codec(compact)] - pub total: Balance, - #[codec(compact)] - pub active: Balance, - pub unlocking: Vec>, -} - -decl_module! { - pub struct Module for enum Call where origin: T::Origin { } -} - -decl_storage! { - pub trait Store for Module as Staking { - pub SlotStake: BalanceOf; - - /// The currently elected validator set keyed by stash account ID. - pub CurrentElected: Vec; - - /// The start of the current era. - pub CurrentEraStart: MomentOf; - - /// The session index at which the current era started. - pub CurrentEraStartSessionIndex: SessionIndex; - - /// Rewards for the current era. Using indices of current elected set. - pub CurrentEraPointsEarned: EraPoints; - - /// Nominators for a particular account that is in action right now. You can't iterate - /// through validators here, but you can find them in the Session module. - /// - /// This is keyed by the stash account. - pub Stakers: map hasher(blake2_256) T::AccountId => Exposure>; - - /// Old upgrade flag. - pub IsUpgraded: bool; - } -} diff --git a/substrate/frame/staking/src/migration/mod.rs b/substrate/frame/staking/src/migration/mod.rs deleted file mode 100644 index 971e409189..0000000000 --- a/substrate/frame/staking/src/migration/mod.rs +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate 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. - -// Substrate 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 Substrate. If not, see . - -//! Update storage from v1.0.0 to v2.0.0 -//! -//! In old version the staking module has several issue about handling session delay, the -//! current era was always considered the active one. -//! -//! After the migration the current era will still be considered the active one for the era of -//! the upgrade. And the delay issue will be fixed when planning the next era. -// * create: -// * ActiveEraStart -// * ErasRewardPoints -// * ActiveEra -// * ErasStakers -// * ErasStakersClipped -// * ErasValidatorPrefs -// * ErasTotalStake -// * ErasStartSessionIndex -// * translate StakingLedger -// * removal of: -// * Stakers -// * SlotStake -// * CurrentElected -// * CurrentEraStart -// * CurrentEraStartSessionIndex -// * CurrentEraPointsEarned - -use super::*; -mod deprecated; -#[cfg(test)] -mod tests; -#[cfg(test)] -mod test_upgrade_from_master_dataset; - -pub fn on_runtime_upgrade() { - match StorageVersion::get() { - Releases::V2_0_0 => return, - Releases::V1_0_0 => upgrade_v1_to_v2::(), - } -} - -fn upgrade_v1_to_v2() { - deprecated::IsUpgraded::kill(); - - let current_era_start_index = deprecated::CurrentEraStartSessionIndex::get(); - let current_era = as Store>::CurrentEra::get().unwrap_or(0); - let current_era_start = deprecated::CurrentEraStart::::get(); - as Store>::ErasStartSessionIndex::insert(current_era, current_era_start_index); - as Store>::ActiveEra::put(ActiveEraInfo { - index: current_era, - start: Some(current_era_start), - }); - - let current_elected = deprecated::CurrentElected::::get(); - let mut current_total_stake = >::zero(); - for validator in ¤t_elected { - let exposure = deprecated::Stakers::::get(validator); - current_total_stake += exposure.total; - as Store>::ErasStakers::insert(current_era, validator, &exposure); - - let mut exposure_clipped = exposure; - let clipped_max_len = T::MaxNominatorRewardedPerValidator::get() as usize; - if exposure_clipped.others.len() > clipped_max_len { - exposure_clipped.others.sort_unstable_by(|a, b| a.value.cmp(&b.value).reverse()); - exposure_clipped.others.truncate(clipped_max_len); - } - as Store>::ErasStakersClipped::insert(current_era, validator, exposure_clipped); - - let pref = as Store>::Validators::get(validator); - as Store>::ErasValidatorPrefs::insert(current_era, validator, pref); - } - as Store>::ErasTotalStake::insert(current_era, current_total_stake); - - let points = deprecated::CurrentEraPointsEarned::get(); - as Store>::ErasRewardPoints::insert(current_era, EraRewardPoints { - total: points.total, - individual: current_elected.iter().cloned().zip(points.individual.iter().cloned()).collect(), - }); - - let res = as Store>::Ledger::translate_values( - |old: deprecated::OldStakingLedger>| StakingLedger { - stash: old.stash, - total: old.total, - active: old.active, - unlocking: old.unlocking, - last_reward: None, - } - ); - if let Err(e) = res { - frame_support::print("Encountered error in migration of Staking::Ledger map."); - frame_support::print("The number of removed key/value is:"); - frame_support::print(e); - } - - - // Kill old storages - deprecated::Stakers::::remove_all(); - deprecated::SlotStake::::kill(); - deprecated::CurrentElected::::kill(); - deprecated::CurrentEraStart::::kill(); - deprecated::CurrentEraStartSessionIndex::kill(); - deprecated::CurrentEraPointsEarned::kill(); - - StorageVersion::put(Releases::V2_0_0); -} diff --git a/substrate/frame/staking/src/migration/test_upgrade_from_master_dataset.rs b/substrate/frame/staking/src/migration/test_upgrade_from_master_dataset.rs deleted file mode 100644 index 32f9b0a3ed..0000000000 --- a/substrate/frame/staking/src/migration/test_upgrade_from_master_dataset.rs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2020-2020 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate 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. - -// Substrate 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 Substrate. If not, see . - -//! Data set for testing update from previous staking module. -//! -//! Each data set correspond to the storage state for its corresponding block just before the -//! staking initialisation. -//! -//! it has been generated using the following code at commit -//! dc92587bea4032e0a0fc96785bfd9aa17c95459e -//! -//! ```nocompile -//! fn print_storage(i: u32) { -//! let mut storage = vec![]; -//! let mut current_key = vec![]; -//! while let Some(key) = sp_io::storage::next_key(¤t_key) { -//! storage.push((key.clone(), sp_io::storage::get(&key).unwrap())); -//! current_key = key; -//! } -//! println!("const _{}: &[(&[u8], &[u8])] = {:?};", i, storage); -//! } -//! -//! #[test] -//! fn get_states() { -//! let mut ext = ExtBuilder::default().build(); -//! -//! for index in 1..10u32 { -//! ext.execute_with(|| { -//! print_storage(index - 1); -//! System::set_block_number((index).into()); -//! Timestamp::set_timestamp(System::block_number() * 1000); -//! Session::on_initialize(System::block_number()); -//! }); -//! } -//! } -//! ``` - -pub const _0: &[(&[u8], &[u8])] = &[(&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 2, 165, 193, 177, 154, 183, 160, 79, 83, 108, 81, 154, 202, 73, 131, 172], &[1, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 10, 152, 253, 190, 156, 230, 197, 88, 55, 87, 108, 96, 199, 175, 56, 80], &[15, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 128, 212, 30, 94, 22, 5, 103, 101, 188, 132, 97, 133, 16, 114, 201, 215], &[60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 138, 66, 243, 51, 35, 203, 92, 237, 59, 68, 221, 130, 95, 218, 159, 204], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 164, 71, 4, 181, 104, 210, 22, 103, 53, 106, 90, 5, 12, 17, 135, 70, 129, 228, 122, 25, 230, 178, 155, 10, 101, 185, 89, 23, 98, 206, 81, 67, 237, 48, 208, 38, 30, 93, 36, 163, 32, 23, 82, 80, 107, 32, 241, 92], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 29, 189, 125, 11, 86, 26, 65, 210, 60, 42, 70, 154, 212, 47, 189, 112, 213, 67, 139, 174, 130, 111, 111, 214, 7, 65, 49, 144, 195, 124, 54, 59], &[0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 100, 74, 81, 252, 33, 158, 145, 69, 184, 87, 123, 183, 118, 40, 118, 123, 28, 47, 115, 116, 142, 218, 139, 120, 139, 252, 102, 161, 181, 42, 32, 248], &[0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 165, 212, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 108, 221, 179, 103, 175, 189, 88, 59, 180, 143, 155, 189, 125, 91, 163, 177, 208, 115, 139, 72, 129, 177, 205, 221, 56, 22, 149, 38, 216, 21, 129, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 232, 139, 67, 253, 237, 99, 35, 239, 2, 255, 239, 251, 216, 196, 8, 70, 238, 9, 191, 49, 98, 113, 189, 34, 54, 150, 89, 201, 89, 221, 115, 58], &[0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 233, 103, 96, 210, 116, 101, 58, 57, 180, 41, 168, 126, 186, 174, 157, 58, 164, 253, 245, 139, 144, 150, 207, 11, 235, 199, 196, 229, 164, 194, 237, 141], &[0, 0, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0]), (&[58, 99, 111, 100, 101], &[]), (&[58, 101, 120, 116, 114, 105, 110, 115, 105, 99, 95, 105, 110, 100, 101, 120], &[0, 0, 0, 0]), (&[58, 104, 101, 97, 112, 112, 97, 103, 101, 115], &[8, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 11, 106, 69, 50, 30, 250, 233, 42, 234, 21, 224, 116, 14, 199, 175, 231], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 14, 160, 236, 172, 118, 69, 125, 15, 155, 57, 185, 129, 221, 16, 112, 18], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 19, 142, 113, 97, 36, 145, 25, 45, 104, 222, 171, 126, 111, 86, 63, 225], &[2, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 40, 220, 203, 85, 155, 149, 196, 1, 104, 161, 178, 105, 101, 129, 181, 167], &[0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[40, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[10, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[30, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[20, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[100, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[21, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[31, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[11, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[101, 0, 0, 0, 0, 0, 0, 0, 209, 7, 209, 7, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[41, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 80, 154, 155, 110, 250, 147, 245, 187, 131, 248, 88, 240, 186, 191, 211, 11], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 85, 121, 41, 127, 77, 251, 150, 9, 231, 228, 194, 235, 171, 156, 228, 10], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 86, 239, 98, 39, 206, 203, 47, 7, 39, 76, 176, 87, 45, 143, 164, 194], &[101, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 106, 147, 17, 38, 51, 187, 51, 84, 230, 121, 82, 252, 221, 116, 12, 213], &[31, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[149, 17, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 245, 1]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[125, 21, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 221, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 1, 21, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 1, 31, 0, 0, 0, 0, 0, 0, 0, 1, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 106, 99, 127, 98, 174, 42, 241, 199, 227, 30, 237, 126, 150, 190, 4, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[8, 11, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 189, 47, 11, 41, 160, 8, 163, 96, 9, 172, 68, 204, 160, 201, 105], &[101, 4, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 180, 154, 39, 56, 238, 179, 8, 150, 170, 203, 139, 63, 180, 100, 113, 189], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 194, 154, 3, 16, 225, 187, 69, 210, 12, 172, 231, 124, 203, 98, 201, 125], &[0, 225, 245, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 234, 7, 222, 43, 143, 1, 5, 22, 220, 163, 247, 239, 82, 247, 172, 90], &[4, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 247, 218, 208, 49, 115, 36, 174, 202, 232, 116, 75, 135, 252, 149, 242, 243], &[0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 244, 1, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 87, 200, 117, 228, 207, 247, 65, 72, 228, 98, 143, 38, 75, 151, 76, 128], &[214, 61, 165, 212, 232, 0, 0, 0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 227, 253, 141, 247, 41, 112, 188, 130, 229, 38, 126, 160, 30, 221, 217, 73], &[1]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 109, 123, 24, 86, 30, 19, 159, 228, 49, 200, 33, 139, 70, 205, 244, 47, 40, 190, 110, 43, 138, 12, 26, 121, 5, 219, 103, 1, 110, 91, 142, 123], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 238, 43, 102, 225, 142, 104, 190, 12, 183, 86, 115, 25, 37, 223, 229, 65, 253, 167, 152, 54, 57, 147, 167, 137, 80, 161, 2, 235, 195, 174, 40, 244], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 17, 218, 109, 31, 118, 29, 223, 155, 219, 76, 157, 110, 83, 3, 235, 212, 31, 97, 133, 141, 10, 86, 71, 161, 167, 191, 224, 137, 191, 146, 27, 233], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 225, 44, 34, 212, 241, 98, 217, 160, 18, 201, 49, 146, 51, 218, 93, 62, 146, 60, 197, 225, 2, 155, 143, 144, 228, 114, 73, 201, 171, 37, 107, 53], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 224, 205, 208, 98, 230, 234, 242, 66, 149, 173, 76, 207, 196, 29, 70, 9], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 255, 58, 225, 39, 112, 190, 162, 228, 141, 155, 222, 115, 133, 231, 162, 95], &[0, 0, 0, 0, 2, 0, 0, 0])]; -pub const _1: &[(&[u8], &[u8])] = &[(&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 2, 165, 193, 177, 154, 183, 160, 79, 83, 108, 81, 154, 202, 73, 131, 172], &[1, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 10, 152, 253, 190, 156, 230, 197, 88, 55, 87, 108, 96, 199, 175, 56, 80], &[16, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 128, 212, 30, 94, 22, 5, 103, 101, 188, 132, 97, 133, 16, 114, 201, 215], &[64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 138, 66, 243, 51, 35, 203, 92, 237, 59, 68, 221, 130, 95, 218, 159, 204], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 164, 71, 4, 181, 104, 210, 22, 103, 53, 106, 90, 5, 12, 17, 135, 70, 129, 228, 122, 25, 230, 178, 155, 10, 101, 185, 89, 23, 98, 206, 81, 67, 237, 48, 208, 38, 30, 93, 36, 163, 32, 23, 82, 80, 107, 32, 241, 92], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 29, 189, 125, 11, 86, 26, 65, 210, 60, 42, 70, 154, 212, 47, 189, 112, 213, 67, 139, 174, 130, 111, 111, 214, 7, 65, 49, 144, 195, 124, 54, 59], &[0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 100, 74, 81, 252, 33, 158, 145, 69, 184, 87, 123, 183, 118, 40, 118, 123, 28, 47, 115, 116, 142, 218, 139, 120, 139, 252, 102, 161, 181, 42, 32, 248], &[0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 165, 212, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 108, 221, 179, 103, 175, 189, 88, 59, 180, 143, 155, 189, 125, 91, 163, 177, 208, 115, 139, 72, 129, 177, 205, 221, 56, 22, 149, 38, 216, 21, 129, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 232, 139, 67, 253, 237, 99, 35, 239, 2, 255, 239, 251, 216, 196, 8, 70, 238, 9, 191, 49, 98, 113, 189, 34, 54, 150, 89, 201, 89, 221, 115, 58], &[0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 233, 103, 96, 210, 116, 101, 58, 57, 180, 41, 168, 126, 186, 174, 157, 58, 164, 253, 245, 139, 144, 150, 207, 11, 235, 199, 196, 229, 164, 194, 237, 141], &[0, 0, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0]), (&[58, 99, 111, 100, 101], &[]), (&[58, 101, 120, 116, 114, 105, 110, 115, 105, 99, 95, 105, 110, 100, 101, 120], &[0, 0, 0, 0]), (&[58, 104, 101, 97, 112, 112, 97, 103, 101, 115], &[8, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 11, 106, 69, 50, 30, 250, 233, 42, 234, 21, 224, 116, 14, 199, 175, 231], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 14, 160, 236, 172, 118, 69, 125, 15, 155, 57, 185, 129, 221, 16, 112, 18], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 19, 142, 113, 97, 36, 145, 25, 45, 104, 222, 171, 126, 111, 86, 63, 225], &[2, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 40, 220, 203, 85, 155, 149, 196, 1, 104, 161, 178, 105, 101, 129, 181, 167], &[0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[40, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[10, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[30, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[20, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[100, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[21, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[31, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[11, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[101, 0, 0, 0, 0, 0, 0, 0, 209, 7, 209, 7, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[41, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 80, 154, 155, 110, 250, 147, 245, 187, 131, 248, 88, 240, 186, 191, 211, 11], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 85, 121, 41, 127, 77, 251, 150, 9, 231, 228, 194, 235, 171, 156, 228, 10], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 86, 239, 98, 39, 206, 203, 47, 7, 39, 76, 176, 87, 45, 143, 164, 194], &[101, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 106, 147, 17, 38, 51, 187, 51, 84, 230, 121, 82, 252, 221, 116, 12, 213], &[31, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[149, 17, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 245, 1]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[125, 21, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 221, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 1, 21, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 1, 31, 0, 0, 0, 0, 0, 0, 0, 1, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 106, 99, 127, 98, 174, 42, 241, 199, 227, 30, 237, 126, 150, 190, 4, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[8, 11, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 189, 47, 11, 41, 160, 8, 163, 96, 9, 172, 68, 204, 160, 201, 105], &[101, 4, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 180, 154, 39, 56, 238, 179, 8, 150, 170, 203, 139, 63, 180, 100, 113, 189], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 194, 154, 3, 16, 225, 187, 69, 210, 12, 172, 231, 124, 203, 98, 201, 125], &[0, 225, 245, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 234, 7, 222, 43, 143, 1, 5, 22, 220, 163, 247, 239, 82, 247, 172, 90], &[4, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 247, 218, 208, 49, 115, 36, 174, 202, 232, 116, 75, 135, 252, 149, 242, 243], &[0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 244, 1, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 87, 200, 117, 228, 207, 247, 65, 72, 228, 98, 143, 38, 75, 151, 76, 128], &[214, 61, 165, 212, 232, 0, 0, 0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 227, 253, 141, 247, 41, 112, 188, 130, 229, 38, 126, 160, 30, 221, 217, 73], &[1]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 109, 123, 24, 86, 30, 19, 159, 228, 49, 200, 33, 139, 70, 205, 244, 47, 40, 190, 110, 43, 138, 12, 26, 121, 5, 219, 103, 1, 110, 91, 142, 123], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 238, 43, 102, 225, 142, 104, 190, 12, 183, 86, 115, 25, 37, 223, 229, 65, 253, 167, 152, 54, 57, 147, 167, 137, 80, 161, 2, 235, 195, 174, 40, 244], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 118, 56, 0, 163, 106, 153, 253, 252, 124, 16, 246, 65, 95, 110, 230], &[1, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 148, 80, 191, 164, 185, 106, 63, 167, 163, 200, 244, 13, 166, 191, 50, 225], &[0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 17, 218, 109, 31, 118, 29, 223, 155, 219, 76, 157, 110, 83, 3, 235, 212, 31, 97, 133, 141, 10, 86, 71, 161, 167, 191, 224, 137, 191, 146, 27, 233], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 123, 10, 161, 115, 94, 91, 165, 141, 50, 54, 49, 108, 103, 31, 228, 240, 14, 211, 102, 238, 114, 65, 124, 158, 208, 42, 83, 168, 1, 158, 133, 184], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 225, 44, 34, 212, 241, 98, 217, 160, 18, 201, 49, 146, 51, 218, 93, 62, 146, 60, 197, 225, 2, 155, 143, 144, 228, 114, 73, 201, 171, 37, 107, 53], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 224, 205, 208, 98, 230, 234, 242, 66, 149, 173, 76, 207, 196, 29, 70, 9], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 255, 58, 225, 39, 112, 190, 162, 228, 141, 155, 222, 115, 133, 231, 162, 95], &[0, 0, 0, 0, 3, 0, 0, 0]), (&[240, 195, 101, 195, 207, 89, 214, 113, 235, 114, 218, 14, 122, 65, 19, 196, 159, 31, 5, 21, 244, 98, 205, 207, 132, 224, 241, 214, 4, 93, 252, 187], &[232, 3, 0, 0, 0, 0, 0, 0])]; -pub const _2: &[(&[u8], &[u8])] = &[(&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 2, 165, 193, 177, 154, 183, 160, 79, 83, 108, 81, 154, 202, 73, 131, 172], &[2, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 10, 152, 253, 190, 156, 230, 197, 88, 55, 87, 108, 96, 199, 175, 56, 80], &[17, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 128, 212, 30, 94, 22, 5, 103, 101, 188, 132, 97, 133, 16, 114, 201, 215], &[68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 138, 66, 243, 51, 35, 203, 92, 237, 59, 68, 221, 130, 95, 218, 159, 204], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 164, 71, 4, 181, 104, 210, 22, 103, 53, 106, 90, 5, 12, 17, 135, 70, 129, 228, 122, 25, 230, 178, 155, 10, 101, 185, 89, 23, 98, 206, 81, 67, 237, 48, 208, 38, 30, 93, 36, 163, 32, 23, 82, 80, 107, 32, 241, 92], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 29, 189, 125, 11, 86, 26, 65, 210, 60, 42, 70, 154, 212, 47, 189, 112, 213, 67, 139, 174, 130, 111, 111, 214, 7, 65, 49, 144, 195, 124, 54, 59], &[0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 100, 74, 81, 252, 33, 158, 145, 69, 184, 87, 123, 183, 118, 40, 118, 123, 28, 47, 115, 116, 142, 218, 139, 120, 139, 252, 102, 161, 181, 42, 32, 248], &[0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 165, 212, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 108, 221, 179, 103, 175, 189, 88, 59, 180, 143, 155, 189, 125, 91, 163, 177, 208, 115, 139, 72, 129, 177, 205, 221, 56, 22, 149, 38, 216, 21, 129, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 232, 139, 67, 253, 237, 99, 35, 239, 2, 255, 239, 251, 216, 196, 8, 70, 238, 9, 191, 49, 98, 113, 189, 34, 54, 150, 89, 201, 89, 221, 115, 58], &[0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 233, 103, 96, 210, 116, 101, 58, 57, 180, 41, 168, 126, 186, 174, 157, 58, 164, 253, 245, 139, 144, 150, 207, 11, 235, 199, 196, 229, 164, 194, 237, 141], &[0, 0, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0]), (&[58, 99, 111, 100, 101], &[]), (&[58, 101, 120, 116, 114, 105, 110, 115, 105, 99, 95, 105, 110, 100, 101, 120], &[0, 0, 0, 0]), (&[58, 104, 101, 97, 112, 112, 97, 103, 101, 115], &[8, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 11, 106, 69, 50, 30, 250, 233, 42, 234, 21, 224, 116, 14, 199, 175, 231], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 14, 160, 236, 172, 118, 69, 125, 15, 155, 57, 185, 129, 221, 16, 112, 18], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 19, 142, 113, 97, 36, 145, 25, 45, 104, 222, 171, 126, 111, 86, 63, 225], &[2, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 40, 220, 203, 85, 155, 149, 196, 1, 104, 161, 178, 105, 101, 129, 181, 167], &[0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[40, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[10, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[30, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[20, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[100, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[21, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[31, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[11, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[101, 0, 0, 0, 0, 0, 0, 0, 209, 7, 209, 7, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[41, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 80, 154, 155, 110, 250, 147, 245, 187, 131, 248, 88, 240, 186, 191, 211, 11], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 85, 121, 41, 127, 77, 251, 150, 9, 231, 228, 194, 235, 171, 156, 228, 10], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 86, 239, 98, 39, 206, 203, 47, 7, 39, 76, 176, 87, 45, 143, 164, 194], &[101, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 106, 147, 17, 38, 51, 187, 51, 84, 230, 121, 82, 252, 221, 116, 12, 213], &[31, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[149, 17, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 245, 1]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[125, 21, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 221, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 1, 21, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 1, 31, 0, 0, 0, 0, 0, 0, 0, 1, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 106, 99, 127, 98, 174, 42, 241, 199, 227, 30, 237, 126, 150, 190, 4, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[8, 11, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 189, 47, 11, 41, 160, 8, 163, 96, 9, 172, 68, 204, 160, 201, 105], &[101, 4, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 180, 154, 39, 56, 238, 179, 8, 150, 170, 203, 139, 63, 180, 100, 113, 189], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 194, 154, 3, 16, 225, 187, 69, 210, 12, 172, 231, 124, 203, 98, 201, 125], &[0, 225, 245, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 234, 7, 222, 43, 143, 1, 5, 22, 220, 163, 247, 239, 82, 247, 172, 90], &[4, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 247, 218, 208, 49, 115, 36, 174, 202, 232, 116, 75, 135, 252, 149, 242, 243], &[0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 244, 1, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 87, 200, 117, 228, 207, 247, 65, 72, 228, 98, 143, 38, 75, 151, 76, 128], &[214, 61, 165, 212, 232, 0, 0, 0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 227, 253, 141, 247, 41, 112, 188, 130, 229, 38, 126, 160, 30, 221, 217, 73], &[1]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 109, 123, 24, 86, 30, 19, 159, 228, 49, 200, 33, 139, 70, 205, 244, 47, 40, 190, 110, 43, 138, 12, 26, 121, 5, 219, 103, 1, 110, 91, 142, 123], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 238, 43, 102, 225, 142, 104, 190, 12, 183, 86, 115, 25, 37, 223, 229, 65, 253, 167, 152, 54, 57, 147, 167, 137, 80, 161, 2, 235, 195, 174, 40, 244], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 118, 56, 0, 163, 106, 153, 253, 252, 124, 16, 246, 65, 95, 110, 230], &[2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 148, 80, 191, 164, 185, 106, 63, 167, 163, 200, 244, 13, 166, 191, 50, 225], &[0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 17, 218, 109, 31, 118, 29, 223, 155, 219, 76, 157, 110, 83, 3, 235, 212, 31, 97, 133, 141, 10, 86, 71, 161, 167, 191, 224, 137, 191, 146, 27, 233], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 123, 10, 161, 115, 94, 91, 165, 141, 50, 54, 49, 108, 103, 31, 228, 240, 14, 211, 102, 238, 114, 65, 124, 158, 208, 42, 83, 168, 1, 158, 133, 184], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 140, 3, 159, 247, 202, 161, 124, 206, 191, 202, 220, 68, 189, 159, 206, 106, 75, 102, 153, 196, 208, 61, 226, 227, 52, 154, 161, 220, 17, 25, 60, 215], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 225, 44, 34, 212, 241, 98, 217, 160, 18, 201, 49, 146, 51, 218, 93, 62, 146, 60, 197, 225, 2, 155, 143, 144, 228, 114, 73, 201, 171, 37, 107, 53], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 224, 205, 208, 98, 230, 234, 242, 66, 149, 173, 76, 207, 196, 29, 70, 9], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 255, 58, 225, 39, 112, 190, 162, 228, 141, 155, 222, 115, 133, 231, 162, 95], &[0, 0, 0, 0, 4, 0, 0, 0]), (&[240, 195, 101, 195, 207, 89, 214, 113, 235, 114, 218, 14, 122, 65, 19, 196, 159, 31, 5, 21, 244, 98, 205, 207, 132, 224, 241, 214, 4, 93, 252, 187], &[208, 7, 0, 0, 0, 0, 0, 0])]; -pub const _3: &[(&[u8], &[u8])] = &[(&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 2, 165, 193, 177, 154, 183, 160, 79, 83, 108, 81, 154, 202, 73, 131, 172], &[3, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 10, 152, 253, 190, 156, 230, 197, 88, 55, 87, 108, 96, 199, 175, 56, 80], &[19, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 128, 212, 30, 94, 22, 5, 103, 101, 188, 132, 97, 133, 16, 114, 201, 215], &[76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 138, 66, 243, 51, 35, 203, 92, 237, 59, 68, 221, 130, 95, 218, 159, 204], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 164, 71, 4, 181, 104, 210, 22, 103, 53, 106, 90, 5, 12, 17, 135, 70, 129, 228, 122, 25, 230, 178, 155, 10, 101, 185, 89, 23, 98, 206, 81, 67, 237, 48, 208, 38, 30, 93, 36, 163, 32, 23, 82, 80, 107, 32, 241, 92], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 29, 189, 125, 11, 86, 26, 65, 210, 60, 42, 70, 154, 212, 47, 189, 112, 213, 67, 139, 174, 130, 111, 111, 214, 7, 65, 49, 144, 195, 124, 54, 59], &[0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 100, 74, 81, 252, 33, 158, 145, 69, 184, 87, 123, 183, 118, 40, 118, 123, 28, 47, 115, 116, 142, 218, 139, 120, 139, 252, 102, 161, 181, 42, 32, 248], &[0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 165, 212, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 108, 221, 179, 103, 175, 189, 88, 59, 180, 143, 155, 189, 125, 91, 163, 177, 208, 115, 139, 72, 129, 177, 205, 221, 56, 22, 149, 38, 216, 21, 129, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 232, 139, 67, 253, 237, 99, 35, 239, 2, 255, 239, 251, 216, 196, 8, 70, 238, 9, 191, 49, 98, 113, 189, 34, 54, 150, 89, 201, 89, 221, 115, 58], &[0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 233, 103, 96, 210, 116, 101, 58, 57, 180, 41, 168, 126, 186, 174, 157, 58, 164, 253, 245, 139, 144, 150, 207, 11, 235, 199, 196, 229, 164, 194, 237, 141], &[0, 0, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0]), (&[58, 99, 111, 100, 101], &[]), (&[58, 101, 120, 116, 114, 105, 110, 115, 105, 99, 95, 105, 110, 100, 101, 120], &[0, 0, 0, 0]), (&[58, 104, 101, 97, 112, 112, 97, 103, 101, 115], &[8, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 11, 106, 69, 50, 30, 250, 233, 42, 234, 21, 224, 116, 14, 199, 175, 231], &[1, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 14, 160, 236, 172, 118, 69, 125, 15, 155, 57, 185, 129, 221, 16, 112, 18], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 19, 142, 113, 97, 36, 145, 25, 45, 104, 222, 171, 126, 111, 86, 63, 225], &[2, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 40, 220, 203, 85, 155, 149, 196, 1, 104, 161, 178, 105, 101, 129, 181, 167], &[0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[40, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[10, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[30, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[20, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[100, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[21, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[31, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[11, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[101, 0, 0, 0, 0, 0, 0, 0, 209, 7, 209, 7, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[41, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 80, 154, 155, 110, 250, 147, 245, 187, 131, 248, 88, 240, 186, 191, 211, 11], &[3, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 85, 121, 41, 127, 77, 251, 150, 9, 231, 228, 194, 235, 171, 156, 228, 10], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 86, 239, 98, 39, 206, 203, 47, 7, 39, 76, 176, 87, 45, 143, 164, 194], &[101, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 106, 147, 17, 38, 51, 187, 51, 84, 230, 121, 82, 252, 221, 116, 12, 213], &[31, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[149, 17, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 245, 1]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[125, 21, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 221, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 1, 21, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 1, 31, 0, 0, 0, 0, 0, 0, 0, 1, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 106, 99, 127, 98, 174, 42, 241, 199, 227, 30, 237, 126, 150, 190, 4, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[8, 11, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 189, 47, 11, 41, 160, 8, 163, 96, 9, 172, 68, 204, 160, 201, 105], &[101, 4, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 166, 97, 104, 247, 231, 37, 155, 102, 112, 160, 111, 37, 101, 227, 229, 242], &[184, 11, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 180, 154, 39, 56, 238, 179, 8, 150, 170, 203, 139, 63, 180, 100, 113, 189], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 194, 154, 3, 16, 225, 187, 69, 210, 12, 172, 231, 124, 203, 98, 201, 125], &[0, 225, 245, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 234, 7, 222, 43, 143, 1, 5, 22, 220, 163, 247, 239, 82, 247, 172, 90], &[8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 247, 218, 208, 49, 115, 36, 174, 202, 232, 116, 75, 135, 252, 149, 242, 243], &[0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 244, 1, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 87, 200, 117, 228, 207, 247, 65, 72, 228, 98, 143, 38, 75, 151, 76, 128], &[214, 61, 165, 212, 232, 0, 0, 0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 227, 253, 141, 247, 41, 112, 188, 130, 229, 38, 126, 160, 30, 221, 217, 73], &[1]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 109, 123, 24, 86, 30, 19, 159, 228, 49, 200, 33, 139, 70, 205, 244, 47, 40, 190, 110, 43, 138, 12, 26, 121, 5, 219, 103, 1, 110, 91, 142, 123], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 238, 43, 102, 225, 142, 104, 190, 12, 183, 86, 115, 25, 37, 223, 229, 65, 253, 167, 152, 54, 57, 147, 167, 137, 80, 161, 2, 235, 195, 174, 40, 244], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 118, 56, 0, 163, 106, 153, 253, 252, 124, 16, 246, 65, 95, 110, 230], &[3, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 148, 80, 191, 164, 185, 106, 63, 167, 163, 200, 244, 13, 166, 191, 50, 225], &[1]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 17, 218, 109, 31, 118, 29, 223, 155, 219, 76, 157, 110, 83, 3, 235, 212, 31, 97, 133, 141, 10, 86, 71, 161, 167, 191, 224, 137, 191, 146, 27, 233], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 38, 160, 142, 77, 12, 81, 144, 240, 24, 113, 224, 86, 155, 98, 144, 184, 103, 96, 8, 93, 153, 241, 126, 180, 231, 230, 181, 143, 235, 141, 98, 73], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 123, 10, 161, 115, 94, 91, 165, 141, 50, 54, 49, 108, 103, 31, 228, 240, 14, 211, 102, 238, 114, 65, 124, 158, 208, 42, 83, 168, 1, 158, 133, 184], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 140, 3, 159, 247, 202, 161, 124, 206, 191, 202, 220, 68, 189, 159, 206, 106, 75, 102, 153, 196, 208, 61, 226, 227, 52, 154, 161, 220, 17, 25, 60, 215], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 225, 44, 34, 212, 241, 98, 217, 160, 18, 201, 49, 146, 51, 218, 93, 62, 146, 60, 197, 225, 2, 155, 143, 144, 228, 114, 73, 201, 171, 37, 107, 53], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 224, 205, 208, 98, 230, 234, 242, 66, 149, 173, 76, 207, 196, 29, 70, 9], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 255, 58, 225, 39, 112, 190, 162, 228, 141, 155, 222, 115, 133, 231, 162, 95], &[0, 0, 0, 0, 5, 0, 0, 0]), (&[240, 195, 101, 195, 207, 89, 214, 113, 235, 114, 218, 14, 122, 65, 19, 196, 159, 31, 5, 21, 244, 98, 205, 207, 132, 224, 241, 214, 4, 93, 252, 187], &[184, 11, 0, 0, 0, 0, 0, 0])]; -pub const _4: &[(&[u8], &[u8])] = &[(&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 2, 165, 193, 177, 154, 183, 160, 79, 83, 108, 81, 154, 202, 73, 131, 172], &[4, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 10, 152, 253, 190, 156, 230, 197, 88, 55, 87, 108, 96, 199, 175, 56, 80], &[20, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 128, 212, 30, 94, 22, 5, 103, 101, 188, 132, 97, 133, 16, 114, 201, 215], &[80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 138, 66, 243, 51, 35, 203, 92, 237, 59, 68, 221, 130, 95, 218, 159, 204], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 164, 71, 4, 181, 104, 210, 22, 103, 53, 106, 90, 5, 12, 17, 135, 70, 129, 228, 122, 25, 230, 178, 155, 10, 101, 185, 89, 23, 98, 206, 81, 67, 237, 48, 208, 38, 30, 93, 36, 163, 32, 23, 82, 80, 107, 32, 241, 92], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 29, 189, 125, 11, 86, 26, 65, 210, 60, 42, 70, 154, 212, 47, 189, 112, 213, 67, 139, 174, 130, 111, 111, 214, 7, 65, 49, 144, 195, 124, 54, 59], &[0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 100, 74, 81, 252, 33, 158, 145, 69, 184, 87, 123, 183, 118, 40, 118, 123, 28, 47, 115, 116, 142, 218, 139, 120, 139, 252, 102, 161, 181, 42, 32, 248], &[0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 165, 212, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 108, 221, 179, 103, 175, 189, 88, 59, 180, 143, 155, 189, 125, 91, 163, 177, 208, 115, 139, 72, 129, 177, 205, 221, 56, 22, 149, 38, 216, 21, 129, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 232, 139, 67, 253, 237, 99, 35, 239, 2, 255, 239, 251, 216, 196, 8, 70, 238, 9, 191, 49, 98, 113, 189, 34, 54, 150, 89, 201, 89, 221, 115, 58], &[0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 233, 103, 96, 210, 116, 101, 58, 57, 180, 41, 168, 126, 186, 174, 157, 58, 164, 253, 245, 139, 144, 150, 207, 11, 235, 199, 196, 229, 164, 194, 237, 141], &[0, 0, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0]), (&[58, 99, 111, 100, 101], &[]), (&[58, 101, 120, 116, 114, 105, 110, 115, 105, 99, 95, 105, 110, 100, 101, 120], &[0, 0, 0, 0]), (&[58, 104, 101, 97, 112, 112, 97, 103, 101, 115], &[8, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 11, 106, 69, 50, 30, 250, 233, 42, 234, 21, 224, 116, 14, 199, 175, 231], &[1, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 14, 160, 236, 172, 118, 69, 125, 15, 155, 57, 185, 129, 221, 16, 112, 18], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 19, 142, 113, 97, 36, 145, 25, 45, 104, 222, 171, 126, 111, 86, 63, 225], &[2, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 40, 220, 203, 85, 155, 149, 196, 1, 104, 161, 178, 105, 101, 129, 181, 167], &[0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[40, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[10, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[30, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[20, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[100, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[21, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[31, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[11, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[101, 0, 0, 0, 0, 0, 0, 0, 209, 7, 209, 7, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[41, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 80, 154, 155, 110, 250, 147, 245, 187, 131, 248, 88, 240, 186, 191, 211, 11], &[3, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 85, 121, 41, 127, 77, 251, 150, 9, 231, 228, 194, 235, 171, 156, 228, 10], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 86, 239, 98, 39, 206, 203, 47, 7, 39, 76, 176, 87, 45, 143, 164, 194], &[101, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 106, 147, 17, 38, 51, 187, 51, 84, 230, 121, 82, 252, 221, 116, 12, 213], &[31, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[149, 17, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 245, 1]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[125, 21, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 221, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 1, 21, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 1, 31, 0, 0, 0, 0, 0, 0, 0, 1, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 106, 99, 127, 98, 174, 42, 241, 199, 227, 30, 237, 126, 150, 190, 4, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[8, 11, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 189, 47, 11, 41, 160, 8, 163, 96, 9, 172, 68, 204, 160, 201, 105], &[101, 4, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 166, 97, 104, 247, 231, 37, 155, 102, 112, 160, 111, 37, 101, 227, 229, 242], &[184, 11, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 180, 154, 39, 56, 238, 179, 8, 150, 170, 203, 139, 63, 180, 100, 113, 189], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 194, 154, 3, 16, 225, 187, 69, 210, 12, 172, 231, 124, 203, 98, 201, 125], &[0, 225, 245, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 234, 7, 222, 43, 143, 1, 5, 22, 220, 163, 247, 239, 82, 247, 172, 90], &[8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 247, 218, 208, 49, 115, 36, 174, 202, 232, 116, 75, 135, 252, 149, 242, 243], &[0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 244, 1, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 87, 200, 117, 228, 207, 247, 65, 72, 228, 98, 143, 38, 75, 151, 76, 128], &[214, 61, 165, 212, 232, 0, 0, 0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 227, 253, 141, 247, 41, 112, 188, 130, 229, 38, 126, 160, 30, 221, 217, 73], &[1]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 109, 123, 24, 86, 30, 19, 159, 228, 49, 200, 33, 139, 70, 205, 244, 47, 40, 190, 110, 43, 138, 12, 26, 121, 5, 219, 103, 1, 110, 91, 142, 123], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 238, 43, 102, 225, 142, 104, 190, 12, 183, 86, 115, 25, 37, 223, 229, 65, 253, 167, 152, 54, 57, 147, 167, 137, 80, 161, 2, 235, 195, 174, 40, 244], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 118, 56, 0, 163, 106, 153, 253, 252, 124, 16, 246, 65, 95, 110, 230], &[4, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 148, 80, 191, 164, 185, 106, 63, 167, 163, 200, 244, 13, 166, 191, 50, 225], &[0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 17, 218, 109, 31, 118, 29, 223, 155, 219, 76, 157, 110, 83, 3, 235, 212, 31, 97, 133, 141, 10, 86, 71, 161, 167, 191, 224, 137, 191, 146, 27, 233], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 38, 160, 142, 77, 12, 81, 144, 240, 24, 113, 224, 86, 155, 98, 144, 184, 103, 96, 8, 93, 153, 241, 126, 180, 231, 230, 181, 143, 235, 141, 98, 73], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 123, 10, 161, 115, 94, 91, 165, 141, 50, 54, 49, 108, 103, 31, 228, 240, 14, 211, 102, 238, 114, 65, 124, 158, 208, 42, 83, 168, 1, 158, 133, 184], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 140, 3, 159, 247, 202, 161, 124, 206, 191, 202, 220, 68, 189, 159, 206, 106, 75, 102, 153, 196, 208, 61, 226, 227, 52, 154, 161, 220, 17, 25, 60, 215], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 140, 53, 210, 47, 69, 157, 119, 202, 76, 11, 11, 80, 53, 134, 151, 102, 214, 13, 24, 43, 151, 22, 171, 62, 136, 121, 224, 102, 71, 136, 153, 168], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 225, 44, 34, 212, 241, 98, 217, 160, 18, 201, 49, 146, 51, 218, 93, 62, 146, 60, 197, 225, 2, 155, 143, 144, 228, 114, 73, 201, 171, 37, 107, 53], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 224, 205, 208, 98, 230, 234, 242, 66, 149, 173, 76, 207, 196, 29, 70, 9], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 255, 58, 225, 39, 112, 190, 162, 228, 141, 155, 222, 115, 133, 231, 162, 95], &[0, 0, 0, 0, 6, 0, 0, 0]), (&[240, 195, 101, 195, 207, 89, 214, 113, 235, 114, 218, 14, 122, 65, 19, 196, 159, 31, 5, 21, 244, 98, 205, 207, 132, 224, 241, 214, 4, 93, 252, 187], &[160, 15, 0, 0, 0, 0, 0, 0])]; -pub const _5: &[(&[u8], &[u8])] = &[(&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 2, 165, 193, 177, 154, 183, 160, 79, 83, 108, 81, 154, 202, 73, 131, 172], &[5, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 10, 152, 253, 190, 156, 230, 197, 88, 55, 87, 108, 96, 199, 175, 56, 80], &[21, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 128, 212, 30, 94, 22, 5, 103, 101, 188, 132, 97, 133, 16, 114, 201, 215], &[84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 138, 66, 243, 51, 35, 203, 92, 237, 59, 68, 221, 130, 95, 218, 159, 204], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 164, 71, 4, 181, 104, 210, 22, 103, 53, 106, 90, 5, 12, 17, 135, 70, 129, 228, 122, 25, 230, 178, 155, 10, 101, 185, 89, 23, 98, 206, 81, 67, 237, 48, 208, 38, 30, 93, 36, 163, 32, 23, 82, 80, 107, 32, 241, 92], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 29, 189, 125, 11, 86, 26, 65, 210, 60, 42, 70, 154, 212, 47, 189, 112, 213, 67, 139, 174, 130, 111, 111, 214, 7, 65, 49, 144, 195, 124, 54, 59], &[0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 100, 74, 81, 252, 33, 158, 145, 69, 184, 87, 123, 183, 118, 40, 118, 123, 28, 47, 115, 116, 142, 218, 139, 120, 139, 252, 102, 161, 181, 42, 32, 248], &[0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 165, 212, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 108, 221, 179, 103, 175, 189, 88, 59, 180, 143, 155, 189, 125, 91, 163, 177, 208, 115, 139, 72, 129, 177, 205, 221, 56, 22, 149, 38, 216, 21, 129, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 232, 139, 67, 253, 237, 99, 35, 239, 2, 255, 239, 251, 216, 196, 8, 70, 238, 9, 191, 49, 98, 113, 189, 34, 54, 150, 89, 201, 89, 221, 115, 58], &[0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 233, 103, 96, 210, 116, 101, 58, 57, 180, 41, 168, 126, 186, 174, 157, 58, 164, 253, 245, 139, 144, 150, 207, 11, 235, 199, 196, 229, 164, 194, 237, 141], &[0, 0, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0]), (&[58, 99, 111, 100, 101], &[]), (&[58, 101, 120, 116, 114, 105, 110, 115, 105, 99, 95, 105, 110, 100, 101, 120], &[0, 0, 0, 0]), (&[58, 104, 101, 97, 112, 112, 97, 103, 101, 115], &[8, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 11, 106, 69, 50, 30, 250, 233, 42, 234, 21, 224, 116, 14, 199, 175, 231], &[1, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 14, 160, 236, 172, 118, 69, 125, 15, 155, 57, 185, 129, 221, 16, 112, 18], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 19, 142, 113, 97, 36, 145, 25, 45, 104, 222, 171, 126, 111, 86, 63, 225], &[2, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 40, 220, 203, 85, 155, 149, 196, 1, 104, 161, 178, 105, 101, 129, 181, 167], &[0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[40, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[10, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[30, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[20, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[100, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[21, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[31, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[11, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[101, 0, 0, 0, 0, 0, 0, 0, 209, 7, 209, 7, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[41, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 80, 154, 155, 110, 250, 147, 245, 187, 131, 248, 88, 240, 186, 191, 211, 11], &[3, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 85, 121, 41, 127, 77, 251, 150, 9, 231, 228, 194, 235, 171, 156, 228, 10], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 86, 239, 98, 39, 206, 203, 47, 7, 39, 76, 176, 87, 45, 143, 164, 194], &[101, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 106, 147, 17, 38, 51, 187, 51, 84, 230, 121, 82, 252, 221, 116, 12, 213], &[31, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[149, 17, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 245, 1]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[125, 21, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 221, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 1, 21, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 1, 31, 0, 0, 0, 0, 0, 0, 0, 1, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 106, 99, 127, 98, 174, 42, 241, 199, 227, 30, 237, 126, 150, 190, 4, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[8, 11, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 189, 47, 11, 41, 160, 8, 163, 96, 9, 172, 68, 204, 160, 201, 105], &[101, 4, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 166, 97, 104, 247, 231, 37, 155, 102, 112, 160, 111, 37, 101, 227, 229, 242], &[184, 11, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 180, 154, 39, 56, 238, 179, 8, 150, 170, 203, 139, 63, 180, 100, 113, 189], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 194, 154, 3, 16, 225, 187, 69, 210, 12, 172, 231, 124, 203, 98, 201, 125], &[0, 225, 245, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 234, 7, 222, 43, 143, 1, 5, 22, 220, 163, 247, 239, 82, 247, 172, 90], &[8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 247, 218, 208, 49, 115, 36, 174, 202, 232, 116, 75, 135, 252, 149, 242, 243], &[0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 244, 1, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 87, 200, 117, 228, 207, 247, 65, 72, 228, 98, 143, 38, 75, 151, 76, 128], &[214, 61, 165, 212, 232, 0, 0, 0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 227, 253, 141, 247, 41, 112, 188, 130, 229, 38, 126, 160, 30, 221, 217, 73], &[1]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 109, 123, 24, 86, 30, 19, 159, 228, 49, 200, 33, 139, 70, 205, 244, 47, 40, 190, 110, 43, 138, 12, 26, 121, 5, 219, 103, 1, 110, 91, 142, 123], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 238, 43, 102, 225, 142, 104, 190, 12, 183, 86, 115, 25, 37, 223, 229, 65, 253, 167, 152, 54, 57, 147, 167, 137, 80, 161, 2, 235, 195, 174, 40, 244], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 118, 56, 0, 163, 106, 153, 253, 252, 124, 16, 246, 65, 95, 110, 230], &[5, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 148, 80, 191, 164, 185, 106, 63, 167, 163, 200, 244, 13, 166, 191, 50, 225], &[0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 17, 218, 109, 31, 118, 29, 223, 155, 219, 76, 157, 110, 83, 3, 235, 212, 31, 97, 133, 141, 10, 86, 71, 161, 167, 191, 224, 137, 191, 146, 27, 233], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 38, 160, 142, 77, 12, 81, 144, 240, 24, 113, 224, 86, 155, 98, 144, 184, 103, 96, 8, 93, 153, 241, 126, 180, 231, 230, 181, 143, 235, 141, 98, 73], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 123, 10, 161, 115, 94, 91, 165, 141, 50, 54, 49, 108, 103, 31, 228, 240, 14, 211, 102, 238, 114, 65, 124, 158, 208, 42, 83, 168, 1, 158, 133, 184], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 140, 3, 159, 247, 202, 161, 124, 206, 191, 202, 220, 68, 189, 159, 206, 106, 75, 102, 153, 196, 208, 61, 226, 227, 52, 154, 161, 220, 17, 25, 60, 215], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 140, 53, 210, 47, 69, 157, 119, 202, 76, 11, 11, 80, 53, 134, 151, 102, 214, 13, 24, 43, 151, 22, 171, 62, 136, 121, 224, 102, 71, 136, 153, 168], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 225, 44, 34, 212, 241, 98, 217, 160, 18, 201, 49, 146, 51, 218, 93, 62, 146, 60, 197, 225, 2, 155, 143, 144, 228, 114, 73, 201, 171, 37, 107, 53], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 244, 170, 194, 251, 227, 63, 3, 85, 75, 254, 181, 89, 234, 38, 144, 237, 133, 33, 202, 164, 190, 150, 30, 97, 201, 26, 201, 161, 83, 13, 206, 122], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 224, 205, 208, 98, 230, 234, 242, 66, 149, 173, 76, 207, 196, 29, 70, 9], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 255, 58, 225, 39, 112, 190, 162, 228, 141, 155, 222, 115, 133, 231, 162, 95], &[0, 0, 0, 0, 7, 0, 0, 0]), (&[240, 195, 101, 195, 207, 89, 214, 113, 235, 114, 218, 14, 122, 65, 19, 196, 159, 31, 5, 21, 244, 98, 205, 207, 132, 224, 241, 214, 4, 93, 252, 187], &[136, 19, 0, 0, 0, 0, 0, 0])]; -pub const _6: &[(&[u8], &[u8])] = &[(&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 2, 165, 193, 177, 154, 183, 160, 79, 83, 108, 81, 154, 202, 73, 131, 172], &[6, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 10, 152, 253, 190, 156, 230, 197, 88, 55, 87, 108, 96, 199, 175, 56, 80], &[23, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 128, 212, 30, 94, 22, 5, 103, 101, 188, 132, 97, 133, 16, 114, 201, 215], &[92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 138, 66, 243, 51, 35, 203, 92, 237, 59, 68, 221, 130, 95, 218, 159, 204], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 164, 71, 4, 181, 104, 210, 22, 103, 53, 106, 90, 5, 12, 17, 135, 70, 129, 228, 122, 25, 230, 178, 155, 10, 101, 185, 89, 23, 98, 206, 81, 67, 237, 48, 208, 38, 30, 93, 36, 163, 32, 23, 82, 80, 107, 32, 241, 92], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 29, 189, 125, 11, 86, 26, 65, 210, 60, 42, 70, 154, 212, 47, 189, 112, 213, 67, 139, 174, 130, 111, 111, 214, 7, 65, 49, 144, 195, 124, 54, 59], &[0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 100, 74, 81, 252, 33, 158, 145, 69, 184, 87, 123, 183, 118, 40, 118, 123, 28, 47, 115, 116, 142, 218, 139, 120, 139, 252, 102, 161, 181, 42, 32, 248], &[0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 165, 212, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 108, 221, 179, 103, 175, 189, 88, 59, 180, 143, 155, 189, 125, 91, 163, 177, 208, 115, 139, 72, 129, 177, 205, 221, 56, 22, 149, 38, 216, 21, 129, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 232, 139, 67, 253, 237, 99, 35, 239, 2, 255, 239, 251, 216, 196, 8, 70, 238, 9, 191, 49, 98, 113, 189, 34, 54, 150, 89, 201, 89, 221, 115, 58], &[0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 233, 103, 96, 210, 116, 101, 58, 57, 180, 41, 168, 126, 186, 174, 157, 58, 164, 253, 245, 139, 144, 150, 207, 11, 235, 199, 196, 229, 164, 194, 237, 141], &[0, 0, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0]), (&[58, 99, 111, 100, 101], &[]), (&[58, 101, 120, 116, 114, 105, 110, 115, 105, 99, 95, 105, 110, 100, 101, 120], &[0, 0, 0, 0]), (&[58, 104, 101, 97, 112, 112, 97, 103, 101, 115], &[8, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 11, 106, 69, 50, 30, 250, 233, 42, 234, 21, 224, 116, 14, 199, 175, 231], &[2, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 14, 160, 236, 172, 118, 69, 125, 15, 155, 57, 185, 129, 221, 16, 112, 18], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 19, 142, 113, 97, 36, 145, 25, 45, 104, 222, 171, 126, 111, 86, 63, 225], &[2, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 40, 220, 203, 85, 155, 149, 196, 1, 104, 161, 178, 105, 101, 129, 181, 167], &[0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[40, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[10, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[30, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[20, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[100, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[21, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[31, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[11, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[101, 0, 0, 0, 0, 0, 0, 0, 209, 7, 209, 7, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[41, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 80, 154, 155, 110, 250, 147, 245, 187, 131, 248, 88, 240, 186, 191, 211, 11], &[6, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 85, 121, 41, 127, 77, 251, 150, 9, 231, 228, 194, 235, 171, 156, 228, 10], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 86, 239, 98, 39, 206, 203, 47, 7, 39, 76, 176, 87, 45, 143, 164, 194], &[101, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 106, 147, 17, 38, 51, 187, 51, 84, 230, 121, 82, 252, 221, 116, 12, 213], &[31, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[149, 17, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 245, 1]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[125, 21, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 221, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 1, 21, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 1, 31, 0, 0, 0, 0, 0, 0, 0, 1, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 106, 99, 127, 98, 174, 42, 241, 199, 227, 30, 237, 126, 150, 190, 4, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[8, 11, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 189, 47, 11, 41, 160, 8, 163, 96, 9, 172, 68, 204, 160, 201, 105], &[101, 4, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 166, 97, 104, 247, 231, 37, 155, 102, 112, 160, 111, 37, 101, 227, 229, 242], &[112, 23, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 180, 154, 39, 56, 238, 179, 8, 150, 170, 203, 139, 63, 180, 100, 113, 189], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 194, 154, 3, 16, 225, 187, 69, 210, 12, 172, 231, 124, 203, 98, 201, 125], &[0, 225, 245, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 234, 7, 222, 43, 143, 1, 5, 22, 220, 163, 247, 239, 82, 247, 172, 90], &[12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 247, 218, 208, 49, 115, 36, 174, 202, 232, 116, 75, 135, 252, 149, 242, 243], &[0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 244, 1, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 87, 200, 117, 228, 207, 247, 65, 72, 228, 98, 143, 38, 75, 151, 76, 128], &[214, 61, 165, 212, 232, 0, 0, 0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 227, 253, 141, 247, 41, 112, 188, 130, 229, 38, 126, 160, 30, 221, 217, 73], &[1]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 109, 123, 24, 86, 30, 19, 159, 228, 49, 200, 33, 139, 70, 205, 244, 47, 40, 190, 110, 43, 138, 12, 26, 121, 5, 219, 103, 1, 110, 91, 142, 123], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 238, 43, 102, 225, 142, 104, 190, 12, 183, 86, 115, 25, 37, 223, 229, 65, 253, 167, 152, 54, 57, 147, 167, 137, 80, 161, 2, 235, 195, 174, 40, 244], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 118, 56, 0, 163, 106, 153, 253, 252, 124, 16, 246, 65, 95, 110, 230], &[6, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 148, 80, 191, 164, 185, 106, 63, 167, 163, 200, 244, 13, 166, 191, 50, 225], &[1]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 17, 218, 109, 31, 118, 29, 223, 155, 219, 76, 157, 110, 83, 3, 235, 212, 31, 97, 133, 141, 10, 86, 71, 161, 167, 191, 224, 137, 191, 146, 27, 233], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 38, 160, 142, 77, 12, 81, 144, 240, 24, 113, 224, 86, 155, 98, 144, 184, 103, 96, 8, 93, 153, 241, 126, 180, 231, 230, 181, 143, 235, 141, 98, 73], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 91, 143, 41, 219, 118, 207, 78, 103, 110, 79, 201, 177, 112, 64, 49, 45, 235, 237, 175, 205, 86, 55, 251, 60, 123, 173, 210, 205, 220, 230, 164, 69], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 123, 10, 161, 115, 94, 91, 165, 141, 50, 54, 49, 108, 103, 31, 228, 240, 14, 211, 102, 238, 114, 65, 124, 158, 208, 42, 83, 168, 1, 158, 133, 184], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 140, 3, 159, 247, 202, 161, 124, 206, 191, 202, 220, 68, 189, 159, 206, 106, 75, 102, 153, 196, 208, 61, 226, 227, 52, 154, 161, 220, 17, 25, 60, 215], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 140, 53, 210, 47, 69, 157, 119, 202, 76, 11, 11, 80, 53, 134, 151, 102, 214, 13, 24, 43, 151, 22, 171, 62, 136, 121, 224, 102, 71, 136, 153, 168], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 225, 44, 34, 212, 241, 98, 217, 160, 18, 201, 49, 146, 51, 218, 93, 62, 146, 60, 197, 225, 2, 155, 143, 144, 228, 114, 73, 201, 171, 37, 107, 53], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 244, 170, 194, 251, 227, 63, 3, 85, 75, 254, 181, 89, 234, 38, 144, 237, 133, 33, 202, 164, 190, 150, 30, 97, 201, 26, 201, 161, 83, 13, 206, 122], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 224, 205, 208, 98, 230, 234, 242, 66, 149, 173, 76, 207, 196, 29, 70, 9], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 255, 58, 225, 39, 112, 190, 162, 228, 141, 155, 222, 115, 133, 231, 162, 95], &[0, 0, 0, 0, 8, 0, 0, 0]), (&[240, 195, 101, 195, 207, 89, 214, 113, 235, 114, 218, 14, 122, 65, 19, 196, 159, 31, 5, 21, 244, 98, 205, 207, 132, 224, 241, 214, 4, 93, 252, 187], &[112, 23, 0, 0, 0, 0, 0, 0])]; -pub const _7: &[(&[u8], &[u8])] = &[(&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 2, 165, 193, 177, 154, 183, 160, 79, 83, 108, 81, 154, 202, 73, 131, 172], &[7, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 10, 152, 253, 190, 156, 230, 197, 88, 55, 87, 108, 96, 199, 175, 56, 80], &[24, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 128, 212, 30, 94, 22, 5, 103, 101, 188, 132, 97, 133, 16, 114, 201, 215], &[96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 138, 66, 243, 51, 35, 203, 92, 237, 59, 68, 221, 130, 95, 218, 159, 204], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 164, 71, 4, 181, 104, 210, 22, 103, 53, 106, 90, 5, 12, 17, 135, 70, 129, 228, 122, 25, 230, 178, 155, 10, 101, 185, 89, 23, 98, 206, 81, 67, 237, 48, 208, 38, 30, 93, 36, 163, 32, 23, 82, 80, 107, 32, 241, 92], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 29, 189, 125, 11, 86, 26, 65, 210, 60, 42, 70, 154, 212, 47, 189, 112, 213, 67, 139, 174, 130, 111, 111, 214, 7, 65, 49, 144, 195, 124, 54, 59], &[0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 100, 74, 81, 252, 33, 158, 145, 69, 184, 87, 123, 183, 118, 40, 118, 123, 28, 47, 115, 116, 142, 218, 139, 120, 139, 252, 102, 161, 181, 42, 32, 248], &[0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 165, 212, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 108, 221, 179, 103, 175, 189, 88, 59, 180, 143, 155, 189, 125, 91, 163, 177, 208, 115, 139, 72, 129, 177, 205, 221, 56, 22, 149, 38, 216, 21, 129, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 232, 139, 67, 253, 237, 99, 35, 239, 2, 255, 239, 251, 216, 196, 8, 70, 238, 9, 191, 49, 98, 113, 189, 34, 54, 150, 89, 201, 89, 221, 115, 58], &[0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 233, 103, 96, 210, 116, 101, 58, 57, 180, 41, 168, 126, 186, 174, 157, 58, 164, 253, 245, 139, 144, 150, 207, 11, 235, 199, 196, 229, 164, 194, 237, 141], &[0, 0, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0]), (&[58, 99, 111, 100, 101], &[]), (&[58, 101, 120, 116, 114, 105, 110, 115, 105, 99, 95, 105, 110, 100, 101, 120], &[0, 0, 0, 0]), (&[58, 104, 101, 97, 112, 112, 97, 103, 101, 115], &[8, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 11, 106, 69, 50, 30, 250, 233, 42, 234, 21, 224, 116, 14, 199, 175, 231], &[2, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 14, 160, 236, 172, 118, 69, 125, 15, 155, 57, 185, 129, 221, 16, 112, 18], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 19, 142, 113, 97, 36, 145, 25, 45, 104, 222, 171, 126, 111, 86, 63, 225], &[2, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 40, 220, 203, 85, 155, 149, 196, 1, 104, 161, 178, 105, 101, 129, 181, 167], &[0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[40, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[10, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[30, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[20, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[100, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[21, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[31, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[11, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[101, 0, 0, 0, 0, 0, 0, 0, 209, 7, 209, 7, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[41, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 80, 154, 155, 110, 250, 147, 245, 187, 131, 248, 88, 240, 186, 191, 211, 11], &[6, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 85, 121, 41, 127, 77, 251, 150, 9, 231, 228, 194, 235, 171, 156, 228, 10], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 86, 239, 98, 39, 206, 203, 47, 7, 39, 76, 176, 87, 45, 143, 164, 194], &[101, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 106, 147, 17, 38, 51, 187, 51, 84, 230, 121, 82, 252, 221, 116, 12, 213], &[31, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[149, 17, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 245, 1]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[125, 21, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 221, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 1, 21, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 1, 31, 0, 0, 0, 0, 0, 0, 0, 1, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 106, 99, 127, 98, 174, 42, 241, 199, 227, 30, 237, 126, 150, 190, 4, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[8, 11, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 189, 47, 11, 41, 160, 8, 163, 96, 9, 172, 68, 204, 160, 201, 105], &[101, 4, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 166, 97, 104, 247, 231, 37, 155, 102, 112, 160, 111, 37, 101, 227, 229, 242], &[112, 23, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 180, 154, 39, 56, 238, 179, 8, 150, 170, 203, 139, 63, 180, 100, 113, 189], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 194, 154, 3, 16, 225, 187, 69, 210, 12, 172, 231, 124, 203, 98, 201, 125], &[0, 225, 245, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 234, 7, 222, 43, 143, 1, 5, 22, 220, 163, 247, 239, 82, 247, 172, 90], &[12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 247, 218, 208, 49, 115, 36, 174, 202, 232, 116, 75, 135, 252, 149, 242, 243], &[0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 244, 1, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 87, 200, 117, 228, 207, 247, 65, 72, 228, 98, 143, 38, 75, 151, 76, 128], &[214, 61, 165, 212, 232, 0, 0, 0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 227, 253, 141, 247, 41, 112, 188, 130, 229, 38, 126, 160, 30, 221, 217, 73], &[1]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 109, 123, 24, 86, 30, 19, 159, 228, 49, 200, 33, 139, 70, 205, 244, 47, 40, 190, 110, 43, 138, 12, 26, 121, 5, 219, 103, 1, 110, 91, 142, 123], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 238, 43, 102, 225, 142, 104, 190, 12, 183, 86, 115, 25, 37, 223, 229, 65, 253, 167, 152, 54, 57, 147, 167, 137, 80, 161, 2, 235, 195, 174, 40, 244], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 118, 56, 0, 163, 106, 153, 253, 252, 124, 16, 246, 65, 95, 110, 230], &[7, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 148, 80, 191, 164, 185, 106, 63, 167, 163, 200, 244, 13, 166, 191, 50, 225], &[0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 17, 218, 109, 31, 118, 29, 223, 155, 219, 76, 157, 110, 83, 3, 235, 212, 31, 97, 133, 141, 10, 86, 71, 161, 167, 191, 224, 137, 191, 146, 27, 233], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 38, 160, 142, 77, 12, 81, 144, 240, 24, 113, 224, 86, 155, 98, 144, 184, 103, 96, 8, 93, 153, 241, 126, 180, 231, 230, 181, 143, 235, 141, 98, 73], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 91, 143, 41, 219, 118, 207, 78, 103, 110, 79, 201, 177, 112, 64, 49, 45, 235, 237, 175, 205, 86, 55, 251, 60, 123, 173, 210, 205, 220, 230, 164, 69], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 123, 10, 161, 115, 94, 91, 165, 141, 50, 54, 49, 108, 103, 31, 228, 240, 14, 211, 102, 238, 114, 65, 124, 158, 208, 42, 83, 168, 1, 158, 133, 184], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 140, 3, 159, 247, 202, 161, 124, 206, 191, 202, 220, 68, 189, 159, 206, 106, 75, 102, 153, 196, 208, 61, 226, 227, 52, 154, 161, 220, 17, 25, 60, 215], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 140, 53, 210, 47, 69, 157, 119, 202, 76, 11, 11, 80, 53, 134, 151, 102, 214, 13, 24, 43, 151, 22, 171, 62, 136, 121, 224, 102, 71, 136, 153, 168], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 157, 255, 135, 106, 75, 148, 45, 10, 151, 17, 209, 130, 33, 137, 143, 17, 202, 57, 117, 21, 137, 235, 244, 212, 157, 116, 159, 107, 62, 73, 50, 146], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 225, 44, 34, 212, 241, 98, 217, 160, 18, 201, 49, 146, 51, 218, 93, 62, 146, 60, 197, 225, 2, 155, 143, 144, 228, 114, 73, 201, 171, 37, 107, 53], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 244, 170, 194, 251, 227, 63, 3, 85, 75, 254, 181, 89, 234, 38, 144, 237, 133, 33, 202, 164, 190, 150, 30, 97, 201, 26, 201, 161, 83, 13, 206, 122], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 224, 205, 208, 98, 230, 234, 242, 66, 149, 173, 76, 207, 196, 29, 70, 9], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 255, 58, 225, 39, 112, 190, 162, 228, 141, 155, 222, 115, 133, 231, 162, 95], &[0, 0, 0, 0, 9, 0, 0, 0]), (&[240, 195, 101, 195, 207, 89, 214, 113, 235, 114, 218, 14, 122, 65, 19, 196, 159, 31, 5, 21, 244, 98, 205, 207, 132, 224, 241, 214, 4, 93, 252, 187], &[88, 27, 0, 0, 0, 0, 0, 0])]; -pub const _8: &[(&[u8], &[u8])] = &[(&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 2, 165, 193, 177, 154, 183, 160, 79, 83, 108, 81, 154, 202, 73, 131, 172], &[8, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 10, 152, 253, 190, 156, 230, 197, 88, 55, 87, 108, 96, 199, 175, 56, 80], &[25, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 128, 212, 30, 94, 22, 5, 103, 101, 188, 132, 97, 133, 16, 114, 201, 215], &[100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 138, 66, 243, 51, 35, 203, 92, 237, 59, 68, 221, 130, 95, 218, 159, 204], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 164, 71, 4, 181, 104, 210, 22, 103, 53, 106, 90, 5, 12, 17, 135, 70, 129, 228, 122, 25, 230, 178, 155, 10, 101, 185, 89, 23, 98, 206, 81, 67, 237, 48, 208, 38, 30, 93, 36, 163, 32, 23, 82, 80, 107, 32, 241, 92], &[69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 29, 189, 125, 11, 86, 26, 65, 210, 60, 42, 70, 154, 212, 47, 189, 112, 213, 67, 139, 174, 130, 111, 111, 214, 7, 65, 49, 144, 195, 124, 54, 59], &[0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 100, 74, 81, 252, 33, 158, 145, 69, 184, 87, 123, 183, 118, 40, 118, 123, 28, 47, 115, 116, 142, 218, 139, 120, 139, 252, 102, 161, 181, 42, 32, 248], &[0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 165, 212, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 108, 221, 179, 103, 175, 189, 88, 59, 180, 143, 155, 189, 125, 91, 163, 177, 208, 115, 139, 72, 129, 177, 205, 221, 56, 22, 149, 38, 216, 21, 129, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 232, 139, 67, 253, 237, 99, 35, 239, 2, 255, 239, 251, 216, 196, 8, 70, 238, 9, 191, 49, 98, 113, 189, 34, 54, 150, 89, 201, 89, 221, 115, 58], &[0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 233, 103, 96, 210, 116, 101, 58, 57, 180, 41, 168, 126, 186, 174, 157, 58, 164, 253, 245, 139, 144, 150, 207, 11, 235, 199, 196, 229, 164, 194, 237, 141], &[0, 0, 0, 0, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[38, 170, 57, 78, 234, 86, 48, 224, 124, 72, 174, 12, 149, 88, 206, 247, 185, 157, 136, 14, 198, 129, 121, 156, 12, 243, 14, 136, 134, 55, 29, 169, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0, 0, 0, 0, 0, 0, 0, 0, 208, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 0, 0]), (&[58, 99, 111, 100, 101], &[]), (&[58, 101, 120, 116, 114, 105, 110, 115, 105, 99, 95, 105, 110, 100, 101, 120], &[0, 0, 0, 0]), (&[58, 104, 101, 97, 112, 112, 97, 103, 101, 115], &[8, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 11, 106, 69, 50, 30, 250, 233, 42, 234, 21, 224, 116, 14, 199, 175, 231], &[2, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 14, 160, 236, 172, 118, 69, 125, 15, 155, 57, 185, 129, 221, 16, 112, 18], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 19, 142, 113, 97, 36, 145, 25, 45, 104, 222, 171, 126, 111, 86, 63, 225], &[2, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 40, 220, 203, 85, 155, 149, 196, 1, 104, 161, 178, 105, 101, 129, 181, 167], &[0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[40, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[10, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[30, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[20, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 62, 209, 75, 69, 237, 32, 208, 84, 240, 94, 55, 226, 84, 44, 254, 112, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[100, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 94, 90, 15, 75, 176, 234, 179, 121, 134, 37, 171, 24, 100, 84, 93, 19, 212, 232, 208, 104, 153, 217, 219, 77, 97, 219, 157, 238, 147, 186, 2, 221], &[21, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 165, 186, 85, 195, 163, 151, 212, 60, 23, 89, 63, 40, 154, 164, 151, 157, 10, 229, 146, 68, 179, 47, 3, 236, 19, 65, 97, 129, 175, 134, 209, 11], &[31, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 189, 225, 131, 90, 186, 237, 15, 242, 121, 87, 0, 55, 252, 73, 213, 189, 23, 110, 180, 130, 163, 178, 129, 109, 244, 252, 194, 204, 27, 200, 106, 202], &[11, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 213, 92, 123, 109, 126, 139, 228, 10, 88, 51, 198, 4, 8, 188, 78, 184, 171, 234, 78, 93, 168, 211, 37, 233, 8, 135, 156, 195, 59, 151, 205, 153], &[101, 0, 0, 0, 0, 0, 0, 0, 209, 7, 209, 7, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 66, 42, 219, 87, 159, 29, 191, 79, 56, 134, 197, 207, 163, 187, 140, 196, 216, 247, 229, 16, 146, 46, 205, 71, 180, 10, 28, 88, 41, 56, 34, 6, 69, 103, 185, 191, 60, 126, 225, 114, 12, 144, 76, 94, 12, 87, 247, 55], &[41, 0, 0, 0, 0, 0, 0, 0, 161, 15, 161, 15, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 80, 154, 155, 110, 250, 147, 245, 187, 131, 248, 88, 240, 186, 191, 211, 11], &[6, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 85, 121, 41, 127, 77, 251, 150, 9, 231, 228, 194, 235, 171, 156, 228, 10], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 86, 239, 98, 39, 206, 203, 47, 7, 39, 76, 176, 87, 45, 143, 164, 194], &[101, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 106, 147, 17, 38, 51, 187, 51, 84, 230, 121, 82, 252, 221, 116, 12, 213], &[31, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[149, 17, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 245, 1]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 131, 229, 133, 187, 197, 253, 206, 197, 114, 25, 192, 220, 129, 239, 95, 244, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[125, 21, 161, 15, 4, 101, 0, 0, 0, 0, 0, 0, 0, 221, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0, 0, 1, 21, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0, 1, 31, 0, 0, 0, 0, 0, 0, 0, 1, 11, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 146, 32, 225, 114, 190, 211, 22, 96, 95, 115, 241, 255, 123, 74, 222, 152, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 106, 99, 127, 98, 174, 42, 241, 199, 227, 30, 237, 126, 150, 190, 4, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[8, 11, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 156, 189, 47, 11, 41, 160, 8, 163, 96, 9, 172, 68, 204, 160, 201, 105], &[101, 4, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 166, 97, 104, 247, 231, 37, 155, 102, 112, 160, 111, 37, 101, 227, 229, 242], &[112, 23, 0, 0, 0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 180, 154, 39, 56, 238, 179, 8, 150, 170, 203, 139, 63, 180, 100, 113, 189], &[0, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 194, 154, 3, 16, 225, 187, 69, 210, 12, 172, 231, 124, 203, 98, 201, 125], &[0, 225, 245, 5]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 234, 7, 222, 43, 143, 1, 5, 22, 220, 163, 247, 239, 82, 247, 172, 90], &[12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0]), (&[95, 62, 73, 7, 247, 22, 172, 137, 182, 52, 125, 21, 236, 236, 237, 202, 247, 218, 208, 49, 115, 36, 174, 202, 232, 116, 75, 135, 252, 149, 242, 243], &[0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 77, 254, 57, 245, 78, 123, 168, 74, 190, 191, 139, 138, 100, 234, 72, 46, 45, 174, 43, 141, 96, 79, 230, 7, 252, 242, 172, 39, 100, 43, 161, 177], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 137, 6, 59, 94, 171, 160, 104, 80, 196, 182, 201, 87, 28, 70, 86, 200, 124, 206, 182, 4, 38, 77, 37, 233, 32, 121, 227, 154, 137, 129, 91, 166], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 232, 3, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 33, 143, 38, 199, 58, 221, 99, 72, 151, 85, 11, 64, 3, 178, 107, 198, 250, 67, 84, 127, 177, 206, 187, 248, 7, 171, 139, 143, 54, 116, 13, 218, 140, 198, 7, 172, 12, 47, 130, 190, 178, 198, 48, 211, 195, 137, 122, 61], &[4, 115, 116, 97, 107, 105, 110, 103, 32, 244, 1, 0, 0, 0, 0, 0, 0, 2]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 87, 200, 117, 228, 207, 247, 65, 72, 228, 98, 143, 38, 75, 151, 76, 128], &[214, 61, 165, 212, 232, 0, 0, 0]), (&[194, 38, 18, 118, 204, 157, 31, 133, 152, 234, 75, 106, 116, 177, 92, 47, 227, 253, 141, 247, 41, 112, 188, 130, 229, 38, 126, 160, 30, 221, 217, 73], &[1]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 83, 50, 194, 39, 103, 192, 178, 217, 125, 32, 22, 246, 168, 239, 120, 222, 173, 2, 155, 120, 7, 166, 176, 226, 172, 7, 43, 102, 21, 204, 92, 8], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 76, 1, 78, 107, 248, 184, 194, 192, 17, 231, 41, 11, 133, 105, 107, 179, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 170, 10, 228, 226, 42, 96, 247, 17, 144, 247, 250, 141, 205, 84, 104, 175, 49, 59, 161, 58, 250, 178, 59, 219, 34, 1, 81, 12, 128, 142, 182, 22], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 109, 123, 24, 86, 30, 19, 159, 228, 49, 200, 33, 139, 70, 205, 244, 47, 40, 190, 110, 43, 138, 12, 26, 121, 5, 219, 103, 1, 110, 91, 142, 123], &[11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 99, 128, 64, 70, 131, 252, 137, 232, 35, 52, 80, 200, 170, 25, 80, 159, 230, 50, 156, 192, 179, 158, 9, 52, 58, 115, 101, 115, 115, 105, 111, 110, 58, 107, 101, 121, 115, 238, 43, 102, 225, 142, 104, 190, 12, 183, 86, 115, 25, 37, 223, 229, 65, 253, 167, 152, 54, 57, 147, 167, 137, 80, 161, 2, 235, 195, 174, 40, 244], &[21, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 114, 118, 56, 0, 163, 106, 153, 253, 252, 124, 16, 246, 65, 95, 110, 230], &[8, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 136, 220, 222, 147, 76, 101, 130, 39, 238, 29, 250, 252, 214, 225, 105, 3], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 148, 80, 191, 164, 185, 106, 63, 167, 163, 200, 244, 13, 166, 191, 50, 225], &[0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 17, 218, 109, 31, 118, 29, 223, 155, 219, 76, 157, 110, 83, 3, 235, 212, 31, 97, 133, 141, 10, 86, 71, 161, 167, 191, 224, 137, 191, 146, 27, 233], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 38, 160, 142, 77, 12, 81, 144, 240, 24, 113, 224, 86, 155, 98, 144, 184, 103, 96, 8, 93, 153, 241, 126, 180, 231, 230, 181, 143, 235, 141, 98, 73], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 47, 1, 107, 122, 93, 185, 48, 218, 189, 234, 3, 170, 104, 210, 115, 77, 47, 164, 122, 5, 87, 226, 13, 19, 12, 193, 224, 68, 248, 220, 87, 150], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 91, 143, 41, 219, 118, 207, 78, 103, 110, 79, 201, 177, 112, 64, 49, 45, 235, 237, 175, 205, 86, 55, 251, 60, 123, 173, 210, 205, 220, 230, 164, 69], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 123, 10, 161, 115, 94, 91, 165, 141, 50, 54, 49, 108, 103, 31, 228, 240, 14, 211, 102, 238, 114, 65, 124, 158, 208, 42, 83, 168, 1, 158, 133, 184], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 140, 3, 159, 247, 202, 161, 124, 206, 191, 202, 220, 68, 189, 159, 206, 106, 75, 102, 153, 196, 208, 61, 226, 227, 52, 154, 161, 220, 17, 25, 60, 215], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 140, 53, 210, 47, 69, 157, 119, 202, 76, 11, 11, 80, 53, 134, 151, 102, 214, 13, 24, 43, 151, 22, 171, 62, 136, 121, 224, 102, 71, 136, 153, 168], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 157, 255, 135, 106, 75, 148, 45, 10, 151, 17, 209, 130, 33, 137, 143, 17, 202, 57, 117, 21, 137, 235, 244, 212, 157, 116, 159, 107, 62, 73, 50, 146], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 225, 44, 34, 212, 241, 98, 217, 160, 18, 201, 49, 146, 51, 218, 93, 62, 146, 60, 197, 225, 2, 155, 143, 144, 228, 114, 73, 201, 171, 37, 107, 53], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 152, 239, 125, 192, 96, 67, 110, 78, 216, 3, 175, 7, 99, 43, 137, 182, 244, 170, 194, 251, 227, 63, 3, 85, 75, 254, 181, 89, 234, 38, 144, 237, 133, 33, 202, 164, 190, 150, 30, 97, 201, 26, 201, 161, 83, 13, 206, 122], &[44, 175, 112, 32, 141, 187, 198, 225, 208, 96, 126, 2, 8, 79, 212, 67, 222, 67, 84, 75, 213, 91, 72, 122, 231, 108, 125, 176, 42, 11, 117, 78, 2, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 224, 205, 208, 98, 230, 234, 242, 66, 149, 173, 76, 207, 196, 29, 70, 9], &[8, 21, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]), (&[206, 197, 7, 13, 96, 157, 211, 73, 127, 114, 189, 224, 127, 201, 107, 160, 255, 58, 225, 39, 112, 190, 162, 228, 141, 155, 222, 115, 133, 231, 162, 95], &[0, 0, 0, 0, 10, 0, 0, 0]), (&[240, 195, 101, 195, 207, 89, 214, 113, 235, 114, 218, 14, 122, 65, 19, 196, 159, 31, 5, 21, 244, 98, 205, 207, 132, 224, 241, 214, 4, 93, 252, 187], &[64, 31, 0, 0, 0, 0, 0, 0])]; diff --git a/substrate/frame/staking/src/migration/tests.rs b/substrate/frame/staking/src/migration/tests.rs deleted file mode 100644 index db437e08c1..0000000000 --- a/substrate/frame/staking/src/migration/tests.rs +++ /dev/null @@ -1,220 +0,0 @@ -use crate::*; -use crate::mock::*; -use frame_support::storage::migration::*; -use sp_core::hashing::blake2_256; -use super::test_upgrade_from_master_dataset; -use sp_runtime::traits::OnRuntimeUpgrade; - -#[test] -fn upgrade_works() { - ExtBuilder::default().build().execute_with(|| { - start_era(3); - - assert_eq!(Session::validators(), vec![21, 11]); - - // Insert fake data to check the migration - put_storage_value::>(b"Staking", b"CurrentElected", b"", vec![21, 31]); - put_storage_value::(b"Staking", b"CurrentEraStartSessionIndex", b"", 5); - put_storage_value::>(b"Staking", b"CurrentEraStart", b"", 777); - put_storage_value( - b"Staking", b"Stakers", &blake2_256(&11u64.encode()), - Exposure:: { - total: 10, - own: 10, - others: vec![], - } - ); - put_storage_value( - b"Staking", b"Stakers", &blake2_256(&21u64.encode()), - Exposure:: { - total: 20, - own: 20, - others: vec![], - } - ); - put_storage_value( - b"Staking", b"Stakers", &blake2_256(&31u64.encode()), - Exposure:: { - total: 30, - own: 30, - others: vec![], - } - ); - put_storage_value::<(u32, Vec)>(b"Staking", b"CurrentEraPointsEarned", b"", (12, vec![2, 10])); - ::ErasStakers::remove_all(); - ::ErasStakersClipped::remove_all(); - - ::StorageVersion::put(Releases::V1_0_0); - - // Perform upgrade - Staking::on_runtime_upgrade(); - - assert_eq!(::StorageVersion::get(), Releases::V2_0_0); - - // Check migration - assert_eq!(::ErasStartSessionIndex::get(3).unwrap(), 5); - assert_eq!(::ErasRewardPoints::get(3), EraRewardPoints { - total: 12, - individual: vec![(21, 2), (31, 10)].into_iter().collect(), - }); - assert_eq!(::ActiveEra::get().unwrap().index, 3); - assert_eq!(::ActiveEra::get().unwrap().start, Some(777)); - assert_eq!(::CurrentEra::get().unwrap(), 3); - assert_eq!(::ErasStakers::get(3, 11), Exposure { - total: 0, - own: 0, - others: vec![], - }); - assert_eq!(::ErasStakers::get(3, 21), Exposure { - total: 20, - own: 20, - others: vec![], - }); - assert_eq!(::ErasStakers::get(3, 31), Exposure { - total: 30, - own: 30, - others: vec![], - }); - assert_eq!(::ErasStakersClipped::get(3, 11), Exposure { - total: 0, - own: 0, - others: vec![], - }); - assert_eq!(::ErasStakersClipped::get(3, 21), Exposure { - total: 20, - own: 20, - others: vec![], - }); - assert_eq!(::ErasStakersClipped::get(3, 31), Exposure { - total: 30, - own: 30, - others: vec![], - }); - assert_eq!(::ErasValidatorPrefs::get(3, 21), Staking::validators(21)); - assert_eq!(::ErasValidatorPrefs::get(3, 31), Staking::validators(31)); - assert_eq!(::ErasTotalStake::get(3), 50); - }) -} - -// Test that an upgrade from previous test environment works. -#[test] -fn test_upgrade_from_master_works() { - let data_sets = &[ - test_upgrade_from_master_dataset::_0, - test_upgrade_from_master_dataset::_1, - test_upgrade_from_master_dataset::_2, - test_upgrade_from_master_dataset::_3, - test_upgrade_from_master_dataset::_4, - test_upgrade_from_master_dataset::_5, - test_upgrade_from_master_dataset::_6, - test_upgrade_from_master_dataset::_7, - test_upgrade_from_master_dataset::_8, - ]; - for data_set in data_sets.iter() { - let mut storage = sp_runtime::Storage::default(); - for (key, value) in data_set.iter() { - storage.top.insert(key.to_vec(), value.to_vec()); - } - let mut ext = sp_io::TestExternalities::from(storage); - ext.execute_with(|| { - let old_stakers = - get_storage_value::>(b"Staking", b"CurrentElected", b"").unwrap(); - let old_staker_0 = old_stakers[0]; - let old_staker_1 = old_stakers[1]; - let old_current_era = - get_storage_value::(b"Staking", b"CurrentEra", b"").unwrap(); - let old_staker_0_exposure = get_storage_value::>( - b"Staking", b"Stakers", &blake2_256(&old_staker_0.encode()) - ).unwrap(); - let old_staker_1_exposure = get_storage_value::>( - b"Staking", b"Stakers", &blake2_256(&old_staker_1.encode()) - ).unwrap(); - let ( - old_era_points_earned_total, - old_era_points_earned_individual - ) = get_storage_value::<(u32, Vec)>(b"Staking", b"CurrentEraPointsEarned", b"") - .unwrap_or((0, vec![])); - - Staking::on_runtime_upgrade(); - assert!(::StorageVersion::get() == Releases::V2_0_0); - - // Check ActiveEra and CurrentEra - let active_era = Staking::active_era().unwrap().index; - let current_era = Staking::current_era().unwrap(); - assert!(current_era == active_era); - assert!(current_era == old_current_era); - - // Check ErasStartSessionIndex - let active_era_start = Staking::eras_start_session_index(active_era).unwrap(); - let current_era_start = Staking::eras_start_session_index(current_era).unwrap(); - let current_session_index = Session::current_index(); - assert!(current_era_start == active_era_start); - assert!(active_era_start <= current_session_index); - assert_eq!(::ErasStartSessionIndex::iter().count(), 1); - - // Check ErasStakers - assert_eq!(::ErasStakers::iter().count(), 2); - assert_eq!( - ::ErasStakers::get(current_era, old_staker_0), - old_staker_0_exposure - ); - assert_eq!( - ::ErasStakers::get(current_era, old_staker_1), - old_staker_1_exposure - ); - - // Check ErasStakersClipped - assert_eq!(::ErasStakersClipped::iter().count(), 2); - assert!(::ErasStakersClipped::iter().all(|exposure_clipped| { - let max = ::MaxNominatorRewardedPerValidator::get() as usize; - exposure_clipped.others.len() <= max - })); - assert_eq!( - ::ErasStakersClipped::get(current_era, old_staker_0), - old_staker_0_exposure - ); - assert_eq!( - ::ErasStakersClipped::get(current_era, old_staker_1), - old_staker_1_exposure - ); - - // Check ErasValidatorPrefs - assert_eq!(::ErasValidatorPrefs::iter().count(), 2); - assert_eq!( - ::ErasValidatorPrefs::get(current_era, old_staker_0), - Staking::validators(old_staker_0) - ); - assert_eq!( - ::ErasValidatorPrefs::get(current_era, old_staker_1), - Staking::validators(old_staker_1) - ); - - // Check ErasTotalStake - assert_eq!(::ErasTotalStake::iter().count(), 1); - assert_eq!( - ::ErasTotalStake::get(current_era), - old_staker_0_exposure.total + old_staker_1_exposure.total - ); - - // Check ErasRewardPoints - assert_eq!(::ErasRewardPoints::iter().count(), 1); - let mut individual = BTreeMap::new(); - if let Some(p) = old_era_points_earned_individual.get(0) { - individual.insert(old_staker_0, p.clone()); - } - if let Some(p) = old_era_points_earned_individual.get(1) { - individual.insert(old_staker_1, p.clone()); - } - assert_eq!( - ::ErasRewardPoints::get(current_era), - EraRewardPoints { - total: old_era_points_earned_total, - individual, - } - ); - - // Check ErasValidatorReward - assert_eq!(::ErasValidatorReward::iter().count(), 0); - }); - } -} diff --git a/substrate/frame/staking/src/mock.rs b/substrate/frame/staking/src/mock.rs index b7cae91bed..a09bd8151f 100644 --- a/substrate/frame/staking/src/mock.rs +++ b/substrate/frame/staking/src/mock.rs @@ -25,10 +25,8 @@ use sp_staking::{SessionIndex, offence::{OffenceDetails, OnOffenceHandler}}; use sp_core::{H256, crypto::key_types}; use sp_io; use frame_support::{ - assert_ok, impl_outer_origin, parameter_types, StorageLinkedMap, StorageValue, StorageMap, - StorageDoubleMap, - traits::{Currency, Get, FindAuthor}, - weights::Weight, + assert_ok, impl_outer_origin, parameter_types, StorageValue, StorageMap, + StorageDoubleMap, IterableStorageMap, traits::{Currency, Get, FindAuthor}, weights::Weight, }; use crate::{ EraIndex, GenesisConfig, Module, Trait, StakerStatus, ValidatorPrefs, RewardDestination, @@ -140,7 +138,7 @@ impl frame_system::Trait for Test { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } impl pallet_balances::Trait for Test { @@ -373,7 +371,7 @@ pub fn check_exposure_all(era: EraIndex) { } pub fn check_nominator_all(era: EraIndex) { - >::enumerate() + >::iter() .for_each(|(acc, _)| check_nominator_exposure(era, acc)); } diff --git a/substrate/frame/staking/src/tests.rs b/substrate/frame/staking/src/tests.rs index 00a8f854db..d11457671f 100644 --- a/substrate/frame/staking/src/tests.rs +++ b/substrate/frame/staking/src/tests.rs @@ -76,7 +76,7 @@ fn basic_setup_works() { assert_eq!(Staking::ledger(&1), None); // ValidatorPrefs are default - assert_eq!(>::enumerate().collect::>(), vec![ + assert_eq!(>::iter().collect::>(), vec![ (31, ValidatorPrefs::default()), (21, ValidatorPrefs::default()), (11, ValidatorPrefs::default()) @@ -2769,7 +2769,7 @@ fn slash_kicks_validators_not_nominators() { // This is the best way to check that the validator was chilled; `get` will // return default value. - for (stash, _) in ::Validators::enumerate() { + for (stash, _) in ::Validators::iter() { assert!(stash != 11); } @@ -2869,7 +2869,7 @@ fn claim_reward_at_the_last_era_and_no_double_claim_and_invalid_claim() { // Fail: Era not finished yet Error::::InvalidEraToReward ); - + // Era 0 can't be rewarded anymore and current era can't be rewarded yet // only era 1 and 2 can be rewarded. @@ -2909,7 +2909,7 @@ fn zero_slash_keeps_nominators() { // This is the best way to check that the validator was chilled; `get` will // return default value. - for (stash, _) in ::Validators::enumerate() { + for (stash, _) in ::Validators::iter() { assert!(stash != 11); } diff --git a/substrate/frame/support/Cargo.toml b/substrate/frame/support/Cargo.toml index 78a7642d9f..8f0dd255ac 100644 --- a/substrate/frame/support/Cargo.toml +++ b/substrate/frame/support/Cargo.toml @@ -14,7 +14,7 @@ serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.2.0", default-features = false, features = ["derive"] } frame-metadata = { version = "11.0.0-alpha.2", default-features = false, path = "../metadata" } sp-std = { version = "2.0.0-alpha.2", default-features = false, path = "../../primitives/std" } -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-alpha.2"} +sp-io = { path = "../../primitives/io", default-features = false , version = "2.0.0-alpha.2"} sp-runtime = { version = "2.0.0-alpha.2", default-features = false, path = "../../primitives/runtime" } sp-core = { version = "2.0.0-alpha.2", default-features = false, path = "../../primitives/core" } sp-arithmetic = { version = "2.0.0-alpha.2", default-features = false, path = "../../primitives/arithmetic" } diff --git a/substrate/frame/support/procedural/src/lib.rs b/substrate/frame/support/procedural/src/lib.rs index f4b82a09cc..a9662f530a 100644 --- a/substrate/frame/support/procedural/src/lib.rs +++ b/substrate/frame/support/procedural/src/lib.rs @@ -33,8 +33,8 @@ use proc_macro::TokenStream; /// decl_storage! { /// trait Store for Module as Example { /// Foo get(fn foo) config(): u32=12; -/// Bar: map hasher(blake2_256) u32 => u32; -/// pub Zed build(|config| vec![(0, 0)]): linked_map hasher(blake2_256) u32 => u32; +/// Bar: map hasher(identity) u32 => u32; +/// pub Zed build(|config| vec![(0, 0)]): map hasher(identity) u32 => u32; /// } /// } /// ``` @@ -70,10 +70,28 @@ use proc_macro::TokenStream; /// And [`StoragePrefixedMap`](../frame_support/storage/trait.StoragePrefixedMap.html). /// /// `$hash` representing a choice of hashing algorithms available in the -/// [`Hashable`](../frame_support/trait.Hashable.html) trait. +/// [`Hashable`](../frame_support/trait.Hashable.html) trait. You will generally want to use one +/// of three hashers: +/// * `blake2_128_concat`: The default, safe choice. Use if you are unsure or don't care. It is +/// secure against user-tainted keys, fairly fast and memory-efficient and supports +/// iteration over its keys and values. This must be used if the keys of your map can be +/// selected *en masse* by untrusted users. +/// * `twox_64_concat`: This is an insecure hasher and can only be used safely if you know that +/// the preimages cannot be chosen at will by untrusted users. It is memory-efficient, extremely +/// performant and supports iteration over its keys and values. You can safely use this is the +/// key is: +/// - A (slowly) incrementing index. +/// - Known to be the result of a cryptographic hash (though `identity` is a better choice here). +/// - Known to be the public key of a cryptographic key pair in existence. +/// * `identity`: This is not a hasher at all, and just uses the key material directly. Since it +/// does no hashing or appending, it's the fastest possible hasher, however, it's also the least +/// secure. It can be used only if you know that the key will be cryptographically/securely +/// randomly distributed over the binary encoding space. In most cases this will not be true. +/// One case where it is true, however, if where the key is itself the result of a cryptographic +/// hash of some existent data. /// -/// `blake2_256` and `blake2_128_concat` are strong hasher. One should use another hasher -/// with care, see generator documentation. +/// Other hashers will tend to be "opaque" and not support iteration over the keys in the +/// map. It is not recommended to use these. /// /// The generator is implemented with: /// * `module_prefix`: $module_prefix @@ -85,36 +103,6 @@ use proc_macro::TokenStream; /// twox128(module_prefix) ++ twox128(storage_prefix) ++ hasher(encode(key)) /// ``` /// -/// * Linked map: `Foo: linked_map hasher($hash) type => type`: Implements the -/// [`StorageLinkedMap`](../frame_support/storage/trait.StorageLinkedMap.html) trait using the -/// [`StorageLinkedMap generator`](../frame_support/storage/generator/trait.StorageLinkedMap.html). -/// And [`StoragePrefixedMap`](../frame_support/storage/trait.StoragePrefixedMap.html). -/// -/// `$hash` representing a choice of hashing algorithms available in the -/// [`Hashable`](../frame_support/trait.Hashable.html) trait. -/// -/// `blake2_256` and `blake2_128_concat` are strong hasher. One should use another hasher -/// with care, see generator documentation. -/// -/// All key formatting logic can be accessed in a type-agnostic format via the -/// `KeyFormat` trait, which -/// is implemented for the storage linked map type as well. -/// -/// The generator key format is implemented with: -/// * `module_prefix`: $module_prefix -/// * `storage_prefix`: storage_name -/// * `head_prefix`: `"HeadOf" ++ storage_name` -/// * `Hasher`: $hash -/// -/// Thus the keys are stored at: -/// ```nocompile -/// Twox128(module_prefix) ++ Twox128(storage_prefix) ++ Hasher(encode(key)) -/// ``` -/// and head is stored at: -/// ```nocompile -/// Twox128(module_prefix) ++ Twox128(head_prefix) -/// ``` -/// /// * Double map: `Foo: double_map hasher($hash1) u32, hasher($hash2) u32 => u32`: Implements the /// [`StorageDoubleMap`](../frame_support/storage/trait.StorageDoubleMap.html) trait using the /// [`StorageDoubleMap generator`](../frame_support/storage/generator/trait.StorageDoubleMap.html). @@ -124,14 +112,6 @@ use proc_macro::TokenStream; /// [`Hashable`](../frame_support/trait.Hashable.html) trait. They must be chosen with care, see /// generator documentation. /// -/// If the first key is untrusted, a cryptographic `hasher` such as `blake2_256` or -/// `blake2_128_concat` must be used. -/// Otherwise, other values of all storage items can be compromised. -/// -/// If the second key is untrusted, a cryptographic `hasher` such as `blake2_256` or -/// `blake2_128_concat` must be used. -/// Otherwise, other items in storage with the same first key can be compromised. -/// /// The generator is implemented with: /// * `module_prefix`: $module_prefix /// * `storage_prefix`: storage_name @@ -145,10 +125,16 @@ use proc_macro::TokenStream; /// /// Supported hashers (ordered from least to best security): /// -/// * `twox_64_concat` - TwoX with 64bit + key concatenated. +/// * `identity` - Just the unrefined key material. Use only when it is known to be a secure hash +/// already. The most efficient and iterable over keys. +/// * `twox_64_concat` - TwoX with 64bit + key concatenated. Use only when an untrusted source +/// cannot select and insert key values. Very efficient and iterable over keys. +/// * `blake2_128_concat` - Blake2 with 128bit + key concatenated. Slower but safe to use in all +/// circumstances. Iterable over keys. +/// +/// Deprecated hashers, which do not support iteration over keys include: /// * `twox_128` - TwoX with 128bit. /// * `twox_256` - TwoX with with 256bit. -/// * `blake2_128_concat` - Blake2 with 128bit + key concatenated. /// * `blake2_128` - Blake2 with 128bit. /// * `blake2_256` - Blake2 with 256bit. /// diff --git a/substrate/frame/support/procedural/src/storage/genesis_config/builder_def.rs b/substrate/frame/support/procedural/src/storage/genesis_config/builder_def.rs index 59e4368807..87255ee481 100644 --- a/substrate/frame/support/procedural/src/storage/genesis_config/builder_def.rs +++ b/substrate/frame/support/procedural/src/storage/genesis_config/builder_def.rs @@ -88,7 +88,7 @@ impl BuilderDef { }} }, StorageLineTypeDef::Simple(_) => unreachable!(), - StorageLineTypeDef::Map(map) | StorageLineTypeDef::LinkedMap(map) => { + StorageLineTypeDef::Map(map) => { let key = &map.key; quote!{{ #data diff --git a/substrate/frame/support/procedural/src/storage/genesis_config/genesis_config_def.rs b/substrate/frame/support/procedural/src/storage/genesis_config/genesis_config_def.rs index ae7ffa64bf..9b6ddc9217 100644 --- a/substrate/frame/support/procedural/src/storage/genesis_config/genesis_config_def.rs +++ b/substrate/frame/support/procedural/src/storage/genesis_config/genesis_config_def.rs @@ -93,7 +93,7 @@ impl GenesisConfigDef { let typ = match &line.storage_type { StorageLineTypeDef::Simple(_) => (*value_type).clone(), - StorageLineTypeDef::Map(map) | StorageLineTypeDef::LinkedMap(map) => { + StorageLineTypeDef::Map(map) => { let key = &map.key; parse_quote!( Vec<(#key, #value_type)> ) }, diff --git a/substrate/frame/support/procedural/src/storage/getters.rs b/substrate/frame/support/procedural/src/storage/getters.rs index 34d182d7f4..ae0e646fcd 100644 --- a/substrate/frame/support/procedural/src/storage/getters.rs +++ b/substrate/frame/support/procedural/src/storage/getters.rs @@ -40,7 +40,7 @@ pub fn impl_getters(scrate: &TokenStream, def: &DeclStorageDefExt) -> TokenStrea } } }, - StorageLineTypeDef::Map(map) | StorageLineTypeDef::LinkedMap(map) => { + StorageLineTypeDef::Map(map) => { let key = &map.key; let value = &map.value; quote!{ diff --git a/substrate/frame/support/procedural/src/storage/metadata.rs b/substrate/frame/support/procedural/src/storage/metadata.rs index f8dfb10d2e..bb23c99d9d 100644 --- a/substrate/frame/support/procedural/src/storage/metadata.rs +++ b/substrate/frame/support/procedural/src/storage/metadata.rs @@ -41,20 +41,7 @@ fn storage_line_metadata_type(scrate: &TokenStream, line: &StorageLineDefExt) -> hasher: #scrate::metadata::#hasher, key: #scrate::metadata::DecodeDifferent::Encode(#key), value: #scrate::metadata::DecodeDifferent::Encode(#value_type), - is_linked: false, - } - } - }, - StorageLineTypeDef::LinkedMap(map) => { - let hasher = map.hasher.into_metadata(); - let key = &map.key; - let key = clean_type_string("e!(#key).to_string()); - quote!{ - #scrate::metadata::StorageEntryType::Map { - hasher: #scrate::metadata::#hasher, - key: #scrate::metadata::DecodeDifferent::Encode(#key), - value: #scrate::metadata::DecodeDifferent::Encode(#value_type), - is_linked: true, + unused: false, } } }, diff --git a/substrate/frame/support/procedural/src/storage/mod.rs b/substrate/frame/support/procedural/src/storage/mod.rs index 3345c5a123..e8599c52a9 100644 --- a/substrate/frame/support/procedural/src/storage/mod.rs +++ b/substrate/frame/support/procedural/src/storage/mod.rs @@ -235,10 +235,6 @@ impl StorageLineDefExt { ext::type_contains_ident(&map.key, &def.module_runtime_generic) || ext::type_contains_ident(&map.value, &def.module_runtime_generic) } - StorageLineTypeDef::LinkedMap(map) => { - ext::type_contains_ident(&map.key, &def.module_runtime_generic) - || ext::type_contains_ident(&map.value, &def.module_runtime_generic) - } StorageLineTypeDef::DoubleMap(map) => { ext::type_contains_ident(&map.key1, &def.module_runtime_generic) || ext::type_contains_ident(&map.key2, &def.module_runtime_generic) @@ -249,7 +245,6 @@ impl StorageLineDefExt { let query_type = match &storage_def.storage_type { StorageLineTypeDef::Simple(value) => value.clone(), StorageLineTypeDef::Map(map) => map.value.clone(), - StorageLineTypeDef::LinkedMap(map) => map.value.clone(), StorageLineTypeDef::DoubleMap(map) => map.value.clone(), }; let is_option = ext::extract_type_option(&query_type).is_some(); @@ -291,10 +286,6 @@ impl StorageLineDefExt { let key = &map.key; quote!( StorageMap<#key, #value_type> ) }, - StorageLineTypeDef::LinkedMap(map) => { - let key = &map.key; - quote!( StorageLinkedMap<#key, #value_type> ) - }, StorageLineTypeDef::DoubleMap(map) => { let key1 = &map.key1; let key2 = &map.key2; @@ -336,7 +327,6 @@ impl StorageLineDefExt { pub enum StorageLineTypeDef { Map(MapDef), - LinkedMap(MapDef), DoubleMap(DoubleMapDef), Simple(syn::Type), } @@ -372,6 +362,7 @@ pub enum HasherKind { Twox256, Twox128, Twox64Concat, + Identity, } impl HasherKind { @@ -383,6 +374,7 @@ impl HasherKind { HasherKind::Twox256 => quote!( Twox256 ), HasherKind::Twox128 => quote!( Twox128 ), HasherKind::Twox64Concat => quote!( Twox64Concat ), + HasherKind::Identity => quote!( Identity ), } } @@ -394,6 +386,7 @@ impl HasherKind { HasherKind::Twox256 => quote!( StorageHasher::Twox256 ), HasherKind::Twox128 => quote!( StorageHasher::Twox128 ), HasherKind::Twox64Concat => quote!( StorageHasher::Twox64Concat ), + HasherKind::Identity => quote!( StorageHasher::Identity ), } } } @@ -420,7 +413,6 @@ pub fn decl_storage_impl(input: proc_macro::TokenStream) -> proc_macro::TokenStr use #scrate::{ StorageValue as _, StorageMap as _, - StorageLinkedMap as _, StorageDoubleMap as _, StoragePrefixedMap as _, }; diff --git a/substrate/frame/support/procedural/src/storage/parse.rs b/substrate/frame/support/procedural/src/storage/parse.rs index b503c2b81c..af568c78cc 100644 --- a/substrate/frame/support/procedural/src/storage/parse.rs +++ b/substrate/frame/support/procedural/src/storage/parse.rs @@ -27,15 +27,18 @@ mod keyword { syn::custom_keyword!(build); syn::custom_keyword!(get); syn::custom_keyword!(map); - syn::custom_keyword!(linked_map); syn::custom_keyword!(double_map); - syn::custom_keyword!(blake2_256); - syn::custom_keyword!(blake2_128); + syn::custom_keyword!(opaque_blake2_256); + syn::custom_keyword!(opaque_blake2_128); syn::custom_keyword!(blake2_128_concat); - syn::custom_keyword!(twox_256); - syn::custom_keyword!(twox_128); + syn::custom_keyword!(opaque_twox_256); + syn::custom_keyword!(opaque_twox_128); syn::custom_keyword!(twox_64_concat); + syn::custom_keyword!(identity); syn::custom_keyword!(hasher); + syn::custom_keyword!(tainted); + syn::custom_keyword!(natural); + syn::custom_keyword!(prehashed); } /// Specific `Opt` to implement structure with optional parsing @@ -194,7 +197,6 @@ impl_parse_for_opt!(DeclStorageBuild => keyword::build); #[derive(ToTokens, Debug)] enum DeclStorageType { Map(DeclStorageMap), - LinkedMap(DeclStorageLinkedMap), DoubleMap(DeclStorageDoubleMap), Simple(syn::Type), } @@ -203,8 +205,6 @@ impl syn::parse::Parse for DeclStorageType { fn parse(input: syn::parse::ParseStream) -> syn::parse::Result { if input.peek(keyword::map) { Ok(Self::Map(input.parse()?)) - } else if input.peek(keyword::linked_map) { - Ok(Self::LinkedMap(input.parse()?)) } else if input.peek(keyword::double_map) { Ok(Self::DoubleMap(input.parse()?)) } else { @@ -222,15 +222,6 @@ struct DeclStorageMap { pub value: syn::Type, } -#[derive(Parse, ToTokens, Debug)] -struct DeclStorageLinkedMap { - pub map_keyword: keyword::linked_map, - pub hasher: Opt, - pub key: syn::Type, - pub ass_keyword: Token![=>], - pub value: syn::Type, -} - #[derive(Parse, ToTokens, Debug)] struct DeclStorageDoubleMap { pub map_keyword: keyword::double_map, @@ -245,29 +236,38 @@ struct DeclStorageDoubleMap { #[derive(ToTokens, Debug)] enum Hasher { - Blake2_256(keyword::blake2_256), - Blake2_128(keyword::blake2_128), + Blake2_256(keyword::opaque_blake2_256), + Blake2_128(keyword::opaque_blake2_128), Blake2_128Concat(keyword::blake2_128_concat), - Twox256(keyword::twox_256), - Twox128(keyword::twox_128), + Twox256(keyword::opaque_twox_256), + Twox128(keyword::opaque_twox_128), Twox64Concat(keyword::twox_64_concat), + Identity(keyword::identity), } impl syn::parse::Parse for Hasher { fn parse(input: syn::parse::ParseStream) -> syn::parse::Result { let lookahead = input.lookahead1(); - if lookahead.peek(keyword::blake2_256) { + if lookahead.peek(keyword::opaque_blake2_256) { Ok(Self::Blake2_256(input.parse()?)) - } else if lookahead.peek(keyword::blake2_128) { + } else if lookahead.peek(keyword::opaque_blake2_128) { Ok(Self::Blake2_128(input.parse()?)) } else if lookahead.peek(keyword::blake2_128_concat) { Ok(Self::Blake2_128Concat(input.parse()?)) - } else if lookahead.peek(keyword::twox_256) { + } else if lookahead.peek(keyword::opaque_twox_256) { Ok(Self::Twox256(input.parse()?)) - } else if lookahead.peek(keyword::twox_128) { + } else if lookahead.peek(keyword::opaque_twox_128) { Ok(Self::Twox128(input.parse()?)) } else if lookahead.peek(keyword::twox_64_concat) { Ok(Self::Twox64Concat(input.parse()?)) + } else if lookahead.peek(keyword::identity) { + Ok(Self::Identity(input.parse()?)) + } else if lookahead.peek(keyword::tainted) { + Ok(Self::Blake2_128Concat(input.parse()?)) + } else if lookahead.peek(keyword::natural) { + Ok(Self::Twox64Concat(input.parse()?)) + } else if lookahead.peek(keyword::prehashed) { + Ok(Self::Identity(input.parse()?)) } else { Err(lookahead.error()) } @@ -313,6 +313,7 @@ impl From for super::HasherKind { Hasher::Twox256(_) => super::HasherKind::Twox256, Hasher::Twox128(_) => super::HasherKind::Twox128, Hasher::Twox64Concat(_) => super::HasherKind::Twox64Concat, + Hasher::Identity(_) => super::HasherKind::Identity, } } } @@ -464,7 +465,7 @@ fn parse_storage_line_defs( let span = line.storage_type.span(); let no_hasher_error = || syn::Error::new( span, - "Default hasher has been removed, use explicit hasher(blake2_256) instead." + "Default hasher has been removed, use explicit hasher(blake2_128_concat) instead." ); let storage_type = match line.storage_type { @@ -475,13 +476,6 @@ fn parse_storage_line_defs( value: map.value, } ), - DeclStorageType::LinkedMap(map) => super::StorageLineTypeDef::LinkedMap( - super::MapDef { - hasher: map.hasher.inner.ok_or_else(no_hasher_error)?.into(), - key: map.key, - value: map.value, - } - ), DeclStorageType::DoubleMap(map) => super::StorageLineTypeDef::DoubleMap( super::DoubleMapDef { hasher1: map.hasher1.inner.ok_or_else(no_hasher_error)?.into(), diff --git a/substrate/frame/support/procedural/src/storage/storage_struct.rs b/substrate/frame/support/procedural/src/storage/storage_struct.rs index 91bdf7bf87..cbd477354e 100644 --- a/substrate/frame/support/procedural/src/storage/storage_struct.rs +++ b/substrate/frame/support/procedural/src/storage/storage_struct.rs @@ -158,47 +158,6 @@ pub fn decl_and_impl(scrate: &TokenStream, def: &DeclStorageDefExt) -> TokenStre } ) }, - StorageLineTypeDef::LinkedMap(map) => { - let hasher = map.hasher.to_storage_hasher_struct(); - - let head_prefix_str = syn::LitStr::new( - &format!("HeadOf{}", line.name.to_string()), - line.name.span(), - ); - - quote!( - impl<#impl_trait> #scrate::#storage_generator_trait for #storage_struct - #optional_storage_where_clause - { - type Query = #query_type; - type KeyFormat = Self; - - fn from_optional_value_to_query(v: Option<#value_type>) -> Self::Query { - #from_optional_value_to_query - } - - fn from_query_to_optional_value(v: Self::Query) -> Option<#value_type> { - #from_query_to_optional_value - } - } - - impl<#impl_trait> #scrate::storage::generator::LinkedMapKeyFormat for #storage_struct { - type Hasher = #scrate::#hasher; - - fn module_prefix() -> &'static [u8] { - #instance_or_inherent::PREFIX.as_bytes() - } - - fn storage_prefix() -> &'static [u8] { - #storage_name_str.as_bytes() - } - - fn head_prefix() -> &'static [u8] { - #head_prefix_str.as_bytes() - } - } - ) - }, StorageLineTypeDef::DoubleMap(map) => { let hasher1 = map.hasher1.to_storage_hasher_struct(); let hasher2 = map.hasher2.to_storage_hasher_struct(); diff --git a/substrate/frame/support/src/hash.rs b/substrate/frame/support/src/hash.rs index aae4aceb7f..f8d6409060 100644 --- a/substrate/frame/support/src/hash.rs +++ b/substrate/frame/support/src/hash.rs @@ -28,6 +28,7 @@ pub trait Hashable: Sized { fn twox_128(&self) -> [u8; 16]; fn twox_256(&self) -> [u8; 32]; fn twox_64_concat(&self) -> Vec; + fn identity(&self) -> Vec; } impl Hashable for T { @@ -49,6 +50,7 @@ impl Hashable for T { fn twox_64_concat(&self) -> Vec { self.using_encoded(Twox64Concat::hash) } + fn identity(&self) -> Vec { self.encode() } } /// Hasher to use to hash keys to insert to storage. @@ -57,6 +59,25 @@ pub trait StorageHasher: 'static { fn hash(x: &[u8]) -> Self::Output; } +/// Hasher to use to hash keys to insert to storage. +pub trait ReversibleStorageHasher: StorageHasher { + fn reverse(x: &[u8]) -> &[u8]; +} + +/// Store the key directly. +pub struct Identity; +impl StorageHasher for Identity { + type Output = Vec; + fn hash(x: &[u8]) -> Vec { + x.to_vec() + } +} +impl ReversibleStorageHasher for Identity { + fn reverse(x: &[u8]) -> &[u8] { + x + } +} + /// Hash storage keys with `concat(twox64(key), key)` pub struct Twox64Concat; impl StorageHasher for Twox64Concat { @@ -69,6 +90,11 @@ impl StorageHasher for Twox64Concat { .collect::>() } } +impl ReversibleStorageHasher for Twox64Concat { + fn reverse(x: &[u8]) -> &[u8] { + &x[8..] + } +} /// Hash storage keys with `concat(blake2_128(key), key)` pub struct Blake2_128Concat; @@ -82,6 +108,11 @@ impl StorageHasher for Blake2_128Concat { .collect::>() } } +impl ReversibleStorageHasher for Blake2_128Concat { + fn reverse(x: &[u8]) -> &[u8] { + &x[16..] + } +} /// Hash storage keys with blake2 128 pub struct Blake2_128; diff --git a/substrate/frame/support/src/lib.rs b/substrate/frame/support/src/lib.rs index 00b229750d..8fe32cbda9 100644 --- a/substrate/frame/support/src/lib.rs +++ b/substrate/frame/support/src/lib.rs @@ -67,11 +67,12 @@ pub mod traits; pub mod weights; pub use self::hash::{ - Twox256, Twox128, Blake2_256, Blake2_128, Twox64Concat, Blake2_128Concat, Hashable, + Twox256, Twox128, Blake2_256, Blake2_128, Identity, Twox64Concat, Blake2_128Concat, Hashable, StorageHasher }; pub use self::storage::{ - StorageValue, StorageMap, StorageLinkedMap, StorageDoubleMap, StoragePrefixedMap + StorageValue, StorageMap, StorageDoubleMap, StoragePrefixedMap, IterableStorageMap, + IterableStorageDoubleMap, }; pub use self::dispatch::{Parameter, Callable, IsSubType}; pub use sp_runtime::{self, ConsensusEngineId, print, traits::Printable}; @@ -253,24 +254,24 @@ mod tests { decl_storage! { trait Store for Module as Test { pub Data get(fn data) build(|_| vec![(15u32, 42u64)]): - linked_map hasher(twox_64_concat) u32 => u64; - pub OptionLinkedMap: linked_map hasher(blake2_256) u32 => Option; + map hasher(twox_64_concat) u32 => u64; + pub OptionLinkedMap: map hasher(blake2_128_concat) u32 => Option; pub GenericData get(fn generic_data): - linked_map hasher(twox_128) T::BlockNumber => T::BlockNumber; + map hasher(identity) T::BlockNumber => T::BlockNumber; pub GenericData2 get(fn generic_data2): - linked_map hasher(blake2_256) T::BlockNumber => Option; + map hasher(blake2_128_concat) T::BlockNumber => Option; pub GetterNoFnKeyword get(no_fn): Option; pub DataDM config(test_config) build(|_| vec![(15u32, 16u32, 42u64)]): - double_map hasher(twox_64_concat) u32, hasher(blake2_256) u32 => u64; + double_map hasher(twox_64_concat) u32, hasher(blake2_128_concat) u32 => u64; pub GenericDataDM: - double_map hasher(blake2_256) T::BlockNumber, hasher(twox_128) T::BlockNumber + double_map hasher(blake2_128_concat) T::BlockNumber, hasher(identity) T::BlockNumber => T::BlockNumber; pub GenericData2DM: - double_map hasher(blake2_256) T::BlockNumber, hasher(twox_256) T::BlockNumber + double_map hasher(blake2_128_concat) T::BlockNumber, hasher(twox_64_concat) T::BlockNumber => Option; pub AppendableDM: - double_map hasher(blake2_256) u32, hasher(blake2_256) T::BlockNumber => Vec; + double_map hasher(blake2_128_concat) u32, hasher(blake2_128_concat) T::BlockNumber => Vec; } } @@ -286,8 +287,16 @@ mod tests { type Map = Data; + trait Sorted { fn sorted(self) -> Self; } + impl Sorted for Vec { + fn sorted(mut self) -> Self { + self.sort(); + self + } + } + #[test] - fn linked_map_issue_3318() { + fn map_issue_3318() { new_test_ext().execute_with(|| { OptionLinkedMap::insert(1, 1); assert_eq!(OptionLinkedMap::get(1), Some(1)); @@ -297,31 +306,31 @@ mod tests { } #[test] - fn linked_map_swap_works() { + fn map_swap_works() { new_test_ext().execute_with(|| { OptionLinkedMap::insert(0, 0); OptionLinkedMap::insert(1, 1); OptionLinkedMap::insert(2, 2); OptionLinkedMap::insert(3, 3); - let collect = || OptionLinkedMap::enumerate().collect::>(); - assert_eq!(collect(), vec![(3, 3), (2, 2), (1, 1), (0, 0)]); + let collect = || OptionLinkedMap::iter().collect::>().sorted(); + assert_eq!(collect(), vec![(0, 0), (1, 1), (2, 2), (3, 3)]); // Two existing OptionLinkedMap::swap(1, 2); - assert_eq!(collect(), vec![(3, 3), (2, 1), (1, 2), (0, 0)]); + assert_eq!(collect(), vec![(0, 0), (1, 2), (2, 1), (3, 3)]); // Back to normal OptionLinkedMap::swap(2, 1); - assert_eq!(collect(), vec![(3, 3), (2, 2), (1, 1), (0, 0)]); + assert_eq!(collect(), vec![(0, 0), (1, 1), (2, 2), (3, 3)]); // Left existing OptionLinkedMap::swap(2, 5); - assert_eq!(collect(), vec![(5, 2), (3, 3), (1, 1), (0, 0)]); + assert_eq!(collect(), vec![(0, 0), (1, 1), (3, 3), (5, 2)]); // Right existing OptionLinkedMap::swap(5, 2); - assert_eq!(collect(), vec![(2, 2), (3, 3), (1, 1), (0, 0)]); + assert_eq!(collect(), vec![(0, 0), (1, 1), (2, 2), (3, 3)]); }); } @@ -356,7 +365,7 @@ mod tests { } #[test] - fn linked_map_basic_insert_remove_should_work() { + fn map_basic_insert_remove_should_work() { new_test_ext().execute_with(|| { // initialized during genesis assert_eq!(Map::get(&15u32), 42u64); @@ -382,54 +391,45 @@ mod tests { } #[test] - fn linked_map_enumeration_and_head_should_work() { + fn map_iteration_should_work() { new_test_ext().execute_with(|| { - assert_eq!(Map::head(), Some(15)); - assert_eq!(Map::enumerate().collect::>(), vec![(15, 42)]); + assert_eq!(Map::iter().collect::>().sorted(), vec![(15, 42)]); // insert / remove let key = 17u32; Map::insert(key, 4u64); - assert_eq!(Map::head(), Some(key)); - assert_eq!(Map::enumerate().collect::>(), vec![(key, 4), (15, 42)]); + assert_eq!(Map::iter().collect::>().sorted(), vec![(15, 42), (key, 4)]); assert_eq!(Map::take(&15), 42u64); assert_eq!(Map::take(&key), 4u64); - assert_eq!(Map::head(), None); - assert_eq!(Map::enumerate().collect::>(), vec![]); + assert_eq!(Map::iter().collect::>().sorted(), vec![]); // Add couple of more elements Map::insert(key, 42u64); - assert_eq!(Map::head(), Some(key)); - assert_eq!(Map::enumerate().collect::>(), vec![(key, 42)]); + assert_eq!(Map::iter().collect::>().sorted(), vec![(key, 42)]); Map::insert(key + 1, 43u64); - assert_eq!(Map::head(), Some(key + 1)); - assert_eq!(Map::enumerate().collect::>(), vec![(key + 1, 43), (key, 42)]); + assert_eq!(Map::iter().collect::>().sorted(), vec![(key, 42), (key + 1, 43)]); // mutate let key = key + 2; Map::mutate(&key, |val| { *val = 15; }); - assert_eq!(Map::enumerate().collect::>(), vec![(key, 15), (key - 1, 43), (key - 2, 42)]); - assert_eq!(Map::head(), Some(key)); + assert_eq!(Map::iter().collect::>().sorted(), vec![(key - 2, 42), (key - 1, 43), (key, 15)]); Map::mutate(&key, |val| { *val = 17; }); - assert_eq!(Map::enumerate().collect::>(), vec![(key, 17), (key - 1, 43), (key - 2, 42)]); + assert_eq!(Map::iter().collect::>().sorted(), vec![(key - 2, 42), (key - 1, 43), (key, 17)]); // remove first Map::remove(&key); - assert_eq!(Map::head(), Some(key - 1)); - assert_eq!(Map::enumerate().collect::>(), vec![(key - 1, 43), (key - 2, 42)]); + assert_eq!(Map::iter().collect::>().sorted(), vec![(key - 2, 42), (key - 1, 43)]); // remove last from the list Map::remove(&(key - 2)); - assert_eq!(Map::head(), Some(key - 1)); - assert_eq!(Map::enumerate().collect::>(), vec![(key - 1, 43)]); + assert_eq!(Map::iter().collect::>().sorted(), vec![(key - 1, 43)]); // remove the last element Map::remove(&(key - 1)); - assert_eq!(Map::head(), None); - assert_eq!(Map::enumerate().collect::>(), vec![]); + assert_eq!(Map::iter().collect::>().sorted(), vec![]); }); } @@ -498,7 +498,7 @@ mod tests { hasher: StorageHasher::Twox64Concat, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("u64"), - is_linked: true, + unused: false, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructData(PhantomData::)) @@ -509,10 +509,10 @@ mod tests { name: DecodeDifferent::Encode("OptionLinkedMap"), modifier: StorageEntryModifier::Optional, ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("u32"), - is_linked: true, + unused: false, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructOptionLinkedMap(PhantomData::)) @@ -523,10 +523,10 @@ mod tests { name: DecodeDifferent::Encode("GenericData"), modifier: StorageEntryModifier::Default, ty: StorageEntryType::Map{ - hasher: StorageHasher::Twox128, + hasher: StorageHasher::Identity, key: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), - is_linked: true + unused: false }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructGenericData(PhantomData::)) @@ -537,10 +537,10 @@ mod tests { name: DecodeDifferent::Encode("GenericData2"), modifier: StorageEntryModifier::Optional, ty: StorageEntryType::Map{ - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), - is_linked: true + unused: false }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructGenericData2(PhantomData::)) @@ -564,7 +564,7 @@ mod tests { key1: DecodeDifferent::Encode("u32"), key2: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("u64"), - key2_hasher: StorageHasher::Blake2_256, + key2_hasher: StorageHasher::Blake2_128Concat, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructDataDM(PhantomData::)) @@ -575,11 +575,11 @@ mod tests { name: DecodeDifferent::Encode("GenericDataDM"), modifier: StorageEntryModifier::Default, ty: StorageEntryType::DoubleMap{ - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key1: DecodeDifferent::Encode("T::BlockNumber"), key2: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), - key2_hasher: StorageHasher::Twox128, + key2_hasher: StorageHasher::Identity, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructGenericDataDM(PhantomData::)) @@ -590,11 +590,11 @@ mod tests { name: DecodeDifferent::Encode("GenericData2DM"), modifier: StorageEntryModifier::Optional, ty: StorageEntryType::DoubleMap{ - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key1: DecodeDifferent::Encode("T::BlockNumber"), key2: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), - key2_hasher: StorageHasher::Twox256, + key2_hasher: StorageHasher::Twox64Concat, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) @@ -605,11 +605,11 @@ mod tests { name: DecodeDifferent::Encode("AppendableDM"), modifier: StorageEntryModifier::Default, ty: StorageEntryType::DoubleMap{ - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key1: DecodeDifferent::Encode("u32"), key2: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("Vec"), - key2_hasher: StorageHasher::Blake2_256, + key2_hasher: StorageHasher::Blake2_128Concat, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::)) diff --git a/substrate/frame/support/src/storage/generator/double_map.rs b/substrate/frame/support/src/storage/generator/double_map.rs index ff73fdbedf..9d05ff0b2d 100644 --- a/substrate/frame/support/src/storage/generator/double_map.rs +++ b/substrate/frame/support/src/storage/generator/double_map.rs @@ -16,8 +16,9 @@ use sp_std::prelude::*; use sp_std::borrow::Borrow; -use codec::{Ref, FullCodec, FullEncode, Encode, EncodeLike, EncodeAppend}; -use crate::{storage::{self, unhashed}, hash::{StorageHasher, Twox128}, traits::Len}; +use codec::{Ref, FullCodec, FullEncode, Decode, Encode, EncodeLike, EncodeAppend}; +use crate::{storage::{self, unhashed}, traits::Len}; +use crate::hash::{StorageHasher, Twox128, ReversibleStorageHasher}; /// Generator for `StorageDoubleMap` used by `decl_storage`. /// @@ -55,6 +56,22 @@ pub trait StorageDoubleMap { /// Storage prefix. Used for generating final key. fn storage_prefix() -> &'static [u8]; + /// The full prefix; just the hash of `module_prefix` concatenated to the hash of + /// `storage_prefix`. + fn prefix_hash() -> Vec { + let module_prefix_hashed = Twox128::hash(Self::module_prefix()); + let storage_prefix_hashed = Twox128::hash(Self::storage_prefix()); + + let mut result = Vec::with_capacity( + module_prefix_hashed.len() + storage_prefix_hashed.len() + ); + + result.extend_from_slice(&module_prefix_hashed[..]); + result.extend_from_slice(&storage_prefix_hashed[..]); + + result + } + /// Convert an optional value retrieved from storage to the type queried. fn from_optional_value_to_query(v: Option) -> Self::Query; @@ -62,8 +79,7 @@ pub trait StorageDoubleMap { fn from_query_to_optional_value(v: Self::Query) -> Option; /// Generate the first part of the key used in top storage. - fn storage_double_map_final_key1(k1: KArg1) -> Vec - where + fn storage_double_map_final_key1(k1: KArg1) -> Vec where KArg1: EncodeLike, { let module_prefix_hashed = Twox128::hash(Self::module_prefix()); @@ -82,19 +98,32 @@ pub trait StorageDoubleMap { } /// Generate the full key used in top storage. - fn storage_double_map_final_key(k1: KArg1, k2: KArg2) -> Vec - where + fn storage_double_map_final_key(k1: KArg1, k2: KArg2) -> Vec where KArg1: EncodeLike, KArg2: EncodeLike, { - let mut final_key = Self::storage_double_map_final_key1(k1); - final_key.extend_from_slice(k2.using_encoded(Self::Hasher2::hash).as_ref()); + let module_prefix_hashed = Twox128::hash(Self::module_prefix()); + let storage_prefix_hashed = Twox128::hash(Self::storage_prefix()); + let key1_hashed = k1.borrow().using_encoded(Self::Hasher1::hash); + let key2_hashed = k2.borrow().using_encoded(Self::Hasher2::hash); + + let mut final_key = Vec::with_capacity( + module_prefix_hashed.len() + + storage_prefix_hashed.len() + + key1_hashed.as_ref().len() + + key2_hashed.as_ref().len() + ); + + final_key.extend_from_slice(&module_prefix_hashed[..]); + final_key.extend_from_slice(&storage_prefix_hashed[..]); + final_key.extend_from_slice(key1_hashed.as_ref()); + final_key.extend_from_slice(key2_hashed.as_ref()); + final_key } } -impl storage::StorageDoubleMap for G -where +impl storage::StorageDoubleMap for G where K1: FullEncode, K2: FullEncode, V: FullCodec, @@ -102,32 +131,28 @@ where { type Query = G::Query; - fn hashed_key_for(k1: KArg1, k2: KArg2) -> Vec - where + fn hashed_key_for(k1: KArg1, k2: KArg2) -> Vec where KArg1: EncodeLike, KArg2: EncodeLike, { Self::storage_double_map_final_key(k1, k2) } - fn contains_key(k1: KArg1, k2: KArg2) -> bool - where + fn contains_key(k1: KArg1, k2: KArg2) -> bool where KArg1: EncodeLike, KArg2: EncodeLike, { unhashed::exists(&Self::storage_double_map_final_key(k1, k2)) } - fn get(k1: KArg1, k2: KArg2) -> Self::Query - where + fn get(k1: KArg1, k2: KArg2) -> Self::Query where KArg1: EncodeLike, KArg2: EncodeLike, { G::from_optional_value_to_query(unhashed::get(&Self::storage_double_map_final_key(k1, k2))) } - fn take(k1: KArg1, k2: KArg2) -> Self::Query - where + fn take(k1: KArg1, k2: KArg2) -> Self::Query where KArg1: EncodeLike, KArg2: EncodeLike, { @@ -137,8 +162,12 @@ where G::from_optional_value_to_query(value) } - fn swap(x_k1: XKArg1, x_k2: XKArg2, y_k1: YKArg1, y_k2: YKArg2) - where + fn swap( + x_k1: XKArg1, + x_k2: XKArg2, + y_k1: YKArg1, + y_k2: YKArg2 + ) where XKArg1: EncodeLike, XKArg2: EncodeLike, YKArg1: EncodeLike, @@ -160,8 +189,7 @@ where } } - fn insert(k1: KArg1, k2: KArg2, val: VArg) - where + fn insert(k1: KArg1, k2: KArg2, val: VArg) where KArg1: EncodeLike, KArg2: EncodeLike, VArg: EncodeLike, @@ -169,8 +197,7 @@ where unhashed::put(&Self::storage_double_map_final_key(k1, k2), &val.borrow()) } - fn remove(k1: KArg1, k2: KArg2) - where + fn remove(k1: KArg1, k2: KArg2) where KArg1: EncodeLike, KArg2: EncodeLike, { @@ -181,8 +208,8 @@ where unhashed::kill_prefix(Self::storage_double_map_final_key1(k1).as_ref()) } - fn iter_prefix(k1: KArg1) -> storage::PrefixIterator - where KArg1: ?Sized + EncodeLike + fn iter_prefix(k1: KArg1) -> storage::PrefixIterator where + KArg1: ?Sized + EncodeLike { let prefix = Self::storage_double_map_final_key1(k1); storage::PrefixIterator:: { @@ -192,8 +219,7 @@ where } } - fn mutate(k1: KArg1, k2: KArg2, f: F) -> R - where + fn mutate(k1: KArg1, k2: KArg2, f: F) -> R where KArg1: EncodeLike, KArg2: EncodeLike, F: FnOnce(&mut Self::Query) -> R, @@ -213,8 +239,7 @@ where k1: KArg1, k2: KArg2, items: Items, - ) -> Result<(), &'static str> - where + ) -> Result<(), &'static str> where KArg1: EncodeLike, KArg2: EncodeLike, Item: Encode, @@ -246,8 +271,7 @@ where k1: KArg1, k2: KArg2, items: Items, - ) - where + ) where KArg1: EncodeLike, KArg2: EncodeLike, Item: Encode, @@ -260,10 +284,10 @@ where .unwrap_or_else(|_| Self::insert(k1, k2, items)); } - fn decode_len(key1: KArg1, key2: KArg2) -> Result - where KArg1: EncodeLike, - KArg2: EncodeLike, - V: codec::DecodeLength + Len, + fn decode_len(key1: KArg1, key2: KArg2) -> Result where + KArg1: EncodeLike, + KArg2: EncodeLike, + V: codec::DecodeLength + Len, { let final_key = Self::storage_double_map_final_key(key1, key2); if let Some(v) = unhashed::get_raw(&final_key) { @@ -276,6 +300,135 @@ where Ok(len) } } + + fn migrate_keys< + OldHasher1: StorageHasher, + OldHasher2: StorageHasher, + KeyArg1: EncodeLike, + KeyArg2: EncodeLike, + >(key1: KeyArg1, key2: KeyArg2) -> Option { + let old_key = { + let module_prefix_hashed = Twox128::hash(Self::module_prefix()); + let storage_prefix_hashed = Twox128::hash(Self::storage_prefix()); + let key1_hashed = key1.borrow().using_encoded(OldHasher1::hash); + let key2_hashed = key2.borrow().using_encoded(OldHasher2::hash); + + let mut final_key = Vec::with_capacity( + module_prefix_hashed.len() + + storage_prefix_hashed.len() + + key1_hashed.as_ref().len() + + key2_hashed.as_ref().len() + ); + + final_key.extend_from_slice(&module_prefix_hashed[..]); + final_key.extend_from_slice(&storage_prefix_hashed[..]); + final_key.extend_from_slice(key1_hashed.as_ref()); + final_key.extend_from_slice(key2_hashed.as_ref()); + + final_key + }; + unhashed::take(old_key.as_ref()).map(|value| { + unhashed::put(Self::storage_double_map_final_key(key1, key2).as_ref(), &value); + value + }) + } +} + +/// Utility to iterate through items in a storage map. +pub struct MapIterator { + prefix: Vec, + previous_key: Vec, + drain: bool, + _phantom: ::sp_std::marker::PhantomData<(K, V, Hasher)>, +} + +impl< + K: Decode + Sized, + V: Decode + Sized, + Hasher: ReversibleStorageHasher +> Iterator for MapIterator { + type Item = (K, V); + + fn next(&mut self) -> Option<(K, V)> { + loop { + let maybe_next = sp_io::storage::next_key(&self.previous_key) + .filter(|n| n.starts_with(&self.prefix)); + break match maybe_next { + Some(next) => { + self.previous_key = next; + match unhashed::get::(&self.previous_key) { + Some(value) => { + if self.drain { + unhashed::kill(&self.previous_key) + } + let mut key_material = Hasher::reverse(&self.previous_key[self.prefix.len()..]); + match K::decode(&mut key_material) { + Ok(key) => Some((key, value)), + Err(_) => continue, + } + } + None => continue, + } + } + None => None, + } + } + } +} + +impl< + K1: FullCodec, + K2: FullCodec, + V: FullCodec, + G: StorageDoubleMap, +> storage::IterableStorageDoubleMap for G where + G::Hasher1: ReversibleStorageHasher, + G::Hasher2: ReversibleStorageHasher +{ + type Iterator = MapIterator; + + /// Enumerate all elements in the map. + fn iter(k1: impl EncodeLike) -> Self::Iterator { + let prefix = G::storage_double_map_final_key1(k1); + Self::Iterator { + prefix: prefix.clone(), + previous_key: prefix, + drain: false, + _phantom: Default::default(), + } + } + + /// Enumerate all elements in the map. + fn drain(k1: impl EncodeLike) -> Self::Iterator { + let prefix = G::storage_double_map_final_key1(k1); + Self::Iterator { + prefix: prefix.clone(), + previous_key: prefix, + drain: true, + _phantom: Default::default(), + } + } + + fn translate Option>(f: F) { + let prefix = G::prefix_hash(); + let mut previous_key = prefix.clone(); + loop { + match sp_io::storage::next_key(&previous_key).filter(|n| n.starts_with(&prefix)) { + Some(next) => { + previous_key = next; + let maybe_value = unhashed::get::(&previous_key); + match maybe_value { + Some(value) => match f(value) { + Some(new) => unhashed::put::(&previous_key, &new), + None => unhashed::kill(&previous_key), + }, + None => continue, + } + } + None => return, + } + } + } } #[cfg(test)] diff --git a/substrate/frame/support/src/storage/generator/linked_map.rs b/substrate/frame/support/src/storage/generator/linked_map.rs deleted file mode 100644 index 2d0df8fcc8..0000000000 --- a/substrate/frame/support/src/storage/generator/linked_map.rs +++ /dev/null @@ -1,499 +0,0 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate 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. - -// Substrate 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 Substrate. If not, see . - -use codec::{FullCodec, Encode, Decode, EncodeLike, Ref}; -use crate::{storage::{self, unhashed}, hash::{StorageHasher, Twox128}, traits::Len}; -use sp_std::{prelude::*, marker::PhantomData}; - -/// Generator for `StorageLinkedMap` used by `decl_storage`. -/// -/// By default final key generation rely on `KeyFormat`. -pub trait StorageLinkedMap { - /// The type that get/take returns. - type Query; - - /// The family of key formats used for this map. - type KeyFormat: KeyFormat; - - /// Convert an optional value retrieved from storage to the type queried. - fn from_optional_value_to_query(v: Option) -> Self::Query; - - /// Convert a query to an optional value into storage. - fn from_query_to_optional_value(v: Self::Query) -> Option; - - /// Generate the full key used in top storage. - fn storage_linked_map_final_key(key: KeyArg) -> Vec - where - KeyArg: EncodeLike, - { - ::storage_linked_map_final_key::(&key) - } - - /// Generate the hashed key for head - fn storage_linked_map_final_head_key() -> Vec { - ::storage_linked_map_final_head_key() - } -} - -/// A type-abstracted key format used for a family of linked-map types. -/// -/// # Default mapping of keys to a storage path -/// -/// The key for the head of the map is stored at one fixed path: -/// ```nocompile -/// Twox128(module_prefix) ++ Twox128(head_prefix) -/// ``` -/// -/// For each key, the value stored under that key is appended with a -/// [`Linkage`](struct.Linkage.html) (which hold previous and next key) at the path: -/// ```nocompile -/// Twox128(module_prefix) ++ Twox128(storage_prefix) ++ Hasher(encode(key)) -/// ``` -/// -/// Enumeration is done by getting the head of the linked map and then iterating getting the -/// value and linkage stored at the key until the found linkage has no next key. -/// -/// # Warning -/// -/// If the keys are not trusted (e.g. can be set by a user), a cryptographic `hasher` such as -/// `blake2_256` must be used. Otherwise, other values in storage can be compromised. -pub trait KeyFormat { - /// Hasher. Used for generating final key and final head key. - type Hasher: StorageHasher; - - /// Module prefix. Used for generating final key. - fn module_prefix() -> &'static [u8]; - - /// Storage prefix. Used for generating final key. - fn storage_prefix() -> &'static [u8]; - - /// Storage prefix. Used for generating final head key. - fn head_prefix() -> &'static [u8]; - - /// Generate the full key used in top storage. - fn storage_linked_map_final_key(key: &K) -> Vec - where - K: Encode, - { - let module_prefix_hashed = Twox128::hash(Self::module_prefix()); - let storage_prefix_hashed = Twox128::hash(Self::storage_prefix()); - let key_hashed = key.using_encoded(Self::Hasher::hash); - - let mut final_key = Vec::with_capacity( - module_prefix_hashed.len() + storage_prefix_hashed.len() + key_hashed.as_ref().len() - ); - - final_key.extend_from_slice(&module_prefix_hashed[..]); - final_key.extend_from_slice(&storage_prefix_hashed[..]); - final_key.extend_from_slice(key_hashed.as_ref()); - - final_key - } - - /// Generate the full key used in top storage to store the head of the linked map. - fn storage_linked_map_final_head_key() -> Vec { - [ - Twox128::hash(Self::module_prefix()), - Twox128::hash(Self::head_prefix()), - ].concat() - } -} - -/// Linkage data of an element (it's successor and predecessor) -#[derive(Encode, Decode)] -pub struct Linkage { - /// Previous element key in storage (None for the first element) - pub previous: Option, - /// Next element key in storage (None for the last element) - pub next: Option, -} - -impl Default for Linkage { - fn default() -> Self { - Self { - previous: None, - next: None, - } - } -} - -// Encode like a linkage. -#[derive(Encode)] -struct EncodeLikeLinkage, NKey: EncodeLike, Key: Encode> { - // Previous element key in storage (None for the first element) - previous: Option, - // Next element key in storage (None for the last element) - next: Option, - // The key of the linkage this type encode to - phantom: core::marker::PhantomData, -} - -/// A key-value pair iterator for enumerable map. -pub struct Enumerator { - next: Option, - _phantom: PhantomData<(V, F)>, -} - -impl Enumerator { - /// Create an explicit enumerator for testing. - #[cfg(test)] - pub fn from_head(head: K) -> Self { - Enumerator { - next: Some(head), - _phantom: Default::default(), - } - } -} - -impl Iterator for Enumerator -where - K: FullCodec, - V: FullCodec, - F: KeyFormat, -{ - type Item = (K, V); - - fn next(&mut self) -> Option { - let next = self.next.take()?; - - let (val, linkage): (V, Linkage) = { - let next_full_key = F::storage_linked_map_final_key(&next); - match read_with_linkage::(next_full_key.as_ref()) { - Some(value) => value, - None => { - // TODO #3700: error should be handleable. - runtime_print!( - "ERROR: Corrupted state: linked map {:?}{:?}: \ - next value doesn't exist at {:?}", - F::module_prefix(), F::storage_prefix(), next_full_key, - ); - return None - } - } - }; - - self.next = linkage.next; - Some((next, val)) - } -} - -/// Update linkage when this element is removed. -/// -/// Takes care of updating previous and next elements points -/// as well as updates head if the element is first or last. -fn remove_linkage(linkage: Linkage) -where - K: FullCodec, - V: FullCodec, - F: KeyFormat, -{ - let next_key = linkage.next.as_ref().map(|k| F::storage_linked_map_final_key(k)); - let prev_key = linkage.previous.as_ref().map(|k| F::storage_linked_map_final_key(k)); - - if let Some(prev_key) = prev_key { - // Retrieve previous element and update `next` - if let Some(mut res) = read_with_linkage::(prev_key.as_ref()) { - res.1.next = linkage.next; - unhashed::put(prev_key.as_ref(), &res); - } else { - // TODO #3700: error should be handleable. - runtime_print!( - "ERROR: Corrupted state: linked map {:?}{:?}: \ - previous value doesn't exist at {:?}", - F::module_prefix(), F::storage_prefix(), prev_key, - ); - } - } else { - // we were first so let's update the head - write_head::<&K, K, F>(linkage.next.as_ref()); - } - if let Some(next_key) = next_key { - // Update previous of next element - if let Some(mut res) = read_with_linkage::(next_key.as_ref()) { - res.1.previous = linkage.previous; - unhashed::put(next_key.as_ref(), &res); - } else { - // TODO #3700: error should be handleable. - runtime_print!( - "ERROR: Corrupted state: linked map {:?}{:?}: \ - next value doesn't exist at {:?}", - F::module_prefix(), F::storage_prefix(), next_key, - ); - } - } -} - -/// Read the contained data and its linkage. -pub(super) fn read_with_linkage(key: &[u8]) -> Option<(V, Linkage)> -where - K: Decode, - V: Decode, -{ - unhashed::get(key) -} - -/// Generate linkage for newly inserted element. -/// -/// Takes care of updating head and previous head's pointer. -pub(super) fn new_head_linkage(key: KeyArg) -> Linkage -where - KeyArg: EncodeLike, - K: FullCodec, - V: FullCodec, - F: KeyFormat, -{ - if let Some(head) = read_head::() { - // update previous head predecessor - { - let head_key = F::storage_linked_map_final_key(&head); - if let Some((data, linkage)) = read_with_linkage::(head_key.as_ref()) { - let new_linkage = EncodeLikeLinkage::<_, _, K> { - previous: Some(Ref::from(&key)), - next: linkage.next.as_ref(), - phantom: Default::default(), - }; - unhashed::put(head_key.as_ref(), &(data, new_linkage)); - } else { - // TODO #3700: error should be handleable. - runtime_print!( - "ERROR: Corrupted state: linked map {:?}{:?}: \ - head value doesn't exist at {:?}", - F::module_prefix(), F::storage_prefix(), head_key, - ); - // Thus we consider we are first - update the head and produce empty linkage - - write_head::<_, _, F>(Some(key)); - return Linkage::default(); - } - } - // update to current head - write_head::<_, _, F>(Some(key)); - // return linkage with pointer to previous head - let mut linkage = Linkage::default(); - linkage.next = Some(head); - linkage - } else { - // we are first - update the head and produce empty linkage - write_head::<_, _, F>(Some(key)); - Linkage::default() - } -} - -/// Read current head pointer. -pub(crate) fn read_head() -> Option -where - K: Decode, - F: KeyFormat, -{ - unhashed::get(F::storage_linked_map_final_head_key().as_ref()) -} - -/// Overwrite current head pointer. -/// -/// If `None` is given head is removed from storage. -pub(super) fn write_head(head: Option) -where - KeyArg: EncodeLike, - K: FullCodec, - F: KeyFormat, -{ - match head.as_ref() { - Some(head) => unhashed::put(F::storage_linked_map_final_head_key().as_ref(), head), - None => unhashed::kill(F::storage_linked_map_final_head_key().as_ref()), - } -} - -impl storage::StorageLinkedMap for G -where - K: FullCodec, - V: FullCodec, - G: StorageLinkedMap, -{ - type Query = G::Query; - - type Enumerator = Enumerator; - - fn contains_key>(key: KeyArg) -> bool { - unhashed::exists(Self::storage_linked_map_final_key(key).as_ref()) - } - - fn get>(key: KeyArg) -> Self::Query { - let val = unhashed::get(Self::storage_linked_map_final_key(key).as_ref()); - G::from_optional_value_to_query(val) - } - - fn swap, KeyArg2: EncodeLike>(key1: KeyArg1, key2: KeyArg2) { - let final_key1 = Self::storage_linked_map_final_key(Ref::from(&key1)); - let final_key2 = Self::storage_linked_map_final_key(Ref::from(&key2)); - let full_value_1 = read_with_linkage::(final_key1.as_ref()); - let full_value_2 = read_with_linkage::(final_key2.as_ref()); - - match (full_value_1, full_value_2) { - // Just keep linkage in order and only swap values. - (Some((value1, linkage1)), Some((value2, linkage2))) => { - unhashed::put(final_key1.as_ref(), &(value2, linkage1)); - unhashed::put(final_key2.as_ref(), &(value1, linkage2)); - } - // Remove key and insert the new one. - (Some((value, _linkage)), None) => { - Self::remove(key1); - let linkage = new_head_linkage::<_, _, V, G::KeyFormat>(key2); - unhashed::put(final_key2.as_ref(), &(value, linkage)); - } - // Remove key and insert the new one. - (None, Some((value, _linkage))) => { - Self::remove(key2); - let linkage = new_head_linkage::<_, _, V, G::KeyFormat>(key1); - unhashed::put(final_key1.as_ref(), &(value, linkage)); - } - // No-op. - (None, None) => (), - } - } - - fn insert, ValArg: EncodeLike>(key: KeyArg, val: ValArg) { - let final_key = Self::storage_linked_map_final_key(Ref::from(&key)); - let linkage = match read_with_linkage::<_, V>(final_key.as_ref()) { - // overwrite but reuse existing linkage - Some((_data, linkage)) => linkage, - // create new linkage - None => new_head_linkage::<_, _, V, G::KeyFormat>(key), - }; - unhashed::put(final_key.as_ref(), &(val, linkage)) - } - - fn remove>(key: KeyArg) { - G::take(key); - } - - fn mutate, R, F: FnOnce(&mut Self::Query) -> R>(key: KeyArg, f: F) -> R { - let final_key = Self::storage_linked_map_final_key(Ref::from(&key)); - - let (mut val, _linkage) = read_with_linkage::(final_key.as_ref()) - .map(|(data, linkage)| (G::from_optional_value_to_query(Some(data)), Some(linkage))) - .unwrap_or_else(|| (G::from_optional_value_to_query(None), None)); - - let ret = f(&mut val); - match G::from_query_to_optional_value(val) { - Some(ref val) => G::insert(key, val), - None => G::remove(key), - } - ret - } - - fn take>(key: KeyArg) -> Self::Query { - let final_key = Self::storage_linked_map_final_key(key); - - let full_value: Option<(V, Linkage)> = unhashed::take(final_key.as_ref()); - - let value = full_value.map(|(data, linkage)| { - remove_linkage::(linkage); - data - }); - - G::from_optional_value_to_query(value) - } - - fn enumerate() -> Self::Enumerator { - Enumerator::<_, _, G::KeyFormat> { - next: read_head::<_, G::KeyFormat>(), - _phantom: Default::default(), - } - } - - fn head() -> Option { - read_head::<_, G::KeyFormat>() - } - - fn decode_len>(key: KeyArg) -> Result - where V: codec::DecodeLength + Len - { - let key = Self::storage_linked_map_final_key(key); - if let Some(v) = unhashed::get_raw(key.as_ref()) { - ::len(&v).map_err(|e| e.what()) - } else { - let len = G::from_query_to_optional_value(G::from_optional_value_to_query(None)) - .map(|v| v.len()) - .unwrap_or(0); - - Ok(len) - } - } - - /// The translation happens in-place, new keys are inserted at the same time as old keys are - /// removed, thus new keys must not collide with still remaining old keys. - fn translate(translate_key: TK, translate_val: TV) -> Result<(), Option> - where K2: FullCodec + Clone, V2: Decode, TK: Fn(K2) -> K, TV: Fn(V2) -> V - { - let head_key = read_head::().ok_or(None)?; - - let mut last_key = None; - let mut current_key = head_key.clone(); - - write_head::<&K, K, G::KeyFormat>(Some(&translate_key(head_key))); - - let translate_linkage = |old: Linkage| -> Linkage { - Linkage { - previous: old.previous.map(&translate_key), - next: old.next.map(&translate_key), - } - }; - - loop { - let old_raw_key = G::KeyFormat::storage_linked_map_final_key(¤t_key); - let x = unhashed::take(old_raw_key.as_ref()); - let (val, linkage): (V2, Linkage) = match x { - Some(v) => v, - None => { - // we failed to read value and linkage. Update the last key's linkage - // to end the map early, since it's impossible to iterate further. - if let Some(last_key) = last_key { - let last_raw_key = G::storage_linked_map_final_key(&last_key); - if let Some((val, mut linkage)) - = read_with_linkage::(last_raw_key.as_ref()) - { - // defensive: should always happen, since it was just written - // in the last iteration of the loop. - linkage.next = None; - unhashed::put(last_raw_key.as_ref(), &(&val, &linkage)); - } - } - - return Err(Some(current_key)); - } - }; - let next = linkage.next.clone(); - - let val = translate_val(val); - let linkage = translate_linkage(linkage); - - // and write in the value and linkage under the new key. - let new_key = translate_key(current_key.clone()); - let new_raw_key = G::storage_linked_map_final_key(&new_key); - unhashed::put(new_raw_key.as_ref(), &(&val, &linkage)); - - match next { - None => break, - Some(next) => { - last_key = Some(new_key); - current_key = next - }, - } - } - - Ok(()) - } -} diff --git a/substrate/frame/support/src/storage/generator/map.rs b/substrate/frame/support/src/storage/generator/map.rs index 497b3fd477..c29a9a223a 100644 --- a/substrate/frame/support/src/storage/generator/map.rs +++ b/substrate/frame/support/src/storage/generator/map.rs @@ -17,8 +17,9 @@ #[cfg(not(feature = "std"))] use sp_std::prelude::*; use sp_std::borrow::Borrow; -use codec::{FullCodec, FullEncode, Encode, EncodeLike, Ref, EncodeAppend}; -use crate::{storage::{self, unhashed}, hash::{StorageHasher, Twox128}, traits::Len}; +use codec::{FullCodec, FullEncode, Decode, Encode, EncodeLike, Ref, EncodeAppend}; +use crate::{storage::{self, unhashed}, traits::Len}; +use crate::hash::{StorageHasher, Twox128, ReversibleStorageHasher}; /// Generator for `StorageMap` used by `decl_storage`. /// @@ -44,6 +45,22 @@ pub trait StorageMap { /// Storage prefix. Used for generating final key. fn storage_prefix() -> &'static [u8]; + /// The full prefix; just the hash of `module_prefix` concatenated to the hash of + /// `storage_prefix`. + fn prefix_hash() -> Vec { + let module_prefix_hashed = Twox128::hash(Self::module_prefix()); + let storage_prefix_hashed = Twox128::hash(Self::storage_prefix()); + + let mut result = Vec::with_capacity( + module_prefix_hashed.len() + storage_prefix_hashed.len() + ); + + result.extend_from_slice(&module_prefix_hashed[..]); + result.extend_from_slice(&storage_prefix_hashed[..]); + + result + } + /// Convert an optional value retrieved from storage to the type queried. fn from_optional_value_to_query(v: Option) -> Self::Query; @@ -51,8 +68,7 @@ pub trait StorageMap { fn from_query_to_optional_value(v: Self::Query) -> Option; /// Generate the full key used in top storage. - fn storage_map_final_key(key: KeyArg) -> Vec - where + fn storage_map_final_key(key: KeyArg) -> Vec where KeyArg: EncodeLike, { let module_prefix_hashed = Twox128::hash(Self::module_prefix()); @@ -71,6 +87,107 @@ pub trait StorageMap { } } +/// Utility to iterate through items in a storage map. +pub struct StorageMapIterator { + prefix: Vec, + previous_key: Vec, + drain: bool, + _phantom: ::sp_std::marker::PhantomData<(K, V, Hasher)>, +} + +impl< + K: Decode + Sized, + V: Decode + Sized, + Hasher: ReversibleStorageHasher +> Iterator for StorageMapIterator { + type Item = (K, V); + + fn next(&mut self) -> Option<(K, V)> { + loop { + let maybe_next = sp_io::storage::next_key(&self.previous_key) + .filter(|n| n.starts_with(&self.prefix)); + break match maybe_next { + Some(next) => { + self.previous_key = next; + match unhashed::get::(&self.previous_key) { + Some(value) => { + if self.drain { + unhashed::kill(&self.previous_key) + } + let mut key_material = Hasher::reverse(&self.previous_key[self.prefix.len()..]); + match K::decode(&mut key_material) { + Ok(key) => Some((key, value)), + Err(_) => continue, + } + } + None => continue, + } + } + None => None, + } + } + } +} + +impl< + K: FullCodec, + V: FullCodec, + G: StorageMap, +> storage::IterableStorageMap for G where + G::Hasher: ReversibleStorageHasher +{ + type Iterator = StorageMapIterator; + + /// Enumerate all elements in the map. + fn iter() -> Self::Iterator { + let prefix = G::prefix_hash(); + Self::Iterator { + prefix: prefix.clone(), + previous_key: prefix, + drain: false, + _phantom: Default::default(), + } + } + + /// Enumerate all elements in the map. + fn drain() -> Self::Iterator { + let prefix = G::prefix_hash(); + Self::Iterator { + prefix: prefix.clone(), + previous_key: prefix, + drain: true, + _phantom: Default::default(), + } + } + + fn translate Option>(f: F) { + let prefix = G::prefix_hash(); + let mut previous_key = prefix.clone(); + loop { + match sp_io::storage::next_key(&previous_key).filter(|n| n.starts_with(&prefix)) { + Some(next) => { + previous_key = next; + let maybe_value = unhashed::get::(&previous_key); + match maybe_value { + Some(value) => { + let mut key_material = G::Hasher::reverse(&previous_key[prefix.len()..]); + match K::decode(&mut key_material) { + Ok(key) => match f(key, value) { + Some(new) => unhashed::put::(&previous_key, &new), + None => unhashed::kill(&previous_key), + }, + Err(_) => continue, + } + } + None => continue, + } + } + None => return, + } + } + } +} + impl> storage::StorageMap for G { type Query = G::Query; @@ -228,4 +345,26 @@ impl> storage::StorageMap Ok(len) } } + + fn migrate_key>(key: KeyArg) -> Option { + let old_key = { + let module_prefix_hashed = Twox128::hash(Self::module_prefix()); + let storage_prefix_hashed = Twox128::hash(Self::storage_prefix()); + let key_hashed = key.borrow().using_encoded(OldHasher::hash); + + let mut final_key = Vec::with_capacity( + module_prefix_hashed.len() + storage_prefix_hashed.len() + key_hashed.as_ref().len() + ); + + final_key.extend_from_slice(&module_prefix_hashed[..]); + final_key.extend_from_slice(&storage_prefix_hashed[..]); + final_key.extend_from_slice(key_hashed.as_ref()); + + final_key + }; + unhashed::take(old_key.as_ref()).map(|value| { + unhashed::put(Self::storage_map_final_key(key).as_ref(), &value); + value + }) + } } diff --git a/substrate/frame/support/src/storage/generator/mod.rs b/substrate/frame/support/src/storage/generator/mod.rs index 2bee76babd..687d8a3c93 100644 --- a/substrate/frame/support/src/storage/generator/mod.rs +++ b/substrate/frame/support/src/storage/generator/mod.rs @@ -23,23 +23,20 @@ //! //! This is internal api and is subject to change. -mod linked_map; mod map; mod double_map; mod value; -pub use linked_map::{StorageLinkedMap, Enumerator, Linkage, KeyFormat as LinkedMapKeyFormat}; pub use map::StorageMap; pub use double_map::StorageDoubleMap; pub use value::StorageValue; - #[cfg(test)] #[allow(dead_code)] mod tests { use sp_io::TestExternalities; - use codec::{Encode, Decode}; - use crate::storage::{unhashed, generator::{StorageValue, StorageLinkedMap}}; + use codec::Encode; + use crate::storage::{unhashed, generator::StorageValue, IterableStorageMap}; struct Runtime {} pub trait Trait { @@ -56,16 +53,10 @@ mod tests { pub struct Module for enum Call where origin: T::Origin {} } - #[derive(Encode, Decode, Clone, Debug, Eq, PartialEq)] - struct NumberNumber { - a: u32, - b: u32, - } - crate::decl_storage! { trait Store for Module as Runtime { Value get(fn value) config(): (u64, u64); - NumberMap: linked_map hasher(blake2_256) NumberNumber => u64; + NumberMap: map hasher(identity) u32 => u64; } } @@ -89,41 +80,25 @@ mod tests { } #[test] - fn linked_map_translate_works() { - use super::linked_map::{self, Enumerator, KeyFormat}; - - type Format = >::KeyFormat; - + fn map_translate_works() { let t = GenesisConfig::default().build_storage().unwrap(); TestExternalities::new(t).execute_with(|| { // start with a map of u32 -> u32. for i in 0u32..100u32 { - let final_key = ::storage_linked_map_final_key(&i); - - let linkage = linked_map::new_head_linkage::<_, u32, u32, Format>(&i); - unhashed::put(final_key.as_ref(), &(&i, linkage)); + unhashed::put(&NumberMap::hashed_key_for(&i), &(i as u64)); } - let head = linked_map::read_head::().unwrap(); - assert_eq!( - Enumerator::::from_head(head).collect::>(), - (0..100).rev().map(|x| (x, x)).collect::>(), + NumberMap::iter().collect::>(), + (0..100).map(|x| (x as u32, x as u64)).collect::>(), ); // do translation. - NumberMap::translate( - |k: u32| NumberNumber { a: k, b: k }, - |v: u32| (v as u64) << 32 | v as u64, - ).unwrap(); + NumberMap::translate(|k: u32, v: u64| if k % 2 == 0 { Some((k as u64) << 32 | v) } else { None }); - assert!(linked_map::read_head::().is_some()); assert_eq!( - NumberMap::enumerate().collect::>(), - (0..100u32).rev().map(|x| ( - NumberNumber { a: x, b: x }, - (x as u64) << 32 | x as u64, - )).collect::>(), + NumberMap::iter().collect::>(), + (0..50u32).map(|x| x * 2).map(|x| (x, (x as u64) << 32 | x as u64)).collect::>(), ); }) } diff --git a/substrate/frame/support/src/storage/mod.rs b/substrate/frame/support/src/storage/mod.rs index e5d845cb22..efec36b540 100644 --- a/substrate/frame/support/src/storage/mod.rs +++ b/substrate/frame/support/src/storage/mod.rs @@ -202,78 +202,60 @@ pub trait StorageMap { /// function for this purpose. fn decode_len>(key: KeyArg) -> Result where V: codec::DecodeLength + Len; + + /// Migrate an item with the given `key` from a defunct `OldHasher` to the current hasher. + /// + /// If the key doesn't exist, then it's a no-op. If it does, then it returns its value. + fn migrate_key>(key: KeyArg) -> Option; + + /// Migrate an item with the given `key` from a `blake2_256` hasher to the current hasher. + /// + /// If the key doesn't exist, then it's a no-op. If it does, then it returns its value. + fn migrate_key_from_blake>(key: KeyArg) -> Option { + Self::migrate_key::(key) + } } -/// A strongly-typed linked map in storage. -/// -/// Similar to `StorageMap` but allows to enumerate other elements and doesn't implement append. -/// -/// Details on implementation can be found at -/// [`generator::StorageLinkedMap`] -pub trait StorageLinkedMap { - /// The type that get/take return. - type Query; - +/// A strongly-typed map in storage whose keys and values can be iterated over. +pub trait IterableStorageMap: StorageMap { /// The type that iterates over all `(key, value)`. - type Enumerator: Iterator; + type Iterator: Iterator; - /// Does the value (explicitly) exist in storage? - fn contains_key>(key: KeyArg) -> bool; + /// Enumerate all elements in the map in no particular order. If you alter the map while doing + /// this, you'll get undefined results. + fn iter() -> Self::Iterator; - /// Load the value associated with the given key from the map. - fn get>(key: KeyArg) -> Self::Query; + /// Remove all elements from the map and iterate through them in no particular order. If you + /// add elements to the map while doing this, you'll get undefined results. + fn drain() -> Self::Iterator; - /// Swap the values of two keys. - fn swap, KeyArg2: EncodeLike>(key1: KeyArg1, key2: KeyArg2); + /// Translate the values of all elements by a function `f`, in the map in no particular order. + /// By returning `None` from `f` for an element, you'll remove it from the map. + fn translate Option>(f: F); +} - /// Store a value to be associated with the given key from the map. - fn insert, ValArg: EncodeLike>(key: KeyArg, val: ValArg); +/// A strongly-typed double map in storage whose secondary keys and values can be iterated over. +pub trait IterableStorageDoubleMap< + K1: FullCodec, + K2: FullCodec, + V: FullCodec +>: StorageDoubleMap { + /// The type that iterates over all `(key, value)`. + type Iterator: Iterator; - /// Remove the value under a key. - fn remove>(key: KeyArg); + /// Enumerate all elements in the map with first key `k1` in no particular order. If you add or + /// remove values whose first key is `k1` to the map while doing this, you'll get undefined + /// results. + fn iter(k1: impl EncodeLike) -> Self::Iterator; - /// Mutate the value under a key. - fn mutate, R, F: FnOnce(&mut Self::Query) -> R>(key: KeyArg, f: F) -> R; + /// Remove all elements from the map with first key `k1` and iterate through them in no + /// particular order. If you add elements with first key `k1` to the map while doing this, + /// you'll get undefined results. + fn drain(k1: impl EncodeLike) -> Self::Iterator; - /// Take the value under a key. - fn take>(key: KeyArg) -> Self::Query; - - /// Return current head element. - fn head() -> Option; - - /// Enumerate all elements in the map. - fn enumerate() -> Self::Enumerator; - - /// Read the length of the value in a fast way, without decoding the entire value. - /// - /// `T` is required to implement `Codec::DecodeLength`. - /// - /// Note that `0` is returned as the default value if no encoded value exists at the given key. - /// Therefore, this function cannot be used as a sign of _existence_. use the `::contains_key()` - /// function for this purpose. - fn decode_len>(key: KeyArg) -> Result - where V: codec::DecodeLength + Len; - - /// Translate the keys and values from some previous `(K2, V2)` to the current type. - /// - /// `TK` translates keys from the old type, and `TV` translates values. - /// - /// Returns `Err` if the map could not be interpreted as the old type, and Ok if it could. - /// The `Err` contains the first key which could not be migrated, or `None` if the - /// head of the list could not be read. - /// - /// # Warning - /// - /// This function must be used with care, before being updated the storage still contains the - /// old type, thus other calls (such as `get`) will fail at decoding it. - /// - /// # Usage - /// - /// This would typically be called inside the module implementation of on_runtime_upgrade, while - /// ensuring **no usage of this storage are made before the call to `on_runtime_upgrade`**. (More - /// precisely prior initialized modules doesn't make use of this storage). - fn translate(translate_key: TK, translate_val: TV) -> Result<(), Option> - where K2: FullCodec + Clone, V2: Decode, TK: Fn(K2) -> K, TV: Fn(V2) -> V; + /// Translate the values of all elements by a function `f`, in the map in no particular order. + /// By returning `None` from `f` for an element, you'll remove it from the map. + fn translate Option>(f: F); } /// An implementation of a map with a two keys. @@ -377,6 +359,17 @@ pub trait StorageDoubleMap { KArg1: EncodeLike, KArg2: EncodeLike, V: codec::DecodeLength + Len; + + /// Migrate an item with the given `key1` and `key2` from defunct `OldHasher1` and + /// `OldHasher2` to the current hashers. + /// + /// If the key doesn't exist, then it's a no-op. If it does, then it returns its value. + fn migrate_keys< + OldHasher1: StorageHasher, + OldHasher2: StorageHasher, + KeyArg1: EncodeLike, + KeyArg2: EncodeLike, + >(key1: KeyArg1, key2: KeyArg2) -> Option; } /// Iterator for prefixed map. @@ -440,7 +433,7 @@ pub trait StoragePrefixedMap { } /// Iter over all value of the storage. - fn iter() -> PrefixIterator { + fn iter_values() -> PrefixIterator { let prefix = Self::final_prefix(); PrefixIterator { prefix: prefix.to_vec(), @@ -535,26 +528,26 @@ mod test { assert_eq!(MyStorage::final_prefix().to_vec(), k); // test iteration - assert_eq!(MyStorage::iter().collect::>(), vec![]); + assert_eq!(MyStorage::iter_values().collect::>(), vec![]); unhashed::put(&[&k[..], &vec![1][..]].concat(), &1u64); unhashed::put(&[&k[..], &vec![1, 1][..]].concat(), &2u64); unhashed::put(&[&k[..], &vec![8][..]].concat(), &3u64); unhashed::put(&[&k[..], &vec![10][..]].concat(), &4u64); - assert_eq!(MyStorage::iter().collect::>(), vec![1, 2, 3, 4]); + assert_eq!(MyStorage::iter_values().collect::>(), vec![1, 2, 3, 4]); // test removal MyStorage::remove_all(); - assert_eq!(MyStorage::iter().collect::>(), vec![]); + assert_eq!(MyStorage::iter_values().collect::>(), vec![]); // test migration unhashed::put(&[&k[..], &vec![1][..]].concat(), &1u32); unhashed::put(&[&k[..], &vec![8][..]].concat(), &2u32); - assert_eq!(MyStorage::iter().collect::>(), vec![]); + assert_eq!(MyStorage::iter_values().collect::>(), vec![]); MyStorage::translate_values(|v: u32| v as u64).unwrap(); - assert_eq!(MyStorage::iter().collect::>(), vec![1, 2]); + assert_eq!(MyStorage::iter_values().collect::>(), vec![1, 2]); MyStorage::remove_all(); // test migration 2 @@ -564,9 +557,9 @@ mod test { unhashed::put(&[&k[..], &vec![10][..]].concat(), &4u32); // (contains some value that successfully decoded to u64) - assert_eq!(MyStorage::iter().collect::>(), vec![1, 2, 3]); + assert_eq!(MyStorage::iter_values().collect::>(), vec![1, 2, 3]); assert_eq!(MyStorage::translate_values(|v: u128| v as u64), Err(2)); - assert_eq!(MyStorage::iter().collect::>(), vec![1, 3]); + assert_eq!(MyStorage::iter_values().collect::>(), vec![1, 3]); MyStorage::remove_all(); // test that other values are not modified. diff --git a/substrate/frame/support/src/traits.rs b/substrate/frame/support/src/traits.rs index 2e87629a9f..d36656a740 100644 --- a/substrate/frame/support/src/traits.rs +++ b/substrate/frame/support/src/traits.rs @@ -26,10 +26,16 @@ use sp_runtime::{ ConsensusEngineId, DispatchResult, DispatchError, traits::{MaybeSerializeDeserialize, AtLeast32Bit, Saturating, TrailingZeroInput}, }; - use crate::dispatch::Parameter; use crate::storage::StorageMap; +/// Migrate a given account. +#[impl_trait_for_tuples::impl_for_tuples(30)] +pub trait MigrateAccount { + /// Migrate the `account`. + fn migrate_account(account: &A); +} + /// An abstraction of a value stored within storage, but possibly as part of a larger composite /// item. pub trait StoredMap { diff --git a/substrate/frame/support/test/tests/decl_storage.rs b/substrate/frame/support/test/tests/decl_storage.rs index f5e3892d5f..ea9b09f9d7 100644 --- a/substrate/frame/support/test/tests/decl_storage.rs +++ b/substrate/frame/support/test/tests/decl_storage.rs @@ -37,10 +37,10 @@ mod tests { // non-getters: pub / $default /// Hello, this is doc! - U32 : Option; - pub PUBU32 : Option; - U32MYDEF : Option; - pub PUBU32MYDEF : Option; + U32: Option; + pub PUBU32: Option; + U32MYDEF: Option; + pub PUBU32MYDEF: Option; // getters: pub / $default // we need at least one type which uses T, otherwise GenesisConfig will complain. @@ -59,31 +59,23 @@ mod tests { GetOptU32WithBuilderNone get(fn opt_u32_with_builder_none) build(|_| None): Option; // map non-getters: pub / $default - MAPU32 : map hasher(blake2_256) u32 => Option; - pub PUBMAPU32 : map hasher(blake2_256) u32 => Option; - MAPU32MYDEF : map hasher(blake2_256) u32 => Option; - pub PUBMAPU32MYDEF : map hasher(blake2_256) u32 => Option; + MAPU32: map hasher(blake2_128_concat) u32 => Option; + pub PUBMAPU32: map hasher(blake2_128_concat) u32 => Option; + MAPU32MYDEF: map hasher(blake2_128_concat) u32 => Option; + pub PUBMAPU32MYDEF: map hasher(blake2_128_concat) u32 => Option; // map getters: pub / $default - GETMAPU32 get(fn map_u32_getter): map hasher(blake2_256) u32 => String; - pub PUBGETMAPU32 get(fn pub_map_u32_getter): map hasher(blake2_256) u32 => String; + GETMAPU32 get(fn map_u32_getter): map hasher(blake2_128_concat) u32 => String; + pub PUBGETMAPU32 get(fn pub_map_u32_getter): map hasher(blake2_128_concat) u32 => String; GETMAPU32MYDEF get(fn map_u32_getter_mydef): - map hasher(blake2_256) u32 => String = "map".into(); + map hasher(blake2_128_concat) u32 => String = "map".into(); pub PUBGETMAPU32MYDEF get(fn pub_map_u32_getter_mydef): - map hasher(blake2_256) u32 => String = "pubmap".into(); - - // linked map - LINKEDMAPU32 : linked_map hasher(blake2_256) u32 => Option; - pub PUBLINKEDMAPU32MYDEF : linked_map hasher(blake2_256) u32 => Option; - GETLINKEDMAPU32 get(fn linked_map_u32_getter): - linked_map hasher(blake2_256) u32 => String; - pub PUBGETLINKEDMAPU32MYDEF get(fn pub_linked_map_u32_getter_mydef): - linked_map hasher(blake2_256) u32 => String = "pubmap".into(); + map hasher(blake2_128_concat) u32 => String = "pubmap".into(); COMPLEXTYPE1: ::std::vec::Vec<::Origin>; - COMPLEXTYPE2: (Vec)>>, u32); - COMPLEXTYPE3: [u32;25]; + COMPLEXTYPE2: (Vec)>>, u32); + COMPLEXTYPE3: [u32; 25]; } add_extra_genesis { build(|_| {}); @@ -249,10 +241,10 @@ mod tests { name: DecodeDifferent::Encode("MAPU32"), modifier: StorageEntryModifier::Optional, ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), - is_linked: false, + unused: false, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructMAPU32(PhantomData::)) @@ -263,10 +255,10 @@ mod tests { name: DecodeDifferent::Encode("PUBMAPU32"), modifier: StorageEntryModifier::Optional, ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), - is_linked: false, + unused: false, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructPUBMAPU32(PhantomData::)) @@ -277,10 +269,10 @@ mod tests { name: DecodeDifferent::Encode("MAPU32MYDEF"), modifier: StorageEntryModifier::Optional, ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), - is_linked: false, + unused: false, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructMAPU32MYDEF(PhantomData::)) @@ -291,10 +283,10 @@ mod tests { name: DecodeDifferent::Encode("PUBMAPU32MYDEF"), modifier: StorageEntryModifier::Optional, ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), - is_linked: false, + unused: false, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructPUBMAPU32MYDEF(PhantomData::)) @@ -305,10 +297,10 @@ mod tests { name: DecodeDifferent::Encode("GETMAPU32"), modifier: StorageEntryModifier::Default, ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), - is_linked: false, + unused: false, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructGETMAPU32(PhantomData::)) @@ -319,10 +311,10 @@ mod tests { name: DecodeDifferent::Encode("PUBGETMAPU32"), modifier: StorageEntryModifier::Default, ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), - is_linked: false, + unused: false, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructPUBGETMAPU32(PhantomData::)) @@ -333,10 +325,10 @@ mod tests { name: DecodeDifferent::Encode("GETMAPU32MYDEF"), modifier: StorageEntryModifier::Default, ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), - is_linked: false, + unused: false, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructGETMAPU32MYDEF(PhantomData::)) @@ -347,72 +339,16 @@ mod tests { name: DecodeDifferent::Encode("PUBGETMAPU32MYDEF"), modifier: StorageEntryModifier::Default, ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Blake2_128Concat, key: DecodeDifferent::Encode("u32"), value: DecodeDifferent::Encode("String"), - is_linked: false, + unused: false, }, default: DecodeDifferent::Encode( DefaultByteGetter(&__GetByteStructPUBGETMAPU32MYDEF(PhantomData::)) ), documentation: DecodeDifferent::Encode(&[]), }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("LINKEDMAPU32"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructLINKEDMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBLINKEDMAPU32MYDEF"), - modifier: StorageEntryModifier::Optional, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBLINKEDMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("GETLINKEDMAPU32"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructGETLINKEDMAPU32(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("PUBGETLINKEDMAPU32MYDEF"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u32"), - value: DecodeDifferent::Encode("String"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter(&__GetByteStructPUBGETLINKEDMAPU32MYDEF(PhantomData::)) - ), - documentation: DecodeDifferent::Encode(&[]), - }, StorageEntryMetadata { name: DecodeDifferent::Encode("COMPLEXTYPE1"), modifier: StorageEntryModifier::Default, @@ -562,17 +498,13 @@ mod test_append_and_len { JustVecWithDefault: Vec = vec![6, 9]; OptionVec: Option>; - MapVec: map hasher(blake2_256) u32 => Vec; - MapVecWithDefault: map hasher(blake2_256) u32 => Vec = vec![6, 9]; - OptionMapVec: map hasher(blake2_256) u32 => Option>; + MapVec: map hasher(blake2_128_concat) u32 => Vec; + MapVecWithDefault: map hasher(blake2_128_concat) u32 => Vec = vec![6, 9]; + OptionMapVec: map hasher(blake2_128_concat) u32 => Option>; - DoubleMapVec: double_map hasher(blake2_256) u32, hasher(blake2_256) u32 => Vec; - DoubleMapVecWithDefault: double_map hasher(blake2_256) u32, hasher(blake2_256) u32 => Vec = vec![6, 9]; - OptionDoubleMapVec: double_map hasher(blake2_256) u32, hasher(blake2_256) u32 => Option>; - - LinkedMapVec: linked_map hasher(blake2_256) u32 => Vec; - LinkedMapVecWithDefault: linked_map hasher(blake2_256) u32 => Vec = vec![6, 9]; - OptionLinkedMapVec: linked_map hasher(blake2_256) u32 => Option>; + DoubleMapVec: double_map hasher(blake2_128_concat) u32, hasher(blake2_128_concat) u32 => Vec; + DoubleMapVecWithDefault: double_map hasher(blake2_128_concat) u32, hasher(blake2_128_concat) u32 => Vec = vec![6, 9]; + OptionDoubleMapVec: double_map hasher(blake2_128_concat) u32, hasher(blake2_128_concat) u32 => Option>; } } @@ -644,13 +576,11 @@ mod test_append_and_len { JustVec::put(&vec![1, 2, 3, 4]); OptionVec::put(&vec![1, 2, 3, 4, 5]); MapVec::insert(1, &vec![1, 2, 3, 4, 5, 6]); - LinkedMapVec::insert(2, &vec![1, 2, 3]); DoubleMapVec::insert(0, 1, &vec![1, 2]); assert_eq!(JustVec::decode_len().unwrap(), 4); assert_eq!(OptionVec::decode_len().unwrap(), 5); assert_eq!(MapVec::decode_len(1).unwrap(), 6); - assert_eq!(LinkedMapVec::decode_len(2).unwrap(), 3); assert_eq!(DoubleMapVec::decode_len(0, 1).unwrap(), 2); }); } @@ -678,16 +608,6 @@ mod test_append_and_len { assert_eq!(OptionMapVec::get(0), None); assert_eq!(OptionMapVec::decode_len(0), Ok(0)); - // linked map - assert_eq!(LinkedMapVec::get(0), vec![]); - assert_eq!(LinkedMapVec::decode_len(0), Ok(0)); - - assert_eq!(LinkedMapVecWithDefault::get(0), vec![6, 9]); - assert_eq!(LinkedMapVecWithDefault::decode_len(0), Ok(2)); - - assert_eq!(OptionLinkedMapVec::get(0), None); - assert_eq!(OptionLinkedMapVec::decode_len(0), Ok(0)); - // Double map assert_eq!(DoubleMapVec::get(0, 0), vec![]); assert_eq!(DoubleMapVec::decode_len(0, 1), Ok(0)); diff --git a/substrate/frame/support/test/tests/final_keys.rs b/substrate/frame/support/test/tests/final_keys.rs index e604038f4e..ae23c5a64c 100644 --- a/substrate/frame/support/test/tests/final_keys.rs +++ b/substrate/frame/support/test/tests/final_keys.rs @@ -16,8 +16,8 @@ use frame_support::storage::unhashed; use codec::Encode; -use frame_support::{StorageDoubleMap, StorageLinkedMap, StorageMap, StorageValue, StoragePrefixedMap}; -use sp_io::{TestExternalities, hashing::{twox_128, blake2_128, blake2_256}}; +use frame_support::{StorageDoubleMap, StorageMap, StorageValue, StoragePrefixedMap}; +use sp_io::{TestExternalities, hashing::{twox_64, twox_128, blake2_128}}; mod no_instance { use codec::{Encode, Decode, EncodeLike}; @@ -35,18 +35,15 @@ mod no_instance { trait Store for Module as FinalKeysNone { pub Value config(value): u32; - pub Map: map hasher(blake2_256) u32 => u32; - pub Map2: map hasher(twox_128) u32 => u32; + pub Map: map hasher(blake2_128_concat) u32 => u32; + pub Map2: map hasher(twox_64_concat) u32 => u32; - pub LinkedMap: linked_map hasher(blake2_256) u32 => u32; - pub LinkedMap2: linked_map hasher(twox_128) u32 => u32; - - pub DoubleMap: double_map hasher(blake2_256) u32, hasher(blake2_256) u32 => u32; - pub DoubleMap2: double_map hasher(twox_128) u32, hasher(blake2_128) u32 => u32; + pub DoubleMap: double_map hasher(blake2_128_concat) u32, hasher(blake2_128_concat) u32 => u32; + pub DoubleMap2: double_map hasher(twox_64_concat) u32, hasher(twox_64_concat) u32 => u32; pub TestGenericValue get(fn test_generic_value) config(): Option; pub TestGenericDoubleMap get(fn foo2) config(test_generic_double_map): - double_map hasher(blake2_256) u32, hasher(blake2_256) T::BlockNumber => Option; + double_map hasher(blake2_128_concat) u32, hasher(blake2_128_concat) T::BlockNumber => Option; } } } @@ -65,18 +62,15 @@ mod instance { { pub Value config(value): u32; - pub Map: map hasher(blake2_256) u32 => u32; - pub Map2: map hasher(twox_128) u32 => u32; + pub Map: map hasher(blake2_128_concat) u32 => u32; + pub Map2: map hasher(twox_64_concat) u32 => u32; - pub LinkedMap: linked_map hasher(blake2_256) u32 => u32; - pub LinkedMap2: linked_map hasher(twox_128) u32 => u32; - - pub DoubleMap: double_map hasher(blake2_256) u32, hasher(blake2_256) u32 => u32; - pub DoubleMap2: double_map hasher(twox_128) u32, hasher(blake2_128) u32 => u32; + pub DoubleMap: double_map hasher(blake2_128_concat) u32, hasher(blake2_128_concat) u32 => u32; + pub DoubleMap2: double_map hasher(twox_64_concat) u32, hasher(twox_64_concat) u32 => u32; pub TestGenericValue get(fn test_generic_value) config(): Option; pub TestGenericDoubleMap get(fn foo2) config(test_generic_double_map): - double_map hasher(blake2_256) u32, hasher(blake2_256) T::BlockNumber => Option; + double_map hasher(blake2_128_concat) u32, hasher(blake2_128_concat) T::BlockNumber => Option; } add_extra_genesis { // See `decl_storage` limitation. @@ -85,6 +79,18 @@ mod instance { } } +fn twox_64_concat(d: &[u8]) -> Vec { + let mut v = twox_64(d).to_vec(); + v.extend_from_slice(d); + v +} + +fn blake2_128_concat(d: &[u8]) -> Vec { + let mut v = blake2_128(d).to_vec(); + v.extend_from_slice(d); + v +} + #[test] fn final_keys_no_instance() { TestExternalities::default().execute_with(|| { @@ -94,41 +100,27 @@ fn final_keys_no_instance() { no_instance::Map::insert(1, 2); let mut k = [twox_128(b"FinalKeysNone"), twox_128(b"Map")].concat(); - k.extend(1u32.using_encoded(blake2_256).to_vec()); + k.extend(1u32.using_encoded(blake2_128_concat)); assert_eq!(unhashed::get::(&k), Some(2u32)); assert_eq!(&k[..32], &::final_prefix()); no_instance::Map2::insert(1, 2); let mut k = [twox_128(b"FinalKeysNone"), twox_128(b"Map2")].concat(); - k.extend(1u32.using_encoded(twox_128).to_vec()); + k.extend(1u32.using_encoded(twox_64_concat)); assert_eq!(unhashed::get::(&k), Some(2u32)); assert_eq!(&k[..32], &::final_prefix()); - let head = [twox_128(b"FinalKeysNone"), twox_128(b"HeadOfLinkedMap")].concat(); - assert_eq!(unhashed::get::(&head), None); - - no_instance::LinkedMap::insert(1, 2); - let mut k = [twox_128(b"FinalKeysNone"), twox_128(b"LinkedMap")].concat(); - k.extend(1u32.using_encoded(blake2_256).to_vec()); - assert_eq!(unhashed::get::(&k), Some(2u32)); - assert_eq!(unhashed::get::(&head), Some(1u32)); - - no_instance::LinkedMap2::insert(1, 2); - let mut k = [twox_128(b"FinalKeysNone"), twox_128(b"LinkedMap2")].concat(); - k.extend(1u32.using_encoded(twox_128).to_vec()); - assert_eq!(unhashed::get::(&k), Some(2u32)); - no_instance::DoubleMap::insert(&1, &2, &3); let mut k = [twox_128(b"FinalKeysNone"), twox_128(b"DoubleMap")].concat(); - k.extend(1u32.using_encoded(blake2_256).to_vec()); - k.extend(2u32.using_encoded(blake2_256).to_vec()); + k.extend(1u32.using_encoded(blake2_128_concat)); + k.extend(2u32.using_encoded(blake2_128_concat)); assert_eq!(unhashed::get::(&k), Some(3u32)); assert_eq!(&k[..32], &::final_prefix()); no_instance::DoubleMap2::insert(&1, &2, &3); let mut k = [twox_128(b"FinalKeysNone"), twox_128(b"DoubleMap2")].concat(); - k.extend(1u32.using_encoded(twox_128).to_vec()); - k.extend(2u32.using_encoded(blake2_128).to_vec()); + k.extend(1u32.using_encoded(twox_64_concat)); + k.extend(2u32.using_encoded(twox_64_concat)); assert_eq!(unhashed::get::(&k), Some(3u32)); assert_eq!(&k[..32], &::final_prefix()); }); @@ -143,41 +135,27 @@ fn final_keys_default_instance() { >::insert(1, 2); let mut k = [twox_128(b"FinalKeysSome"), twox_128(b"Map")].concat(); - k.extend(1u32.using_encoded(blake2_256).to_vec()); + k.extend(1u32.using_encoded(blake2_128_concat)); assert_eq!(unhashed::get::(&k), Some(2u32)); assert_eq!(&k[..32], &>::final_prefix()); >::insert(1, 2); let mut k = [twox_128(b"FinalKeysSome"), twox_128(b"Map2")].concat(); - k.extend(1u32.using_encoded(twox_128).to_vec()); + k.extend(1u32.using_encoded(twox_64_concat)); assert_eq!(unhashed::get::(&k), Some(2u32)); assert_eq!(&k[..32], &>::final_prefix()); - let head = [twox_128(b"FinalKeysSome"), twox_128(b"HeadOfLinkedMap")].concat(); - assert_eq!(unhashed::get::(&head), None); - - >::insert(1, 2); - let mut k = [twox_128(b"FinalKeysSome"), twox_128(b"LinkedMap")].concat(); - k.extend(1u32.using_encoded(blake2_256).to_vec()); - assert_eq!(unhashed::get::(&k), Some(2u32)); - assert_eq!(unhashed::get::(&head), Some(1u32)); - - >::insert(1, 2); - let mut k = [twox_128(b"FinalKeysSome"), twox_128(b"LinkedMap2")].concat(); - k.extend(1u32.using_encoded(twox_128).to_vec()); - assert_eq!(unhashed::get::(&k), Some(2u32)); - >::insert(&1, &2, &3); let mut k = [twox_128(b"FinalKeysSome"), twox_128(b"DoubleMap")].concat(); - k.extend(1u32.using_encoded(blake2_256).to_vec()); - k.extend(2u32.using_encoded(blake2_256).to_vec()); + k.extend(1u32.using_encoded(blake2_128_concat)); + k.extend(2u32.using_encoded(blake2_128_concat)); assert_eq!(unhashed::get::(&k), Some(3u32)); assert_eq!(&k[..32], &>::final_prefix()); >::insert(&1, &2, &3); let mut k = [twox_128(b"FinalKeysSome"), twox_128(b"DoubleMap2")].concat(); - k.extend(1u32.using_encoded(twox_128).to_vec()); - k.extend(2u32.using_encoded(blake2_128).to_vec()); + k.extend(1u32.using_encoded(twox_64_concat)); + k.extend(2u32.using_encoded(twox_64_concat)); assert_eq!(unhashed::get::(&k), Some(3u32)); assert_eq!(&k[..32], &>::final_prefix()); }); @@ -192,41 +170,27 @@ fn final_keys_instance_2() { >::insert(1, 2); let mut k = [twox_128(b"Instance2FinalKeysSome"), twox_128(b"Map")].concat(); - k.extend(1u32.using_encoded(blake2_256).to_vec()); + k.extend(1u32.using_encoded(blake2_128_concat)); assert_eq!(unhashed::get::(&k), Some(2u32)); assert_eq!(&k[..32], &>::final_prefix()); >::insert(1, 2); let mut k = [twox_128(b"Instance2FinalKeysSome"), twox_128(b"Map2")].concat(); - k.extend(1u32.using_encoded(twox_128).to_vec()); + k.extend(1u32.using_encoded(twox_64_concat)); assert_eq!(unhashed::get::(&k), Some(2u32)); assert_eq!(&k[..32], &>::final_prefix()); - let head = [twox_128(b"Instance2FinalKeysSome"), twox_128(b"HeadOfLinkedMap")].concat(); - assert_eq!(unhashed::get::(&head), None); - - >::insert(1, 2); - let mut k = [twox_128(b"Instance2FinalKeysSome"), twox_128(b"LinkedMap")].concat(); - k.extend(1u32.using_encoded(blake2_256).to_vec()); - assert_eq!(unhashed::get::(&k), Some(2u32)); - assert_eq!(unhashed::get::(&head), Some(1u32)); - - >::insert(1, 2); - let mut k = [twox_128(b"Instance2FinalKeysSome"), twox_128(b"LinkedMap2")].concat(); - k.extend(1u32.using_encoded(twox_128).to_vec()); - assert_eq!(unhashed::get::(&k), Some(2u32)); - >::insert(&1, &2, &3); let mut k = [twox_128(b"Instance2FinalKeysSome"), twox_128(b"DoubleMap")].concat(); - k.extend(1u32.using_encoded(blake2_256).to_vec()); - k.extend(2u32.using_encoded(blake2_256).to_vec()); + k.extend(1u32.using_encoded(blake2_128_concat)); + k.extend(2u32.using_encoded(blake2_128_concat)); assert_eq!(unhashed::get::(&k), Some(3u32)); assert_eq!(&k[..32], &>::final_prefix()); >::insert(&1, &2, &3); let mut k = [twox_128(b"Instance2FinalKeysSome"), twox_128(b"DoubleMap2")].concat(); - k.extend(1u32.using_encoded(twox_128).to_vec()); - k.extend(2u32.using_encoded(blake2_128).to_vec()); + k.extend(1u32.using_encoded(twox_64_concat)); + k.extend(2u32.using_encoded(twox_64_concat)); assert_eq!(unhashed::get::(&k), Some(3u32)); assert_eq!(&k[..32], &>::final_prefix()); }); diff --git a/substrate/frame/support/test/tests/genesisconfig.rs b/substrate/frame/support/test/tests/genesisconfig.rs index 5a5ab9d1db..bccffb7374 100644 --- a/substrate/frame/support/test/tests/genesisconfig.rs +++ b/substrate/frame/support/test/tests/genesisconfig.rs @@ -25,7 +25,7 @@ frame_support::decl_module! { frame_support::decl_storage! { trait Store for Module as Test { - pub AppendableDM config(t): double_map hasher(blake2_256) u32, hasher(blake2_256) T::BlockNumber => Vec; + pub AppendableDM config(t): double_map hasher(identity) u32, hasher(identity) T::BlockNumber => Vec; } } diff --git a/substrate/frame/support/test/tests/instance.rs b/substrate/frame/support/test/tests/instance.rs index 6fa2806dd3..92281ef131 100644 --- a/substrate/frame/support/test/tests/instance.rs +++ b/substrate/frame/support/test/tests/instance.rs @@ -23,7 +23,7 @@ use frame_support::{ DecodeDifferent, StorageMetadata, StorageEntryModifier, StorageEntryType, DefaultByteGetter, StorageEntryMetadata, StorageHasher, }, - StorageValue, StorageMap, StorageLinkedMap, StorageDoubleMap, + StorageValue, StorageMap, StorageDoubleMap, }; use sp_inherents::{ProvideInherent, InherentData, InherentIdentifier, MakeFatalError}; use sp_core::{H256, sr25519}; @@ -67,8 +67,7 @@ mod module1 { T::BlockNumber: From + std::fmt::Display { pub Value config(value): T::GenericType; - pub Map: map hasher(blake2_256) u32 => u64; - pub LinkedMap: linked_map hasher(blake2_256) u32 => u64; + pub Map: map hasher(identity) u32 => u64; } add_extra_genesis { @@ -136,9 +135,8 @@ mod module2 { frame_support::decl_storage! { trait Store for Module, I: Instance=DefaultInstance> as Module2 { pub Value config(value): T::Amount; - pub Map config(map): map hasher(blake2_256) u64 => u64; - pub LinkedMap config(linked_map): linked_map hasher(blake2_256) u64 => Vec; - pub DoubleMap config(double_map): double_map hasher(blake2_256) u64, hasher(blake2_256) u64 => u64; + pub Map config(map): map hasher(identity) u64 => u64; + pub DoubleMap config(double_map): double_map hasher(identity) u64, hasher(identity) u64 => u64; } } @@ -285,13 +283,11 @@ fn new_test_ext() -> sp_io::TestExternalities { module2: Some(module2::GenesisConfig { value: 4, map: vec![(0, 0)], - linked_map: vec![(0, vec![0])], double_map: vec![(0, 0, 0)], }), module2_Instance1: Some(module2::GenesisConfig { value: 4, map: vec![(0, 0)], - linked_map: vec![(0, vec![0])], double_map: vec![(0, 0, 0)], }), module2_Instance2: None, @@ -314,17 +310,13 @@ fn storage_instance_independence() { module2::Map::::insert(0, 0); module2::Map::::insert(0, 0); module2::Map::::insert(0, 0); - module2::LinkedMap::::insert::<_, Vec>(0, vec![]); - module2::LinkedMap::::insert::<_, Vec>(0, vec![]); - module2::LinkedMap::::insert::<_, Vec>(0, vec![]); - module2::LinkedMap::::insert::<_, Vec>(0, vec![]); module2::DoubleMap::::insert(&0, &0, &0); module2::DoubleMap::::insert(&0, &0, &0); module2::DoubleMap::::insert(&0, &0, &0); module2::DoubleMap::::insert(&0, &0, &0); }); - // 16 storage values + 4 linked_map head. - assert_eq!(storage.top.len(), 16 + 4); + // 12 storage values. + assert_eq!(storage.top.len(), 12); } #[test] @@ -332,7 +324,6 @@ fn storage_with_instance_basic_operation() { new_test_ext().execute_with(|| { type Value = module2::Value; type Map = module2::Map; - type LinkedMap = module2::LinkedMap; type DoubleMap = module2::DoubleMap; assert_eq!(Value::exists(), true); @@ -360,26 +351,6 @@ fn storage_with_instance_basic_operation() { assert_eq!(Map::contains_key(key), false); assert_eq!(Map::get(key), 0); - assert_eq!(LinkedMap::contains_key(0), true); - assert_eq!(LinkedMap::contains_key(key), false); - LinkedMap::insert(key, vec![1]); - assert_eq!(LinkedMap::enumerate().count(), 2); - assert_eq!(LinkedMap::get(key), vec![1]); - assert_eq!(LinkedMap::take(key), vec![1]); - assert_eq!(LinkedMap::enumerate().count(), 1); - assert_eq!(LinkedMap::get(key), vec![]); - LinkedMap::mutate(key, |a| *a=vec![2]); - assert_eq!(LinkedMap::enumerate().count(), 2); - assert_eq!(LinkedMap::get(key), vec![2]); - LinkedMap::remove(key); - assert_eq!(LinkedMap::enumerate().count(), 1); - assert_eq!(LinkedMap::contains_key(key), false); - assert_eq!(LinkedMap::get(key), vec![]); - assert_eq!(LinkedMap::contains_key(key), false); - assert_eq!(LinkedMap::enumerate().count(), 1); - LinkedMap::insert(key, &vec![1]); - assert_eq!(LinkedMap::enumerate().count(), 2); - let key1 = 1; let key2 = 1; assert_eq!(DoubleMap::contains_key(&0, &0), true); @@ -416,10 +387,10 @@ const EXPECTED_METADATA: StorageMetadata = StorageMetadata { name: DecodeDifferent::Encode("Map"), modifier: StorageEntryModifier::Default, ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Identity, key: DecodeDifferent::Encode("u64"), value: DecodeDifferent::Encode("u64"), - is_linked: false, + unused: false, }, default: DecodeDifferent::Encode( DefaultByteGetter( @@ -430,30 +401,12 @@ const EXPECTED_METADATA: StorageMetadata = StorageMetadata { ), documentation: DecodeDifferent::Encode(&[]), }, - StorageEntryMetadata { - name: DecodeDifferent::Encode("LinkedMap"), - modifier: StorageEntryModifier::Default, - ty: StorageEntryType::Map { - hasher: StorageHasher::Blake2_256, - key: DecodeDifferent::Encode("u64"), - value: DecodeDifferent::Encode("Vec"), - is_linked: true, - }, - default: DecodeDifferent::Encode( - DefaultByteGetter( - &module2::__GetByteStructLinkedMap( - std::marker::PhantomData::<(Runtime, module2::Instance2)> - ) - ) - ), - documentation: DecodeDifferent::Encode(&[]), - }, StorageEntryMetadata { name: DecodeDifferent::Encode("DoubleMap"), modifier: StorageEntryModifier::Default, ty: StorageEntryType::DoubleMap { - hasher: StorageHasher::Blake2_256, - key2_hasher: StorageHasher::Blake2_256, + hasher: StorageHasher::Identity, + key2_hasher: StorageHasher::Identity, key1: DecodeDifferent::Encode("u64"), key2: DecodeDifferent::Encode("u64"), value: DecodeDifferent::Encode("u64"), diff --git a/substrate/frame/support/test/tests/issue2219.rs b/substrate/frame/support/test/tests/issue2219.rs index 4537766981..8d8152a5ad 100644 --- a/substrate/frame/support/test/tests/issue2219.rs +++ b/substrate/frame/support/test/tests/issue2219.rs @@ -109,7 +109,7 @@ mod module { } else { vec![] } - }): map hasher(blake2_256) Role => Option>; + }): map hasher(blake2_128_concat) Role => Option>; /// the roles members can enter into pub AvailableRoles get(fn available_roles) build(|config: &GenesisConfig| { @@ -125,11 +125,11 @@ mod module { /// actor accounts associated with a role pub AccountIdsByRole get(fn account_ids_by_role): - map hasher(blake2_256) Role => Vec; + map hasher(blake2_128_concat) Role => Vec; /// tokens locked until given block number pub Bondage get(fn bondage): - map hasher(blake2_256) T::AccountId => T::BlockNumber; + map hasher(blake2_128_concat) T::AccountId => T::BlockNumber; /// First step before enter a role is registering intent with a new account/key. /// This is done by sending a role_entry_request() from the new account. diff --git a/substrate/frame/system/benches/bench.rs b/substrate/frame/system/benches/bench.rs index 90a4ad1d34..03243bbfc4 100644 --- a/substrate/frame/system/benches/bench.rs +++ b/substrate/frame/system/benches/bench.rs @@ -77,7 +77,7 @@ impl system::Trait for Runtime { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/system/src/accounts.scale b/substrate/frame/system/src/accounts.scale new file mode 100644 index 0000000000000000000000000000000000000000..bfd7e6277f20c53ceb1d664235bb6af18ec538ed GIT binary patch literal 181794 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 BWLch^Byz8quu88lkI}kJ;m1n0hl& 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 e#8CsHht3(extrinsics: &[E]) -> H::Output { @@ -221,6 +222,9 @@ pub trait Trait: 'static + Eq + Clone { /// /// All resources should be cleaned up associated with the given account. type OnKilledAccount: OnKilledAccount; + + /// Migrate an account. + type MigrateAccount: MigrateAccount; } pub type DigestOf = generic::Digest<::Hash>; @@ -337,10 +341,8 @@ impl From for LastRuntimeUpgradeInfo { decl_storage! { trait Store for Module as System { /// The full account information for a particular account ID. - // TODO: should be hasher(twox64_concat) - will need staged migration - // https://github.com/paritytech/substrate/issues/4917 pub Account get(fn account): - map hasher(blake2_256) T::AccountId => AccountInfo; + map hasher(blake2_128_concat) T::AccountId => AccountInfo; /// Total extrinsics count for the current block. ExtrinsicCount: Option; @@ -352,10 +354,8 @@ decl_storage! { AllExtrinsicsLen: Option; /// Map of block numbers to block hashes. - // TODO: should be hasher(twox64_concat) - will need one-off migration - // https://github.com/paritytech/substrate/issues/4917 pub BlockHash get(fn block_hash) build(|_| vec![(T::BlockNumber::zero(), hash69())]): - map hasher(blake2_256) T::BlockNumber => T::Hash; + map hasher(twox_64_concat) T::BlockNumber => T::Hash; /// Extrinsics data for the current block (maps an extrinsic's index to its data). ExtrinsicData get(fn extrinsic_data): map hasher(twox_64_concat) u32 => Vec; @@ -393,7 +393,7 @@ decl_storage! { /// The value has the type `(T::BlockNumber, EventIndex)` because if we used only just /// the `EventIndex` then in case if the topic has the same contents on the next block /// no notification will be triggered thus the event might be lost. - EventTopics get(fn event_topics): map hasher(blake2_256) T::Hash => Vec<(T::BlockNumber, EventIndex)>; + EventTopics get(fn event_topics): map hasher(blake2_128_concat) T::Hash => Vec<(T::BlockNumber, EventIndex)>; /// Stores the `spec_version` and `spec_name` of when the last runtime upgrade happened. pub LastRuntimeUpgrade build(|_| Some(LastRuntimeUpgradeInfo::from(T::Version::get()))): Option; @@ -452,7 +452,7 @@ decl_error! { /// Suicide called when the account has non-default composite data. NonDefaultComposite, /// There is a non-zero reference count preventing the account from being purged. - NonZeroRefCount + NonZeroRefCount, } } @@ -460,6 +460,15 @@ decl_module! { pub struct Module for enum Call where origin: T::Origin { type Error = Error; + fn on_runtime_upgrade() { + migration::migrate::(); + + // Remove the old `RuntimeUpgraded` storage entry. + let mut runtime_upgraded_key = sp_io::hashing::twox_128(b"System").to_vec(); + runtime_upgraded_key.extend(&sp_io::hashing::twox_128(b"RuntimeUpgraded")); + sp_io::storage::clear(&runtime_upgraded_key); + } + /// A dispatch that will fill the block weight up to the given ratio. // TODO: This should only be available for testing, rather than in general usage, but // that's not possible at present (since it's within the decl_module macro). @@ -569,11 +578,19 @@ decl_module! { Account::::remove(who); } - fn on_runtime_upgrade() { - // Remove the old `RuntimeUpgraded` storage entry. - let mut runtime_upgraded_key = sp_io::hashing::twox_128(b"System").to_vec(); - runtime_upgraded_key.extend(&sp_io::hashing::twox_128(b"RuntimeUpgraded")); - sp_io::storage::clear(&runtime_upgraded_key); + #[weight = FunctionOf( + |(accounts,): (&Vec,)| accounts.len() as u32 * 10_000, + DispatchClass::Normal, + true, + )] + fn migrate_accounts(origin, accounts: Vec) { + let _ = ensure_signed(origin)?; + for a in &accounts { + if Account::::migrate_key_from_blake(a).is_some() { + // Inform other modules about the account. + T::MigrateAccount::migrate_account(a); + } + } } } } @@ -1553,7 +1570,7 @@ mod tests { type Version = Version; type ModuleToIndex = (); type AccountData = u32; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = RecordKilled; } diff --git a/substrate/frame/system/src/migration.rs b/substrate/frame/system/src/migration.rs new file mode 100644 index 0000000000..ece389f4f8 --- /dev/null +++ b/substrate/frame/system/src/migration.rs @@ -0,0 +1,37 @@ +use super::*; +use sp_runtime::traits::SaturatedConversion; + +pub fn migrate() { + // Number is current block - we obviously don't know that hash. + // Number - 1 is the parent block, who hash we record in this block, but then that's already + // with the new storage so we don't migrate it. + // Number - 2 is therefore the most recent block's hash that needs migrating. + if Number::::get() > One::one() { + sp_runtime::print("Migrating BlockHash..."); + BlockHash::::migrate_key_from_blake(T::BlockNumber::zero()); + let mut n = Number::::get() - One::one() - One::one(); + while !n.is_zero() { + sp_runtime::print(n.saturated_into::()); + if BlockHash::::migrate_key_from_blake(n).is_none() { + break; + } + n -= One::one(); + } + } + + sp_runtime::print("Migrating Accounts..."); + let mut count = 0u32; + if let Ok(accounts) = Vec::::decode(&mut &include_bytes!("accounts.scale")[..]) { + for a in &accounts { + if Account::::migrate_key_from_blake(a).is_some() { + // Inform other modules about the account. + T::MigrateAccount::migrate_account(a); + count += 1; + if count % 1000 == 0 { + sp_runtime::print(count); + } + } + } + } + sp_runtime::print(count); +} diff --git a/substrate/frame/timestamp/src/lib.rs b/substrate/frame/timestamp/src/lib.rs index 2a37dfdddb..18e3be877b 100644 --- a/substrate/frame/timestamp/src/lib.rs +++ b/substrate/frame/timestamp/src/lib.rs @@ -278,7 +278,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } parameter_types! { diff --git a/substrate/frame/transaction-payment/src/lib.rs b/substrate/frame/transaction-payment/src/lib.rs index 3a1239630f..0306e74edb 100644 --- a/substrate/frame/transaction-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/src/lib.rs @@ -48,8 +48,6 @@ use sp_runtime::{ }; use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; -mod migration; - type Multiplier = Fixed64; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; @@ -97,10 +95,6 @@ decl_module! { *fm = T::FeeMultiplierUpdate::convert(*fm) }); } - - fn on_runtime_upgrade() { - migration::on_runtime_upgrade() - } } } @@ -316,7 +310,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/frame/transaction-payment/src/migration.rs b/substrate/frame/transaction-payment/src/migration.rs deleted file mode 100644 index 6db3cfd0f9..0000000000 --- a/substrate/frame/transaction-payment/src/migration.rs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate 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. - -// Substrate 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 Substrate. If not, see . - -//! Migration code to update storage. - -use super::*; -use frame_support::storage::migration::{put_storage_value, take_storage_value}; - -pub fn on_runtime_upgrade() { - change_name_balances_to_transaction_payment() -} - -// Change the storage name used by this pallet from `Balances` to `TransactionPayment`. -// -// Since the format of the storage items themselves have not changed, we do not -// need to keep track of a storage version. If the runtime does not need to be -// upgraded, nothing here will happen anyway. - -fn change_name_balances_to_transaction_payment() { - sp_runtime::print("Migrating Transaction Payment."); - - if let Some(next_fee_multiplier) = take_storage_value::(b"Balances", b"NextFeeMultiplier", &[]) { - put_storage_value(b"TransactionPayment", b"NextFeeMultiplier", &[], next_fee_multiplier); - } -} diff --git a/substrate/frame/treasury/src/lib.rs b/substrate/frame/treasury/src/lib.rs index bbf31cc599..72f9c508ca 100644 --- a/substrate/frame/treasury/src/lib.rs +++ b/substrate/frame/treasury/src/lib.rs @@ -200,7 +200,9 @@ decl_storage! { ProposalCount get(fn proposal_count): ProposalIndex; /// Proposals that have been made. - Proposals get(fn proposals): map hasher(blake2_256) ProposalIndex => Option>>; + Proposals get(fn proposals): + map hasher(twox_64_concat) ProposalIndex + => Option>>; /// Proposal indices that have been approved but not yet awarded. Approvals get(fn approvals): Vec; @@ -208,12 +210,13 @@ decl_storage! { /// Tips that are not yet completed. Keyed by the hash of `(reason, who)` from the value. /// This has the insecure enumerable hash function since the key itself is already /// guaranteed to be a secure hash. - pub Tips get(fn tips): map hasher(twox_64_concat) T::Hash + pub Tips get(fn tips): + map hasher(twox_64_concat) T::Hash => Option, T::BlockNumber, T::Hash>>; /// Simple preimage lookup from the reason's hash to the original data. Again, has an /// insecure enumerable hash since the key is guaranteed to be the result of a secure hash. - pub Reasons get(fn reasons): map hasher(twox_64_concat) T::Hash => Option>; + pub Reasons get(fn reasons): map hasher(identity) T::Hash => Option>; } add_extra_genesis { build(|_config| { @@ -280,8 +283,22 @@ decl_error! { } } +mod migration { + use super::*; + pub fn migrate() { + for i in 0..ProposalCount::get() { + Proposals::::migrate_key_from_blake(i); + } + Reasons::::remove_all(); + } +} + decl_module! { pub struct Module for enum Call where origin: T::Origin { + fn on_runtime_upgrade() { + migration::migrate::(); + } + /// Fraction of a proposal's value that should be bonded in order to place the proposal. /// An accepted proposal gets these back. A rejected proposal does not. const ProposalBond: Permill = T::ProposalBond::get(); @@ -759,7 +776,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } parameter_types! { diff --git a/substrate/frame/utility/src/lib.rs b/substrate/frame/utility/src/lib.rs index 0b60532c3d..6ecaadab37 100644 --- a/substrate/frame/utility/src/lib.rs +++ b/substrate/frame/utility/src/lib.rs @@ -623,7 +623,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } parameter_types! { diff --git a/substrate/frame/vesting/src/lib.rs b/substrate/frame/vesting/src/lib.rs index e7d0bd3c18..0b670de3b4 100644 --- a/substrate/frame/vesting/src/lib.rs +++ b/substrate/frame/vesting/src/lib.rs @@ -53,10 +53,7 @@ use sp_runtime::{DispatchResult, RuntimeDebug, traits::{ StaticLookup, Zero, AtLeast32Bit, MaybeSerializeDeserialize, Convert }}; use frame_support::{decl_module, decl_event, decl_storage, decl_error, ensure}; -use frame_support::traits::{ - Currency, LockableCurrency, VestingSchedule, WithdrawReason, LockIdentifier, ExistenceRequirement, - Get, -}; +use frame_support::traits::{Currency, LockableCurrency, VestingSchedule, WithdrawReason, LockIdentifier, ExistenceRequirement, Get, MigrateAccount}; use frame_support::weights::SimpleDispatchInfo; use frame_system::{self as system, ensure_signed}; @@ -118,7 +115,8 @@ decl_storage! { trait Store for Module as Vesting { /// Information regarding the vesting of a given account. pub Vesting get(fn vesting): - map hasher(blake2_256) T::AccountId => Option, T::BlockNumber>>; + map hasher(blake2_128_concat) T::AccountId + => Option, T::BlockNumber>>; } add_extra_genesis { config(vesting): Vec<(T::AccountId, T::BlockNumber, T::BlockNumber, BalanceOf)>; @@ -256,6 +254,12 @@ decl_module! { } } +impl MigrateAccount for Module { + fn migrate_account(a: &T::AccountId) { + Vesting::::migrate_key_from_blake(a); + } +} + impl Module { /// (Re)set or remove the module's currency lock on `who`'s account in accordance with their /// current unvested amount. @@ -384,7 +388,7 @@ mod tests { type Version = (); type ModuleToIndex = (); type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } impl pallet_balances::Trait for Test { diff --git a/substrate/test-utils/runtime/src/lib.rs b/substrate/test-utils/runtime/src/lib.rs index 59955cce48..bc5e0070eb 100644 --- a/substrate/test-utils/runtime/src/lib.rs +++ b/substrate/test-utils/runtime/src/lib.rs @@ -391,7 +391,7 @@ impl frame_system::Trait for Runtime { type Version = (); type ModuleToIndex = (); type AccountData = (); - type OnNewAccount = (); + type MigrateAccount = (); type OnNewAccount = (); type OnKilledAccount = (); } diff --git a/substrate/test-utils/runtime/src/system.rs b/substrate/test-utils/runtime/src/system.rs index d8790d5317..c35850ae95 100644 --- a/substrate/test-utils/runtime/src/system.rs +++ b/substrate/test-utils/runtime/src/system.rs @@ -46,7 +46,7 @@ decl_module! { decl_storage! { trait Store for Module as TestRuntime { - ExtrinsicData: map hasher(blake2_256) u32 => Vec; + ExtrinsicData: map hasher(blake2_128_concat) u32 => Vec; // The current block number being processed. Set by `execute_block`. Number get(fn number): Option; ParentHash get(fn parent_hash): Hash; diff --git a/substrate/utils/frame/rpc/support/src/lib.rs b/substrate/utils/frame/rpc/support/src/lib.rs index 42c10fb2cc..118f5709a6 100644 --- a/substrate/utils/frame/rpc/support/src/lib.rs +++ b/substrate/utils/frame/rpc/support/src/lib.rs @@ -25,7 +25,7 @@ use jsonrpc_client_transports::RpcError; use codec::{DecodeAll, FullCodec, FullEncode}; use serde::{de::DeserializeOwned, Serialize}; use frame_support::storage::generator::{ - StorageDoubleMap, StorageLinkedMap, StorageMap, StorageValue + StorageDoubleMap, StorageMap, StorageValue }; use sp_storage::{StorageData, StorageKey}; use sc_rpc_api::state::StateClient; @@ -63,9 +63,9 @@ use sc_rpc_api::state::StateClient; /// decl_storage! { /// trait Store for Module as TestRuntime { /// pub LastActionId: u64; -/// pub Voxels: map hasher(blake2_256) Loc => Block; -/// pub Actions: linked_map hasher(blake2_256) u64 => Loc; -/// pub Prefab: double_map hasher(blake2_256) u128, hasher(blake2_256) (i8, i8, i8) => Block; +/// pub Voxels: map hasher(blake2_128_concat) Loc => Block; +/// pub Actions: map hasher(blake2_128_concat) u64 => Loc; +/// pub Prefab: double_map hasher(blake2_128_concat) u128, hasher(blake2_128_concat) (i8, i8, i8) => Block; /// } /// } /// @@ -79,7 +79,7 @@ use sc_rpc_api::state::StateClient; /// let q = StorageQuery::map::((0, 0, 0)); /// let _: Option = q.get(&cl, None).await?; /// -/// let q = StorageQuery::linked_map::(12); +/// let q = StorageQuery::map::(12); /// let _: Option = q.get(&cl, None).await?; /// /// let q = StorageQuery::double_map::(3, (0, 0, 0)); @@ -111,14 +111,6 @@ impl StorageQuery { } } - /// Create a storage query for a value in a StorageLinkedMap. - pub fn linked_map, K: FullCodec>(key: K) -> Self { - Self { - key: StorageKey(St::storage_linked_map_final_key(key)), - _spook: PhantomData, - } - } - /// Create a storage query for a value in a StorageDoubleMap. pub fn double_map, K1: FullEncode, K2: FullEncode>( key1: K1,